【问题标题】:GDB : breakpoint does not get hitGDB:断点没有被命中
【发布时间】:2013-03-21 14:40:18
【问题描述】:

我们有一个使用 -g 和 -O 编译器标志编译的大型二进制文件。问题是在使用 gdb 进行调试时,在某些文件/行中设置断点不会在该文件/行中中断或在其他行中中断。我知道这可能是由于 -O 编译器标志(用于优化)。不幸的是,我无法删除编译器 -O 标志,因为我需要注意许多脚本级别。

如何确保在我想要的文件/行位置使代码中断?有没有我可以添加的代码行在使用 gdb 调试时总是不会优化或会中断 - 我试过这样的东西 -

int x; int y;

但是 GDB 断点仍然无法正常工作 - 我该如何正确设置它?

【问题讨论】:

    标签: gdb


    【解决方案1】:

    我能想到两个问题,内联和优化。由于没有标准方法告诉编译器禁用内联和/或优化,因此您只能以编译器特定的方式执行此操作。

    要在 GCC 中禁用内联,您可以在方法上使用 __attribute__((noinline))

    要禁止编译器优化函数(并且,未经测试,为您提供可以设置断点的稳定代码行),只需将其添加到代码中即可;

    asm ("");
    

    这两个都记录在at this page

    【讨论】:

    • 如果想要验证是否发生了这种情况,并且愿意投入工作,请查看 gcc 的 -save-temps 选项,它允许检查预处理器和汇编器输出。
    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2012-03-24
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    相关资源
    最近更新 更多