2012-06-04 28 views
1

我在Solaris调试正在运行的程序与GDB 6.6,并注意到有时用gdb步入(内联)功能,即使我发了下一个命令。 我的开发主机最近重新安装了solaris 10的一个稍微更新的版本,并且我确定自动步进在主机重新安装之前不存在。代码使用相同的选项进行编译,因为在主机重新安装后,makefile和所有源代码都保持不变。GDB自动步入内联函数

是否有任何影响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

愚蠢的问题,但你确定你没有任何断点或任何内部被调用的功能? –

+0

是的,非常确定。它在执行“cont”时不会中断。 – user826955

回答

4

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

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

您在评论中提到STABS有效,但不能接受。另外,你提到你无法用一个简单的例子重现这个问题。如果您每次都必须重新编译整个项目来执行测试,那么解决此问题将很困难。尝试将问题隔离到项目中的几个源文件。看看它们有什么共同之处(它们是否包含共同的头文件,它们是否使用pragma,是否与其他源文件等有所不同),并尝试创建一个具有相同问题的小示例。这样可以更轻松地找出问题的根源,并确定如何解决问题。没有这些数据,我们就是盲人领导盲人。

+0

对不起,我不是指'inline'关键字。编辑上面的问题来澄清。 – user826955

+0

当我还在gcc 3.4.6上时,这仍然可以由更多的编译器优化引起吗? – user826955

+0

其实我不知道gdb的版本是否不同(我无法检查这个,主机是由于系统故障重新安装的)。但我的印象是海湾合作委员会的版本应该是相同的,因为它仍然是3.4.6,也许没有一个“更新的”3.4.6版本?我们被迫从'Solaris 10 10/08 s10x_u6wos_07b'升级到'Oracle Solaris 10 8/11 s10x_u10wos_17b',这是可用的最老版本的solaris 10。我知道至少libc.so.1是不同的,因为我们遇到了将二进制文件部署到版本为“Solaris 10 10/08 s10x_u6wos_07b”的旧版本生产主机时的问题。 – user826955