我知道有许多受欢迎且有用的设计图片。
调试方案有类似的东西吗?也许不是模式,而是分类的方法,可以针对类似情况重复使用。
答案 0 :(得分:11)
我将添加一个看起来相当明显的调试模式,但还没有说过:
将错误减少到最小的情况,然后将其用作任何建议修复的单元测试。
答案 1 :(得分:8)
以下是一些适合我的方法:
答案 2 :(得分:7)
我同意其他人关于单元测试作为防止错误的“模式”。另外我想引用Debugging: The 9 Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems中的以下步骤:
答案 3 :(得分:5)
当我在黑暗调试中拍摄时,我采用二分搜索方法。我将我的一半代码或一半方法注释掉,沿着这些方向,然后我专注于未注释的一半。如果问题仍然存在,我会评论另一半。等等。
答案 4 :(得分:5)
我的方法是使用科学方法:
答案 5 :(得分:5)
如果您有一段曾经工作的代码,现在出现错误和完整版本历史记录,那么通过历史记录进行二进制搜索会非常有用。您在工作提交和非工作提交之间选择一个点,然后编译并测试。如果该提交显示错误,你知道它是从这里或更早开始的,所以你回到这里和已知的良好提交中间并再次测试;否则,你知道错误是在以后开始的,所以你要在这里和已知的错误提交之间中途前进,并在那里进行测试。你继续关注这个过程,直到你发现哪个提交引入了bug,然后你看看发生了什么变化,这个问题很有可能是显而易见的。
git bisect是一个非常出色的工具。但理论上你可以用一堆tarball做同样的事情,如果这就是你所拥有的。
当然,如果错误多次进出树,这将无效。如果您的提交不是非常精细,那么它可能不会非常有用。
答案 6 :(得分:4)
我喜欢认为单元测试是一种调试模式。如果您可以重现该问题,您可以编写单元测试以使其更容易调试。
一旦您进行了用于调试问题的“顶级”单元测试,您总是可以在代码中以较低和较低级别创建更多失败单元测试,以帮助您在添加单元测试时专注于错误这对你的项目来说是长期有用的。
答案 7 :(得分:3)
故障隔离就是其中之一。问题是在所有操作系统上发生的,还是只与一个操作系统有关?
继续二分法确定问题的位置和原因。
答案 8 :(得分:3)
我调试的方式是我解决问题的方式。我使用cartesian方法。
有4 rules:
或者说differently:
您只需在编程环境中调整这些规则。
如果我不得不恢复,我会说问题/错误是它的简单表达。迭代地做。
答案 9 :(得分:1)
有一些更正式的模式可以消除特定的错误:
但是,我认为您的大多数调试决策和工作流程都将由您使用的环境设计。
答案 10 :(得分:1)
我遇到的只有几个:
我的软件开发网站上有更多内容 - >调试如果你有兴趣。
答案 11 :(得分:1)
这不是一种真正的调试技术,但我认为我们必须提到一个调试前置条件,如果不满足,将会使你的工作变得更加复杂。
在错误可重现之前,您无法真正开始有意义的调试,并逐步完成配方。如果你得到一个糟糕的错误报告,你可能最终必须亲自辨别该食谱,但如果你支持某人,你应该让他们知道你找出这个食谱需要比他们为你做的更长的时间,甚至可能是不可能。一个有用的错误报告必须回答我称之为错误报告公式的三个问题:1)你做了什么? 2)你期望发生什么? 3)反而发生了什么?
当然,有些虫子是Heisenbugs,显然是短暂的。您仍然应该尝试获得类似于“如果我执行以下操作的声明,看起来大约有10%的时间会发生这种不良结果。”
一旦你有了这个配方,下一步就是经常煮沸到最小的测试用例,就像其他人提到的那样。
答案 12 :(得分:0)
其他人(Xynth,Broam,Moshe)已经提到需要获得最小的测试用例,希望可以将其插入到您的单元测试套件中。我同意。一旦你可以让错误发生,开始削减额外的因素,甚至代码(如鲍勃建议的那样),在每一步测试以查看错误是否消失。如果它在cron中,请手动运行。如果它是从GUI运行的,请从命令行或简单的测试套件中尝试。
如果遇到麻烦,相反的方法通常很有用:创建一个微小的,最小的程序,它可以完成错误例程所做的一些事情。测试它,看看你是否有bug。然后,一步一步,尝试编写一个工作程序,执行错误例程应该做的事情。在某些时候,您可能会看到显示的错误,在这种情况下,您现在有了测试用例。或者,您可以一路走向成功的日常生活。在这种情况下,开始逐行将该例程转换为代码的精确副本,并一路测试以查看错误何时出现。
答案 13 :(得分:0)
专门针对OpenGL片段着色器调试,这是非常不透明的。 Dumbing东西是好的和必要的,但检查输出比常规应用程序编程更棘手,所以你需要一些技巧:
答案 14 :(得分:0)
感谢所有想法。他们真的很有帮助。据我所知,在修复bug方面没有像Design Patterns这样的模式列表。也许在某种程度上,每个人都有自己的方式。
我使用的一种方法是,如果过程看起来很复杂,那就坐下来试着看看我是否可以对代码进行一些重新分解。这让我有机会重新思考代码的行为,更好地理解并使其更易于维护。提取方法是我最喜欢的可读逻辑单元。
我最喜欢的一件事是,如果以意想不到的方式更改属性的值,我会在该属性的setter上设置一个断点。我不知道是否可以使用隐式属性减速(bool myProperty {get; set;})来实现它。
也许最好先让BUG目录显示所有类型的错误分类。
感谢, burak ozdogan
答案 15 :(得分:0)
Dmitry Vostokov一直在http://www.dumpanalysis.org/
编制许多调试模式他在博客http://www.dumpanalysis.org/blog/
中写了很多关于他们的文章虽然主要处理Windows平台上的调试,但他已开始在Mac OS上发布关于gdb的博客。