1

我正在使用gdb 6.6 在 solaris 上调试正在运行的程序,并注意到有时 gdb 会进入(内联)函数,即使我发出了下一个命令。我的开发主机最近重新安装了一个稍新的 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
}
4

1 回答 1

4

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

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

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

于 2012-06-04T08:19:23.537 回答