Questions tagged «debugging»

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

21
在代码中留下故意的错误以供测试人员查找
我们在公司没有这样做,但是我的一位朋友说他的项目经理要求每个开发人员在产品进行质量检查之前添加故意的错误。它是这样工作的: 在产品进行质量检查之前,开发团队在代码中的随机位置添加了一些故意的错误。他们适当地备份了原始的有效代码,以确保最终产品没有附带这些错误。 测试人员也将被告知这一点。因此,他们将进行艰苦的测试,因为他们知道存在错误,并且未找到它们可能被认为是能力不足的标志。 如果发现错误(故意的或其他),则将报告它们,以供开发团队修复。然后,在产品进入第二级质量保证之前,开发团队会在代码的相关部分中添加另一个故意的错误。项目经理说,测试人员应该像开发人员那样思考,并且他/她应该在进行更改的部分中期待新的错误。 好吧,这是怎么回事。他们说这种方法具有以下优点。 测试人员将始终保持警惕,他们将疯狂地进行测试。这可以帮助他们发现隐藏的(非故意的)错误,以便开发人员可以对其进行修复。 测试人员以错误为食。找不到任何错误会影响他们的士气。因此,给他们一个容易找到的人会帮助他们的士气。 如果您忽略了最终产品附带这些故意错误之一的情况,那么在考虑采用这种方法之前,我们还应考虑哪些其他缺陷? 一些说明: 他们在源代码管理中正确备份了原始代码。 当测试人员发现故意的错误时,开发团队将忽略它。如果测试人员发现了非故意(原始)错误,则开发团队首先检查该错误是否由任何故意的错误引起。也就是说,开发团队首先尝试在原始工作代码上重现该代码,并尝试对其进行修复。 只需忽略质量检查和开发团队之间的关系问题。我是在程序员而不是在工作场所上专门问这个问题的。考虑到质量保证和开发团队之间的融洽关系,他们在下班后聚会。项目经理是一位很好的老绅士,他随时准备支持两个团队(Godsend)。

9
我更改了一种方法签名,现在有25,000多个错误。现在怎么办?
我最近开始了新工作,正在处理一个非常大的应用程序(15M loc)。在我之前的工作中,我们有一个类似的大型应用程序,但是(不管是好是坏)我们使用OSGi,这意味着该应用程序被分解为许多微服务,这些微服务可以独立地更改,编译和部署。新的应用程序只是一个大型代码库,可能包含几个.dll。 所以我需要更改此类的界面,因为这是老板要求我执行的操作。最初,他们在编写时就采用了一些假设,但并不能很好地概括其概论,并且有一段时间以来,他们一直在避免重构问题,因为它是如此紧密地耦合在一起。我更改了界面,现在有25000多个错误。有些错误是在具有重要发音的类(如“ XYZPriceCalculator”)中重新产生的不应该打破。但是在解决所有错误之前,我无法启动应用程序来检查其是否正常运行。而且许多单元测试要么直接引用该接口,要么耦合到引用该接口的基类,因此,仅对其进行修复本身就是一项巨大的任务。另外,我真的不知道所有这些部分是如何组合在一起的,因此即使我可以开始学习,但我真的不知道如果事情破裂了会是什么样。 在上一份工作中,我从未真正遇到过这样的问题。我该怎么办?

16
有什么方法可以更快地解决错误吗?我刚刚受到老板的警告[关闭]
我的老板刚刚告诉我,我将在星期一收到负面的绩效评估。他想和我谈谈为什么我这么慢,为什么我的错误修复率这么低。 我喜欢编程和解决问题,但实际上确实发现我的工作真的很辛苦。 实际上,我已经当了10年程序员。但这是我的第一个多线程嵌入式linux工作-我已经在这里工作了2年,对每个人来说,我仍然在努力挣扎。而且我认为我已经变得如此沮丧和边缘化,以至于我失去了工作之初的很多热情。 有没有人遇到过类似的情况?如何提高错误修复率? 更新:我进行了审查。我参加了一个为期3个月的“员工发展计划”(Dunk提到的那种)。不知道我是否可以解决这个问题。但是,即使我必须继续前进,我也从这次经历中学到了很多东西。 另一个更新 自第一次审核以来,大约有6周。我对面临同样情况的任何人的建议是要谦虚接受批评并从错误中吸取教训。并且不要害怕看起来愚蠢。提出很多问题。让人们知道您正在尝试学习,并不断询问直到您理解为止。但是要做好准备,使其不起作用。我正在构建代码组合……并尽力而为。 另一个更新 我很犹豫,在这里,因为我担心我无法将未来的雇主介绍给我的stackoverflow个人资料...但是,无论如何,有人读这个问题可能很有趣,但是我却真的迷失了我几周前的工作。我正在重新学习所需的所有技能-我从这里提供的建议中学到了很多。

21
避免使用调试器有什么好处?
在我的职业生涯中,我注意到一些开发人员不使用调试工具,而是对错误代码进行抽查以找出问题所在。 虽然很多时候无需调试器就能快速找到代码错误是一项很好的技能,但是当调试器很容易发现诸如错字之类的小错误时,花费大量时间查找问题似乎效率不高。 如果没有调试器,是否可以管理复杂系统?这是明智的吗?使用“ 心理调试 ” 有什么好处?
101 debugging 

17
在诊断和修复缺陷之前坚持重现每个缺陷是否合理?
我在一家软件产品公司工作。我们拥有实施我们产品的大型企业客户,我们为他们提供支持。例如,如果有缺陷,我们会提供补丁等。换句话说,这是一个非常典型的设置。 最近,针对客户在日志文件中发现的与我方产品的集群实现中的并发数据库访问有关的异常,已发出并分配了票证给我。因此,此客户的特定配置对于此错误的发生可能很关键。我们从客户那里得到的只是他们的日志文件。 我向我的团队建议的方法是尝试在类似于客户的配置设置中重现该错误并获得可比的日志。但是,他们不同意我的方法,即我不需要重现该错误,因为该错误过于耗时,并且需要在VM上模拟服务器集群。我的团队建议我只是“遵循代码”以查看线程和/或事务不安全代码的位置,然后将更改放入简单的本地开发工作中,而不是像发生事件的环境那样的集群实现错误的来源。 对我来说,要制定一个抽象的蓝图(程序代码)而不是一个有形的,可见的表现形式(运行时再现)似乎很困难,所以我想问一个普遍的问题: 在诊断和修复缺陷之前坚持重现每个缺陷并对其进行调试是否合理? 要么: 如果我是高级开发人员,我是否应该能够阅读多线程代码并对其在所有用例场景中的工作情况有一个清晰的了解,而不是需要运行应用程序,亲自测试不同的用例场景并逐步完成代码一行一行?还是我对这种工作环境的要求很差? 调试sissies吗? 我认为,响应事故单提交的任何修复程序都应在模拟的环境中进行测试,该环境应尽可能接近原始环境。您还怎么知道它将真正解决该问题?这就像发布一款新车型时一样,没有用假人对它进行碰撞测试即可证明安全气囊确实有效。 最后但并非最不重要的一点,如果您同意我的看法: 我应该如何与我的团队交谈,以说服他们我的方法是合理,保守和防弹的?

9
没有IDE,如何调试?[关闭]
每当我寻找一个IDE时(目前我正在修补Go),我都会发现很多人在推荐Vi,Emacs,Notepad ++等。 我从未在IDE之外进行任何开发;我想我已经被宠坏了。在没有IDE的情况下如何调试?您是否仅限于记录?
61 ide  debugging 


5
为什么很少使用反向调试?[关闭]
gdb 在2009年(使用gdb 7.0)中实现了对反向调试的支持。直到2012年我才听说过它。现在,我发现它对于某些类型的调试问题非常有用。我希望我以前听说过。 如果我错了,请纠正我,但我的印象是该技术仍然很少使用,并且大多数人都不知道它存在。为什么? 您是否知道在任何编程社区中普遍使用反向调试? 背景资料: Stackoverflow:反向调试如何工作? gdb使用术语“反向调试”,但是其他供应商使用其他术语来表示相同或相似的技术: Microsoft将其称为IntelliTrace或“历史调试” 有一个称为Omniscient Debugger的Java反向调试器,尽管它可能不再在Java 6中工作 还有其他Java反向调试器 OCaml的调试器(ocamldebug)将其称为时间旅行
56 debugging 

10
如何测试测试?
我们测试代码以使其更正确(实际上,不正确的可能性较小)。但是,测试也是代码-它们也可能包含错误。而且,如果您的测试有错误,则很难使您的代码变得更好。 我可以想到测试中三种可能的错误类型: 逻辑错误,当程序员误解了手头的任务,并且测试按照他认为应该做的事情进行时,这是错误的; 基础测试框架中的错误(例如,泄漏的模拟抽象); 测试中的错误:测试的执行与程序员认为的稍有不同。 类型(1)错误似乎无法防止(除非程序员只是……变得更聪明)。但是,(2)和(3)可能很容易处理。您如何处理这些类型的错误?您有什么特殊策略可以避免它们吗?例如,您是否编写了一些特殊的“空”测试,仅检查测试作者的预设?此外,您如何调试已损坏的测试用例?

17
如何检查或评估一个人的调试技能?[关闭]
什么样的技能确定一个能够轻松调试代码的人?前一段时间,我的朋友接受了一个相对优秀的程序员的采访。程序员被录用了。他可以编写出色的代码,了解框架和设计模式。他缺少的是调试技能。他根本无法调试,发现他或别人的代码有问题对他来说是巨大的痛苦。 从那时起,我们一直在思考如何评估或估计一个人的调试技能。 因此,第一个问题是:哪些技能可以确定一个人是否可以有效调试软件? 第二:面试中如何测试这些技能?

7
软件测试方法是否依赖有缺陷的数据?
在软件工程中众所周知的一个事实是,修复漏洞的成本在发现漏洞的开发后期呈指数增长。这由Code Complete中发布的数据支持,并已在许多其他出版物中进行了修改。 但是,事实证明该数据从未存在过。Code Complete引用的数据显然没有显示出这样的成本/开发时间相关性,而相似的已发布表格仅在某些特殊情况下显示了相关性,而在其他特殊情况下则显示了平坦的曲线(即成本没有增加)。 是否有任何独立数据可以证实或反驳? 并且如果为真(即,如果根本没有数据可以为后来发现的错误提供成倍的成倍的成本支持),那么这对软件开发方法有何影响?

11
并发性:如何处理设计和调试实现?
我已经开发并发系统已有好几年了,尽管我缺乏正规的培训(即没有学位),但我对这个主题掌握得很好。最近至少有一些新的语言变得流行起来,这些语言至少是为了简化并发而设计的,例如Erlang和Go。似乎他们的并发方法呼应了我自己的经验,即如何使系统具有可伸缩性并利用多个内核/处理器/机器。 但是,我发现很少有工具可以帮助您可视化您打算做什么,并可以验证您至少与最初的设想接近。使用非专为并发设计的语言(例如C / C ++,C#,Java等),调试并发代码可能是一场噩梦。特别是,几乎不可能在开发环境中的一个系统上重新创建容易发生的条件。 那么,您设计系统来处理并发和并行处理的方法是什么?例子: 您如何确定可以同时进行的和必须进行顺序的? 您如何重现错误条件并查看应用程序执行时发生的情况? 您如何可视化应用程序的不同并发部分之间的交互? 对于这些问题,我有自己的答案,但我还想了解更多。 编辑 到目前为止,我们有很多不错的建议。链接到的许多文章都非常好,我已经阅读了其中的一些文章。 我在并发编程方面的个人经历使我相信与顺序编程相比,您需要不同的思维方式。精神鸿沟可能与面向对象编程和过程编程之间的差异一样大。我希望这组问题更多地集中在系统地解决问题所必需的思维过程(即理论)上。提供更具体的答案时,有助于举例说明-您亲自进行了一些研究。 赏金目标 不要告诉我该怎么办。我已经控制住了。告诉我你做什么。告诉我您如何解决这些问题。

8
应该将调试代码保留在原处,始终保留还是仅在调试时才添加,而在发现错误后才删除?
首先,我只在尝试查找错误时才添加调试代码(例如print语句)。找到后,我将删除调试代码(并添加一个专门测试该错误的测试用例)。我觉得它使真实的代码混乱不堪,因此除非进行调试,否则就没有地方了。 你怎么做呢?您是否将调试代码保留在适当的位置,或者在过时删除调试代码(可能难以确定调试代码的时间)?
35 debugging 

9
可能写太多的断言吗?
我非常喜欢assert用C ++代码编写检查,以此来捕获开发过程中由于程序中的逻辑错误而无法发生但确实会发生的情况。通常,这是一个好习惯。 但是,我注意到,我编写的某些函数(属于复杂类的一部分)具有5个以上的断言,就可读性和可维护性而言,这似乎可能是一种不良的编程习惯。我认为它仍然很棒,因为每个人都需要我考虑函数的前置条件和后置条件,它们确实有助于捕获错误。但是,我只是想把它放在那儿,以问在需要进行大量检查的情况下,是否存在更好的范例来捕获逻辑错误。 Emacs注释:由于Emacs是我的首选IDE,因此我将它的assert语句略显灰色,这有助于减少它们可以提供的混乱感。这是我添加到.emacs文件中的内容: ; gray out the "assert(...)" wrapper (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<\\(assert\(.*\);\\)" 1 '(:foreground "#444444") t))))) ; gray out the stuff inside parenthesis with a slightly lighter color (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<assert\\(\(.*\);\\)" 1 '(:foreground "#666666") t)))))

8
如何最有效地调试代码?[关闭]
可以将爬入代码中的错误减至最少,但在编写时不能完全消除-程序员是程序员,尽管许多人会不同意,但这只是人类。 当我们确实在代码中检测到错误时,该怎么做才能将其清除?我们应该如何处理它,以最有效地利用我们的宝贵时间,使我们花更少的时间去寻找它,而花费更多的时间进行编码?另外,调试时应该避免什么? 请注意,此处我们并不是在谈论防止错误;我们正在谈论出现错误时该怎么办。我知道这是一个广阔的领域,可能高度依赖语言,平台和工具。如果是这样,请保持涵盖心态和一般方法之类的答案。
33 debugging 

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.