GDB:断点没有命中

问题描述:

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

我该如何确保在我想要的文件/行位置上打破代码?是否有一行代码,我可以添加它将永远不会优化或将打破使用gdb调试时 - 我试过这样的事情 -

int x; int y;

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

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

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

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

asm (""); 

这两者都记录在案at this page

+0

如果想验证是否发生了什么,并且愿意将其加入,请查看gcc的'-save-temps'选项,该选项允许检查预处理器和汇编器的输出。 – 2013-03-21 15:08:41