如果我想停在一个空的代码块中,它总是一个问题。
if (...)
{ // I want the debugger to stop here!
}
如果我添加一行不影响程序行为的任意代码行,它可能会被优化掉,具体取决于行
if (...)
{
int a;
a = a; // won't work
}
if (...)
{
int a;
int b = a; // will work
}
所以这里出现了两个问题:
1)什么是最简单的单行代码,它不会被优化(但实际上什么都不做!),我可以用它来停止调试器? 2)有没有办法切换所有优化,以便能够停在任意代码行?编译器标志-O0不起作用。
答案 0 :(得分:2)
一个足够好的单行代码可能是一些有用且有趣的assert
语句,其条件不会被编译器永久折叠。通常一些有意义且有用的assert (p!=NULL)
或assert(i>0)
其中p
是一些现有的指针变量或形式,或i
是一些现有的有符号整数变量或形式,就足够了。
顺便说一句,您正处于项目的调试阶段,因此添加足够有意义的assert
语句非常有用。当然,您希望包含<cassert>
标题。
如果使用-DNDEBUG
标志进行编译,请不要忘记跳过assert(3)个语句。
您也可以使用(在Linux / x86上)asm volatile ("nop")
。请注意,调试器需要一些代码来设置断点。您不需要空代码。
答案 1 :(得分:2)
使用static breakpoint怎么样?
#include <sys/sdt.h>
if (condition)
DTRACE_PROBE(myapp, foo);
现在您可以在GDB中设置breakpoint:
break -probe-stap myapp:foo
您甚至可以使用:
DTRACE_PROBE1(myapp, foo, condition);
使用:
break -probe-stap myapp:foo if $_probe_arg0