在优化的代码行停止调试器

时间:2015-02-26 07:08:32

标签: c++ gcc gdb

如果我想停在一个空的代码块中,它总是一个问题。

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不起作用。

2 个答案:

答案 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