Questions tagged «debugging»

调试是在程序运行时检查程序状态的过程,通常使用调试工具进行检查,并尝试查找导致程序异常运行的错误。

4
用Java处理调试输出的正确方法是什么?
随着我目前的Java项目变得越来越大,我感到同样需要在代码的多点插入调试输出。 为了适当地启用或禁用此功能,具体取决于测试会话的打开或关闭,我通常private static final boolean DEBUG = false在测试要检查的类的开头放置a ,然后以这种方式简单地使用它(例如): public MyClass { private static final boolean DEBUG = false; ... some code ... public void myMethod(String s) { if (DEBUG) { System.out.println(s); } } } 等等。 但这并不能使我感到高兴,因为它当然有效,但是如果您不仅仅盯着其中的几个,可能会有太多的类将DEBUG设置为true。 相反,我(就像-我认为-许多其他人一样)不希望将整个应用程序置于调试模式,因为输出的文本数量可能很庞大。 那么,有没有一种正确的方法来处理这种情况,或者最正确的方法是使用DEBUG类成员?



3
“诱骗”功能或故意错误的术语是什么?[关闭]
我忘记了programming语编程术语。这是故意的错误或诱骗功能,可分散注意力。用法示例,“今天质量检查人员,嘿,鲍勃(QA)正在审查。将a $THING放到模块中,这样他们实际上很难找到问题”。 可以否定地使用它,因为它有一个非常明显的故意缺陷,可发现它是对实际问题的干扰。 这也可以肯定地使用。就像您在搜寻灾区时总是让救援犬“找到”受害者一样。它也可以用来验证质量检查流程是否确实存在缺陷。 我要寻找的术语是什么?

10
为什么新程序员似乎忽略编译器错误消息/运行时异常消息?[关闭]
我认为我们都已经看到了。初学者在堆栈溢出问题上遵循基本概述... 我正在尝试做(对目标的描述非常模糊),但它不起作用/我收到错误/异常。请帮忙! 如此多的人似乎认为没有必要粘贴错误消息是不是很奇怪? 我不知道这是什么心理。错误消息是什么使人们最初认为他们没有用并且不值得关注? 我要寻找的答案不是 “他们不理解错误消息”。这并不能解释为什么他们不考虑告诉其他可能理解的人。

7
将返回值的计算和return语句拆分为单行方法?
我曾与一位同事讨论过如何中断一条return语句以及该语句在两行中计算返回值。 例如 private string GetFormattedValue() { var formattedString = format != null ? string.Format(format, value) : value.ToString(); return formattedString; } 代替 private string GetFormattedValue() { return format != null ? string.Format(format, value) : value.ToString(); } 在代码方面,我在第一个变量中看不到任何值。对我来说,后者更清晰,尤其是对于较短的方法。他的论点是,前一种变体更易于调试-这是一个很小的优点,因为当由于断点而停止执行时,VisualStudio允许我们对语句进行非常详细的检查。 我的问题是,是否仍然需要编写不太清晰的代码,只是为了使调试一目了然?拆分计算和语句后,该变体还有其他参数return吗?

2
如何调试JSP?
我正在尝试为项目编辑JSP,并且在从服务器请求JSP时,我在NSP的某个位置获取了NullPointerException。 我的Web服务器(JBoss)报告了异常,但它给了我一个虚假的行号。据报告,异常发生在第702行,但是我的JSP只有146行长,因此我无法确定哪个行阻塞了。 有什么好的技术可以调试JSP中的错误?我正在使用IntelliJ 9 Ultimate作为我的IDE。 谢谢
26 java  ide  debugging  jsp  intellij 

7
调试死锁时您会寻找什么?
最近,我一直在从事大量使用线程的项目。我认为我可以设计它们。尽可能使用无状态设计,锁定对一个线程以上需求的所有资源的访问,等等。我在函数式编程中的经验对此提供了极大的帮助。 但是,在阅读别人的线程代码时,我会感到困惑。我现在正在调试死锁,并且由于编码样式和设计与我的个人风格不同,因此我很难看到潜在的死锁情况。 调试死锁时您会寻找什么?

3
如何诊断异步/等待死锁?
我正在使用大量使用异步/等待的新代码库。我团队中的大多数人对于异步/等待也是相当陌生的。我们通常倾向于遵循Microsoft指定的最佳实践,但是通常需要我们的上下文来传递异步调用并使用不支持的库ConfigureAwait(false)。 结合所有这些内容,我们每周都会遇到文章中描述的异步死锁。它们不会在单元测试期间显示,因为我们的模拟数据源(通常通过Task.FromResult)不足以触发死锁。因此,在运行时或集成测试期间,某些服务调用只会吃到午餐,再也不会返回。那会杀死服务器,并且通常使事情变得一团糟。 问题在于,要跟踪错误的出处(通常只是一直不完全同步),通常涉及手动代码检查,这很耗时且无法自动化。 诊断死锁的更好方法是什么?
24 c#  debugging  async 

13
成为更好的错误修复程序
我喜欢成为一名程序员。在那里,我说了。但是,话虽如此,我最近才意识到我真的无法忍受错误修复。完全没有 实际上,在开发某些东西时,我的生产率非常高。即使编写单元测试和对开发进行自我测试,我通常还是非常有生产力的。我可以集中精力,并且可以完成任务。 但是,当质量检查时间到了并且我正在修复错误时,我的灵感得到了巨大的喘息。我必须采取非常极端的措施(例如,高BPM音乐,过量的咖啡因等)强迫自己完成所有工作。我的工作通常涉及到进入现有的大型项目并添加新功能或修复错误,因此我无法确切地告诉雇主我需要几个星期才能为他们的所有代码编写单元测试:)另外,我们经常使用的服务器技术对于单元测试和集成测试都是非常禁止的,因为它存在很多Java类加载器问题。我并不完全反对错误修复,有时它可能很有趣,但是一点也不有趣 当您必须进行细微更改并等待30秒到3分钟才能查看它们是否起作用时(由于系统的工作方式)。 修正错误时,如何提高工作效率和动力?这是大多数程序员处理的吗?

16
调试技能对成为一名优秀的程序员重要吗?
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 除其他素质外,程序员还需要良好的调试技能吗?如果我的申请人无法在给定的程序中发现错误,但能够解决所有难题和程序,我是否应该考虑他的工作? 编辑:-难题是正常的红色,蓝色和红蓝色的球一样。程序就像在数组中找到连续的k个零。调试程序由于条件而失败,该条件应为> =,而是>。一切都在纸上。
24 debugging 

5
调试内存损坏
首先,我确实意识到这不是一个具有绝对答案的完美的问与答风格的问题,但是我想不出任何措辞来使它更好地工作。我认为没有绝对的解决方案,这就是为什么我将其发布在此处而不是Stack Overflow的原因之一。 在过去的一个月中,我一直在重写相当旧的服务器代码(mmorpg),以使其更加现代,并且易于扩展/修改。我从网络部分开始,并实现了一个第三方库(libevent)来为我处理事务。通过所有的重构和代码更改,我在某个地方引入了内存损坏,而我一直在努力寻找发生错误的地方。 我似乎无法在我的开发/测试环境中可靠地重现它,即使实现原始机器人来模拟某些负载时,我也不会再崩溃(我修复了会导致某些问题的libevent问题) 到目前为止,我已经尝试过: 摆脱困境-直到事情崩溃(可能需要1天以上的生产时间或仅仅一个小时)崩溃之前,我才真正感到困惑,这之前肯定没有无效的写入,肯定在某个时候它将访问无效的内存并且不会覆盖内容机会?(是否可以“扩展”地址范围?) 代码分析工具,即coverage和cppcheck。尽管他们确实指出了代码中的一些.nastiness和边缘情况,但没有什么严重的。 记录该过程,直到它与gdb崩溃(通过undodb),然后以反向方式工作。/ sounds /这样的声音应该是可行的,但是我要么通过使用自动完成功能最终导致gdb崩溃,要么由于一些可能的分支(一个损坏导致另一个损坏,因此导致内部迷失)在内部libevent结构中丢失上)。我想如果能看到指针最初属于/分配指针的地方,那将消除大多数分支问题,那就太好了。但是我无法使用undodb运行valgrind,而且我正常的gdb记录的速度实在太慢了(如果甚至可以与valgrind结合使用)。 代码审查!我自己(彻底)并让一些朋友来检查我的代码,尽管我怀疑它是否足够彻底。我当时在考虑也许要雇用一名开发人员与我一起进行一些代码审查/调试,但是我付不起太多钱,而且我也不知道该去哪里寻找愿意为小工作而工作的人-如果他没有找到问题或根本没有资格,那就不要钱。 我还应该指出:我通常会得到一致的回溯。在某些地方发生崩溃,主要与套接字类以某种方式损坏有关。它是指向不是套接字的东西的无效指针,还是套接字类本身被乱码覆盖(部分?)。尽管我怀疑它在那里崩溃最多,因为那是最常用的部分之一,因此它是第一个被使用的损坏的内存。 总而言之,这个问题使我忙了将近2个月(无论是开还是关,都是一个业余项目),这确实让我感到沮丧,以至于我变得脾气暴躁,并想放弃。我只是想不出我应该怎么做才能发现问题。 我错过了任何有用的技术吗?你怎么处理那件事呢?(这可能不那么普遍,因为没有太多相关信息。或者我真的是盲人?) 编辑: 一些重要的规格: 通过gcc 4.7使用c ++(11)(版本由debian wheezy提供) 代码库大约有15万行 编辑以回复david.pfx帖子:(抱歉响应缓慢) 您是否在仔细记录崩溃情况以寻找模式? 是的,我仍然遗漏了最近发生的崩溃事件 几个地方真的很相似吗?用什么方式? 好吧,在最新版本中(每当我添加/删除代码或更改相关结构时,它们似乎都会改变),它总是会陷入项目计时器方法中。基本上,一个项目有一个特定的时间,在该时间之后,它会过期,并将更新的信息发送给客户端。无效的套接字指针将在Player类中(据我所知仍然有效),大部分与此有关。在正常关闭后,我还将在清理阶段遇到大量崩溃,该崩溃将破坏所有未明确破坏的静态类(__run_exit_handlers在回溯中)。大多数情况下只涉及std::map一个类,但猜测这只是第一件事。 损坏的数据是什么样的?零?Ascii?模式? 我还没有找到任何模式,对我来说似乎有点随机。很难说,因为我不知道腐败从哪里开始。 它与堆有关吗? 这完全与堆有关(我启用了gcc的堆栈保护,但没有捕获任何东西)。 腐败发生在a之后free()吗? 您将不得不对此进行详细说明。您是说要让已经释放的对象指向周围吗?一旦对象被销毁,我会将每个引用都设置为null,所以除非我在某处错过了东西,否则不行。那应该在valgrind中显示出来,但是没有。 网络流量是否有与众不同的东西(缓冲区大小,恢复周期)? 网络流量由原始数据组成。因此,对于更复杂的事物,使用char数组,(u)intX_t或packed(以除去填充)结构,每个数据包都有一个标头,该标头由id和数据包大小本身组成,并针对预期大小进行了验证。它们大约为10-60字节,最大的(内部“启动”数据包,在启动时触发一次)大小为几Mb。 大量的生产断言。在损坏蔓延之前及早地发生崩溃。 我曾经有一次与std::map腐败相关的崩溃,每个实体都有其“视图”的地图,每个实体都可以看到它,反之亦然。我在前面和后面添加了200byte的缓冲区,将其填充为0x33,并在每次访问之前对其进行了检查。腐败刚刚消失了,我必须搬走一些东西使它腐败了。 战略性日志记录,因此您可以准确地知道之前发生了什么。当您更接近答案时,将其添加到日志记录中。 它的工作..扩展。 无奈之下,您可以保存状态并自动重启吗?我可以想到一些实现此目的的生产软件。 我有点做。该软件由一个主要的“高速缓存”进程和一些其他工作进程组成,它们均访问高速缓存以获取并保存内容。因此,每次崩溃我都不会失去太多进展,它仍然会断开所有用户的连接,依此类推,这绝对不是解决方案。 并发:线程,竞争条件等 有一个mysql线程可以执行“异步”查询,尽管这一切都未曾动过,并且仅通过具有所有锁定功能的函数才与数据库类共享信息。 中断 有一个中断计时器可以阻止它锁定,如果它在30秒内没有完成一个周期,它只会中止运行,但是该代码应该是安全的: if (!tics) { abort(); } else …
23 c++  debugging  memory 


5
他们如何在受保护的内存之前调试分段错误?
现在,当我用C中的指针犯了一个编程错误时,我遇到了一个很好的分段错误,程序崩溃了,调试器甚至可以告诉我哪里出错了。 在没有内存保护的情况下,他们是如何做到的?我可以看到一个DOS程序员在弄错时摆弄着他,并使整个操作系统崩溃。虚拟化不可用,因此他所能做的就是重新启动并重试。真的那样吗?

5
数据库表何时应使用时间戳记?
首先要注意的是,我认为这个问题可能属于数据库交换,但我认为它总体上与编程解决方案有关,而不是与数据库有关。如果人们认为那是最好的,它将转向数据库交换。 我想知道何时在数据库表中添加创建和更新的时间戳? 第一个明显的答案是,如果任何业务逻辑需要知道什么时候进行了更新(例如事务完成日期等),则必须将其输入。 但是非业务逻辑案例呢?例如,我可以想到这样的场景:了解行更改的日期时间以帮助进行故障查找是非常有用的,例如某些业务逻辑发生故障并查看相关的数据库行,从而有可能在更新之前确定一行正在更新导致错误的另一行。 在这种用例下,给每个表一个更新并创建时间戳是有意义的(也许最琐碎的枚举表可能不会被应用程序的任何部分更新)。 为每个表提供时间戳肯定是快速停顿数据库的好方法(尽管可能是错误的)。 那么什么时候数据库表应该使用创建和更新时间戳?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.