Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315351
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2010-06-26 16:07:10

下面的讨论基于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无论如何都会消除此类代码.
阅读(1928) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~