gdb自动进入内联函数

时间:2012-06-04 08:12:28

标签: c++ debugging gdb solaris inline

我正在使用 gdb 6.6 on solaris 调试正在运行的程序,并注意到有时gdb会进入(内联)函数,即使我发出了 next 命令。 我的开发主机最近重新安装了一个稍微更新的solaris 10版本,我确信在主机重新安装之前没有自动步进。代码使用相同的选项进行编译,因为自主机重新安装以来makefile和所有源代码都没有改变。

是否有任何设置/新的默认选项会影响我可以检查的gdb的调试行为?有谁知道为什么我的gdb现在自动步骤?真是太痛苦了......

[编辑]澄清:我不是指inline关键字,而是在头文件中实现的方法/函数。例如:

header.hpp:
class MyClass
{
   public:
      void someFunc() { ... does something }
}

source.cc:
{
   MyClass instance;

   instance.someFunc();     // doing NEXT in gdb will actually STEP into header.hpp
}

1 个答案:

答案 0 :(得分:4)

您的新版Solaris可能包含新版本的C或C ++编译器。新编译器可能比以前更积极地进行优化。检查优化标志。如果您正在使用GCC,则可以使用-fno-inline禁用内联(请注意,默认情况下,在头文件中的类中实现的方法是内联的,可以使用-fno-default-inline禁用)。如果您使用的是本机Solaris编译器,则需要检查其文档。

报告了一个类似的问题here。在评论中,海报提到更改调试符号以使用STABS解决了这个问题。

您在评论中提到STABS有效,但是不可接受。此外,您提到您无法通过一个简单的示例重现该问题。如果每次必须重新编译整个项目以执行测试,则很难解决此问题。尝试将问题隔离到项目中的一些源文件。看看它们有什么共同点(它们是否包含一个公共头文件,它们是否使用pragma,编译选项与其他源代码有什么不同,等等),并尝试创建一个小例子一样的问题。这样可以更轻松地确定问题的根本原因并确定如何解决问题。没有这些数据,我们只是盲人领导盲人。