你最好的调试提示是啥?

Posted

技术标签:

【中文标题】你最好的调试提示是啥?【英文标题】:What are your best debugging hints?你最好的调试提示是什么? 【发布时间】:2010-09-23 00:36:25 【问题描述】:

您认为每个人都应该使用的您最喜欢的语言的专家调试提示是什么?

例如,我将提供我的 C++ 调试提示,它们之间的提示可以帮助我摆脱我遇到的大部分错误,使用这种通常难以调试的语言。

C++

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

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

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

【问题讨论】:

【参考方案1】:

了解 VS 内存处理程序在处理内存时写入的不同幻数的含义。

0xCDCDCDCD 在堆中分配,但未初始化。通过 malloc 0xCCCCCCCC 在堆栈上分配,但未初始化。 0xDDDDDDDD 释放堆内存。由免费 0xFDFDFDFD "NoMansLand" 栅栏自动放置在堆内存的边界。永远不应该被覆盖。如果您确实覆盖了一个,您可能会离开数组的末尾。 0xFEEEFEEE HeapFree 删除的内存 0xBAADF00D 在堆中分配,但未初始化。通过 HeapAlloc 0xABABABAB 不知道。如果有人知道这是什么意思,请补充。

【讨论】:

这不是特定于某些环境吗? Google 似乎在说 Visual Studio。【参考方案2】:

我自己的几个,因为花了太多晚上调试编译器或运行时环境可能会警告我如果我正确使用它的话:

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

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

【讨论】:

【参考方案3】:

在您的观察窗口中始终显示“err, hr”。我将展示调用 GetLastError 得到的结果。当您单步执行代码时,它会动态更新。

【讨论】:

【参考方案4】:

我的调试(php)主要包括对(密码,IP锁定)页面最后一行的添加:

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

如果问题不存在,您可以“正确”调试,但 10 次中有 9 次它会从中跳出。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

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

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

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

我没有这方面的参考资料,但有人告诉我 0xABABABAB 地址意味着“内存超出分配内存的范围”。希望对您有所帮助。

【讨论】:

以上是关于你最好的调试提示是啥?的主要内容,如果未能解决你的问题,请参考以下文章

eport注册提示没有足够的值是啥意思

VScode css智能提示,提示这些乱七八糟的东西是啥情况

电脑管家提示程序正在修改系统HOSTS文件建议你阻止是啥意思

Android 提示的颜色代码是啥?

LINUX 指令连接服务器的MYSQL数据库显示失败,请教一下是啥原因?最好能详细点吗?在线等谢谢

C语言编辑,这个vs中的错误提示是啥意思