下面的讨论基于gcc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
GNU gdb 6.8-debian
int main(int argc, char *argv[])
{
while(1)
{
sleep(1);
}
printf("[%s]\n", __PRETTY_FUNCTION__);
return 0;
}
给定上面一段简单的程序.
用
gcc -g -O0 -o test test.c
注意优化选项已被显式关闭, 即使如此, 因为while循环明显会让执行流永远到达不了printf调用处.
有一种例外: 调试程序时, gdb 的jump命令可以将当前$pc设置到指定行. 但对这种情况, 在printf 这一行设置断点却不可能, gdb 会提示说:
no line * in test.c
找不到该行. 这一问题顺着分析看容易理解, 但如果是在某个大程序中, 程序行很多, 通过行号来设置断点的结果很可能是可以设置断点, 但设置到的真正位置却不是程序员预期的程序行.
在gcc选项中找到一个 -fno-tree-dce
dce: dead code elimation.
即使加上了, 也同样不生效, 用
disassemble main
查看反汇编的结果可知, gcc无论如何都会消除此类代码.
阅读(1995) | 评论(0) | 转发(0) |