您认为每个人都应该使用哪种专家调试提示?
作为一个例子,我将提供我的C ++调试提示,它们之间可以帮助我摆脱我遇到的大多数错误,这种常常难以调试的语言。
C ++
将编译器的警告级别提高到最大值,然后停止那些发生很多的警告,并且您已经决定不关心(对我来说它是未使用的参数)。在警告级别非常高之前,g ++不会警告函数中缺少返回语句(我经常发现的问题)。
了解如何打开编译器的调试标准库,并使用它! (-D_GLIBCXX_DEBUG for g ++)。这会发现很多错误,也有助于准确显示错误发生的位置。
始终,始终,始终通过一个非常好的内存检查器运行您的代码,如valgrind,并解决它产生的所有问题。
答案 0 :(得分:5)
了解VS内存处理程序在处理内存时写入的不同幻数是什么意思。
0xCDCDCDCD在堆中分配,但未初始化。通过malloc
0xCCCCCCCC在堆栈上分配,但未初始化。
0xDDDDDDDD释放堆内存。免费的
0xFDFDFDFD“NoMansLand”围栏自动放置在堆内存的边界。永远不应该被覆盖。如果你覆盖一个,你可能会走出数组的末尾
0xFEEEFEEE HeapFree删除的内存
0xBAADF00D在堆中分配,但未初始化。通过HeapAlloc
0xABABABAB不知道。如果有人知道这意味着什么,请加上。
答案 1 :(得分:2)
我自己的几个,花了太多的夜晚调试编译器或运行时环境可以警告我的东西,如果我正确使用它:
理想情况下,您应该在需要启动调试器之前尝试捕获问题 - 与在调试器中跟踪调试器然后修复它相比,您可以调整任何可以创建编译错误的内容更容易修复。 / 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地址的意思是“超出分配内存范围的内存”。希望它有所帮助。