GDB 会自动单步执行内联函数

gdb automatically steps into inline functions

本文关键字:函数 执行 单步 GDB      更新时间:2023-10-16

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

是否有任何设置/新的默认选项会影响我可以检查的 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
}

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

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

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