GDB:断点没有被命中

Posted

技术标签:

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

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

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

int x; int y;

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

【问题讨论】:

【参考方案1】:

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

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

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

asm ("");

这两个都记录在at this page。

【讨论】:

如果想要验证是否发生了这种情况,并且愿意投入工作,请查看 gcc 的 -save-temps 选项,它允许检查预处理器和汇编器输出。

以上是关于GDB:断点没有被命中的主要内容,如果未能解决你的问题,请参考以下文章

vs2015当前不会命中断点因为还没有

断点当前不会被命中。没有为此文档加载任何符号

无法调试 - “断点当前不会被命中。没有为此文档加载任何符号”

VS 2010 远程调试器断点当前不会被命中。没有为此文档加载任何符号

如果断点 A 已被命中,则启用断点 B

GDB简单使用