我正在使用 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
}
答案 0 :(得分:4)
您的新版Solaris可能包含新版本的C或C ++编译器。新编译器可能比以前更积极地进行优化。检查优化标志。如果您正在使用GCC,则可以使用-fno-inline
禁用内联(请注意,默认情况下,在头文件中的类中实现的方法是内联的,可以使用-fno-default-inline
禁用)。如果您使用的是本机Solaris编译器,则需要检查其文档。
报告了一个类似的问题here。在评论中,海报提到更改调试符号以使用STABS解决了这个问题。
您在评论中提到STABS有效,但是不可接受。此外,您提到您无法通过一个简单的示例重现该问题。如果每次必须重新编译整个项目以执行测试,则很难解决此问题。尝试将问题隔离到项目中的一些源文件。看看它们有什么共同点(它们是否包含一个公共头文件,它们是否使用pragma
,编译选项与其他源代码有什么不同,等等),并尝试创建一个小例子一样的问题。这样可以更轻松地确定问题的根本原因并确定如何解决问题。没有这些数据,我们只是盲人领导盲人。