即使设置了GDB,GDB也看不到正确的函数参数值

时间:2015-05-13 18:25:32

标签: c++ debugging gdb 64-bit

在使用x86 GDB成功15年之后,第一次尝试在四核Xeon上进行调试。

Linux DellT3500 3.16.0-23-generic#31-Ubuntu SMP Tue Oct 21 17:56:17 UTC 2014 x86_64 x86_64 x86_64 GNU / Linux

GNU gdb(Ubuntu 7.8-1ubuntu4)7.8.0.20141001-cvs

g ++编译器标志:

-Wall -Wwrite-strings -Wchar-subscripts -Wparentheses -gstabs+ -DLINUX  -O0

在某个类成员函数中设置断点会在断点发生时显示 this = 0x0 而另一个参数不正确。但是在之后的代码中插入 printf 表示 this 并且参数实际设置正确:

Breakpoint 1, PlayGamePage::actionPerformed (this=0x0, inTarget=0x7fffffffdf90)
    at PlayGamePage.cpp:725
725     printf( "hey, this = %x, inTarget = %x\n", this );
(gdb) next
hey, this = b6cc50, inTarget = b6ce18
727   if( inTarget == &mCommitButton &&
(gdb) print this
$1 = (PlayGamePage * const) 0x0
(gdb) print inTarget
$2 = (GUIComponent *) 0x7fffffffdf90
(gdb)

但是你可以看到GDB如何正确地打印这些值,即使它们是由 printf 的代码设置和打印的。这是一个大问题,因为GDB无法访问打印成员变量。

此外,函数体的其余部分广泛使用 this 和广泛使用inTarget(访问类成员并测试inTarget),代码按预期运行。没有崩溃或不当行为,所以这在代码中设置正确,但GDB无法看到它。

上堆:

(gdb) up
#1  0x000000000040a11f in ActionListenerList::fireActionPerformed (
    this=0xb6cf98, inTarget=0xb6cf48)
    at ../../minorGems/ui/event/ActionListenerList.h:134
134         listener->actionPerformed( inTarget );

查看 inTarget actionPerformed 功能正文中 printf 所看到的内容相匹配。此外,gdb可以在此时打印这些值:

(gdb) print inTarget
$5 = (GUIComponent *) 0xb6cf48
(gdb) print listener
$6 = (ActionListener *) 0xb6ce18

侦听器应该与函数体中的 this 匹配,并且根据printf进行匹配,但gdb会看到 this = 0x0 。< / p>

是的,这是一个被调用的虚函数(PlayGamePage实现了ActionListener接口,覆盖了actionPerformed虚函数)。

我只是在32位x86上的GDB中使用完全相同的代码放置一个断点,它正确地看到了这个和inTarget,并且可以正确打印它们,其值与代码&printf显示的值相匹配。

1 个答案:

答案 0 :(得分:0)

这是您GCC中的错误(您使用的是哪个版本?)或GDB中的错误。

由于您显然正在运行GDB的 CVS快照,我建议先尝试使用 stable GDB版本。