2008-11-19 65 views
7

什么是你最喜欢的语言的专家调试提示,你认为每个人都应该使用?例如,我将提供我的C++调试提示,它们之间的调试提示可以帮助我摆脱大部分我遇到的错误,这些错误通常是难以调试的语言。什么是最佳调试提示?

C++

  • 增加你的编译器最大的警告级别,然后停止那些发生了很多的警告,你已经决定了你不关心(对我来说这是未使用的参数) 。 g ++不会警告函数中缺少返回语句(我经常发现一个问题),直到警告级别非常高。

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

  • 总是总是通过一个非常好的内存检查程序来运行你的代码,如valgrind,并修复它产生的所有问题。

回答

2

几个我自己的,从大约如果我用它正确地花了几个晚上调试的东西,编译或运行时环境可能已经警告我:

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

理想情况下,你应该尝试你需要火起来的调试器前发现问题 - 任何你能调整,使得它创建了一个编译错误更容易比跟踪下来的调试器,然后固定修复它。

1

在您的观察窗口中始终有“err,hr”。我将显示调用GetLastError的结果。并且在您逐步完成代码时动态更新。

5

了解不同的幻数意味着VS内存处理程序在处理内存时写入的内容。

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

+0

这是不是特定于某些环境? Google似乎在说Visual Studio。 – philant 2008-11-19 11:34:43

0

不知道这是否算作调试,但对于C和Objective-C代码,我认为LLVM/Clang Static Analyzer是非常宝贵的。甚至在您看到它们的效果之前,帮助您发现错误,内存泄漏和逻辑错误。

1

我调试(PHP)主要由一个除了(需要密码,IP锁定)页的最后一行:

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

如果问题是不是在那里你可以调试“正常” ,但10次中有9次会跳出来。

0

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

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

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

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

或者也许还有另一种方法。 :)

-1

我没有这方面的参考,但我被告知0xABABABAB地址的意思是'内存超出分配内存的界限'。希望能帮助到你。

0

偶尔会运行您的发布版本,而不是您的调试版本。一些错误只发生在开启优化时。

相关问题