GDB即使设置了正确的函数参数值
GDB not seeing correct function argument values even though they are set
第一次尝试在成功使用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释放。
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何定义在用作函数参数时工作的类模板的转换
- 将函数参数完美转发到函数指针:按值传递呢?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 接受模板作为函数参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- Arduino 函数参数