你最好的调试提示是什么?

时间:2008-11-19 10:44:18

标签: debugging

您认为每个人都应该使用哪种专家调试提示?

作为一个例子,我将提供我的C ++调试提示,它们之间可以帮助我摆脱我遇到的大多数错误,这种常常难以调试的语言。

C ++

  • 将编译器的警告级别提高到最大值,然后停止那些发生很多的警告,并且您已经决定不关心(对我来说它是未使用的参数)。在警告级别非常高之前,g ++不会警告函数中缺少返回语句(我经常发现的问题)。

  • 了解如何打开编译器的调试标准库,并使用它! (-D_GLIBCXX_DEBUG for g ++)。这会发现很多错误,也有助于准确显示错误发生的位置。

  • 始终,始终,始终通过一个非常好的内存检查器运行您的代码,如valgrind,并解决它产生的所有问题。

8 个答案:

答案 0 :(得分:5)

了解VS内存处理程序在处理内存时写入的不同幻数是什么意思。

0xCDCDCDCD在堆中分配,但未初始化。通过malloc
0xCCCCCCCC在堆栈上分配,但未初始化。
0xDDDDDDDD释放堆内存。免费的 0xFDFDFDFD“NoMansLand”围栏自动放置在堆内存的边界。永远不应该被覆盖。如果你覆盖一个,你可能会走出数组的末尾 0xFEEEFEEE HeapFree删除的内存
0xBAADF00D在堆中分配,但未初始化。通过HeapAlloc
0xABABABAB不知道。如果有人知道这意味着什么,请加上。

答案 1 :(得分:2)

我自己的几个,花了太多的夜晚调试编译器或运行时环境可以警告我的东西,如果我正确使用它:

  • 如果您正在使用C ++中的指针做任何事情,请在适当的地方断言()。事实上,assert()不变量通常是一个好主意,并且可以将那个模糊不清的bug的调试时间从几周缩短到几分钟。只需记住在发布版本中关闭它们。哦,不要在里面放任何有副作用的东西,否则你会在一段时间内调试你的发布版本。不要问我怎么发现那个
  • 类似地,BOOST_STATIC_ASSERT可以非常有助于检查您在编译时可以检查的差异
  • PurifyPlusvalgrind等内存调试程序是非常省时的设备,应位于每个开发人员的计算机上
  • 了解如何正确使用调试器,以便您可以充分利用其全部功能,而不是仅仅将其用作允许您单步执行代码的设备
  • 如果您真的遇到困难,请向同事解释问题和代码
  • 对于C ++,像FlexeLint/PC-Lint这样的工具可以帮助您在正确配置后查明很多难以找到的内容。你将不得不花时间来配置它,否则你会被警告淹没
  • 如果您正在编写C ++而您正在使用标准容器,请编写使用迭代器的代码,并让运行时的调试版本(或调试STL)捕获您的逐个错误。如果你使用索引来引用std :: vector<>中的元素。你必须自己找到那些
  • 如果可以,请通过不同的编译器运行代码并注意每个编译器产生的警告。但是要确保它们处于相似的语言兼容级别(通过MS VC ++ 6运行现代C ++代码没有意义),否则你最终会追逐那些不存在的问题。

理想情况下,您应该在需要启动调试器之前尝试捕获问题 - 与在调试器中跟踪调试器然后修复它相比,您可以调整任何可以创建编译错误的内容更容易修复。 / p>

答案 2 :(得分:1)

在观看窗口中始终有“错误,小时”。我将展示调用GetLastError所得到的结果。当您单步执行代码时,它会动态更新。

答案 3 :(得分:1)

我的调试(PHP)主要包括对(passworded,IP-locked)页面的最后一行的补充:

echo '<pre>'; print_r($GLOBALS); echo '</pre>';

如果问题不在那里,你可以'正确'进行调试,但是10次中它会跳出9次。

答案 4 :(得分:0)

不确定这是否算作调试,但对于C和Objective-C代码,我发现LLVM/Clang Static Analyzer非常宝贵。即使在看到它们的影响之前,也可以帮助发现错误,内存泄漏和逻辑错误。

答案 5 :(得分:0)

在Visual C ++调试器中,您经常会发现自己处于内联单行函数中,您无法进入并查看其本地函数。例如:

  class foo
  {
     int bar() { int i = func1(); int j = func2(i); return j; }
  };

要显示i的值,您需要一个堆栈帧。但调试器不会进入bar()并显示i的内容。

这里的技巧是在调试器中启用内联汇编。这扩展了函数的处理器指令,这些指令现在不止一行。所以现在你可以进入函数并查询变量。

或许还有另一种方法可以做到这一点。 :)

答案 6 :(得分:0)

偶尔运行Release版本,而不是Debug版本。只有在启用优化时才会发生一些错误。

答案 7 :(得分:-1)

我没有这方面的参考,但我被告知0xABABABAB地址的意思是“超出分配内存范围的内存”。希望它有所帮助。