繁体   English   中英

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

[英]GDB not seeing correct function argument values even though they are set

成功使用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

当某个断点发生时,在某个类成员函数中设置断点会显示此= 0x0和其他参数错误。 但是在插入之后,该代码一个printf表明, 与参数实际上是设置正确:

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无法访问打印成员变量。

另外,函数主体的其余部分广泛使用此方法和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匹配printfactionPerformed函数主体中看到的内容。 另外,gdb现在可以很好地打印这些值:

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

侦听器应在函数体中对此进行匹配,并且它根据printf进行匹配,但是gdb却看到此= 0x0

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM