在优化的代码行停止调试器
Stopping debugger at an optimized out line of code
如果我想在一个空的代码块中停下来,这总是一个问题。
if (...)
{ // I want the debugger to stop here!
}
如果我添加任意一行不影响程序行为的代码,它可能会被优化掉,具体取决于行
if (...)
{
int a;
a = a; // won't work
}
if (...)
{
int a;
int b = a; // will work
}
所以这里出现了 2 个问题:
1) 最简单的单行代码是什么,它不会被优化掉(但实际上什么都不做!),我可以用它来停止调试器?
2) 有没有办法切换所有优化,以便能够在 任意 行代码处停止?编译器标志 -O0 不起作用。
足够好的 one-line 代码可能是一些有用且有趣的 assert
语句,其条件不会被编译器 constant-folded 。通常一些有意义和有用的 assert (p!=NULL)
或 assert(i>0)
其中 p
是一些现有的指针变量或形式,或者 i
是一些现有的有符号整数变量或形式,就足够了。
顺便说一句,您正处于项目的调试阶段,因此添加足够好的有意义的 assert
语句会很有帮助。当然,您希望包含 <cassert>
header。
如果您使用 -DNDEBUG
标志进行编译,请不要忘记跳过 assert(3) 语句。
您也可以使用(在 Linux/x86)asm volatile ("nop")
。请注意,调试器需要一些代码来放置断点。您不需要 空 代码。
使用 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
如果我想在一个空的代码块中停下来,这总是一个问题。
if (...)
{ // I want the debugger to stop here!
}
如果我添加任意一行不影响程序行为的代码,它可能会被优化掉,具体取决于行
if (...)
{
int a;
a = a; // won't work
}
if (...)
{
int a;
int b = a; // will work
}
所以这里出现了 2 个问题:
1) 最简单的单行代码是什么,它不会被优化掉(但实际上什么都不做!),我可以用它来停止调试器? 2) 有没有办法切换所有优化,以便能够在 任意 行代码处停止?编译器标志 -O0 不起作用。
足够好的 one-line 代码可能是一些有用且有趣的 assert
语句,其条件不会被编译器 constant-folded 。通常一些有意义和有用的 assert (p!=NULL)
或 assert(i>0)
其中 p
是一些现有的指针变量或形式,或者 i
是一些现有的有符号整数变量或形式,就足够了。
顺便说一句,您正处于项目的调试阶段,因此添加足够好的有意义的 assert
语句会很有帮助。当然,您希望包含 <cassert>
header。
如果您使用 -DNDEBUG
标志进行编译,请不要忘记跳过 assert(3) 语句。
您也可以使用(在 Linux/x86)asm volatile ("nop")
。请注意,调试器需要一些代码来放置断点。您不需要 空 代码。
使用 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