【问题标题】:gdb breakpoint gets hit in the wrong line numbergdb 断点在错误的行号中命中
【发布时间】:2017-01-10 09:14:02
【问题描述】:

在 gdb 中,我设置了一个断点,使 gdb 在满足第一个 if 条件时停止。但是 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 类型 Disp Enb 地址 什么
1个断点保持y 0x000000000040da02在 在 file.c:3282 处搜索
断点已经命中 1 次

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

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

gcc --version

gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

【问题讨论】:

  • 您是否认为A 永远不会大于1?
  • 不,gdb 只是打印“hello”。
  • 这如何反驳我所说的?它应该打印"correct"
  • 很多次调试项目,如果我在第3000行设置断点,gdb就在3000附近停止。gdb甚至在执行n命令时跳回前行。我认为这是 gcc 优化。只有a>1 可以打印“正确”。如果我不更改编译脚本,我可以让 gdb 停在特定的行吗?

标签: c linux gcc gdb


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多