GDB即使设置了正确的函数参数值

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

本文关键字:函数 参数 设置 GDB      更新时间:2023-10-16

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

linux dellt3500 3.16.0-23总生成#31-ubuntu SMP星期二10月21日17:56:17 UTC 2014 x86_64 x86_64 x86_64 x86_64 x86_64 gnu/linuux

gnu gdb(ubuntu 7.8-1ubuntu4)7.8.0.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 = %xn", 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甚至无法正确打印这些值。这是一个大问题,因为GDB无法访问打印成员变量。

此外,其余的功能主体使用广泛和固有性(访问类成员和测试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 printf 匹配的 Action Pervereded 功能主体中看到。另外,GDB此时可以很好地打印这些值:

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

侦听器应匹配在功能主体中down,并且它根据printf进行,但是gdb see this = 0x0 而不是。<<<<<<<<<<<<<<<<<<<<

是的,这是一个称为的虚拟函数(PlayGamePage实现了ActionListener接口,覆盖了Action Pervered的虚拟函数)。

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

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

由于您显然正在运行GDB的 old cvs快照,所以我建议首先尝试A stable gdb释放。