gdb断点在错误的行号中被命中

时间:2017-01-10 09:14:02

标签: c linux gcc gdb

在gdb中,我设置了一个断点,以便在满足第一个if条件时使gdb停止。但gdb在另一行中停止,并且不满足if条件。我读过gdb breakpoint does not get hit,但它没有解决。我认为gdb仅在满足if (a == 1)并且在第3282行时停止。我错了吗?

#pragma GCC push_options
#pragma GCC optimize("O0")

static void __attribute__ ((noinline)) search(int a, int b) 
{  
    // other code here 

    if (a == 1) {
        printf("condition1\n"); 
        printf("condition1\n"); // line 3282, breakpoint is set here   
    }
    if (b == 1) {              // line 3284,  in fact, gdb stops in this line    
        printf("condition2\n");
        printf("condition2\n");
    }
}
#pragma GCC pop_options

使用命令b file.c:3282

在第3282行设置断点
  

0x40da02处的断点1:文件file.c,行   3282。

info breakpoint显示:

  

Num Type Disp Enb Address什么
  1个断点保持y 0x000000000040da02 in   在file.c上搜索:3282
          断点已经达到1次

但是gdb在第3284行停止,而不是3282,而a不等于1

  

[切换到线程0x7ffff75b8700(LWP 3631)]
断点1,搜索   at file.c:3284
3284 if(b == 1){

gcc --version

  

gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2

1 个答案:

答案 0 :(得分:1)

我将gcc -g -O2更改为gcc -g -O0,然后一切顺利。以下是关于gcc命令的-O2选项的文档。

  

-O2优化甚至更多。 GCC几乎执行所有支持的优化,不涉及空速 - 权衡。              与-O相比,此选项会增加编译时间和生成代码的性能。