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

Chr*_*son 8 debugging

对于您喜欢的语言有哪些专家调试提示,您认为每个人都应该使用?

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

C++

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

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

  • 始终,始终,始终通过一个非常好的内存检查器(如valgrind)运行代码,并修复它产生的所有问题.

Mag*_*tin 5

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

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


Tim*_*sch 2

我自己的几个例子,是因为花了太多晚上的时间来调试编译器或运行时环境可能会警告我是否正确使用它的东西:

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

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