以下是我的源代码:
#include <iostream>
#include <boost/shared_ptr.hpp>
class MyClass
{
public:
MyClass()
{
i=10;
}
private:
int i;
};
int main(int argc, const char *argv[])
{
boost::shared_ptr <MyClass> obj(new MyClass());
return 0;
}
我想在gdb中检查obj,并查看成员变量i的值。
这是我用普通打印得到的结果:
29 boost::shared_ptr <MyClass> obj(new MyClass());
(gdb) n
30 return 0;
(gdb) p obj
$1 = {px = 0x602010, pn = {pi_ = 0x602030}}
我尝试了this link中提到的提示,但不起作用。
(gdb) call (obj.get())->print()
Cannot evaluate function -- may be inlined
还有别的办法吗?gdb版本为7.0.1。
发布于 2013-07-23 18:06:08
明白了。!
(gdb) set print pretty
(gdb) p obj
$5 = {
px = 0x602010,
pn = {
pi_ = 0x602030
}
}
(gdb) p obj.px
$6 = (MyClass *) 0x602010
(gdb) p *(obj.px)
$7 = {
i = 10
}
发布于 2013-07-23 16:27:33
这将是一个很难回答的问题。GDB 7.x增加了对Python脚本的支持。网上有一些资源。我不会做一个糟糕的尝试来建议我没有第一次经验的东西,我会推荐你参考过去的帖子:
发布于 2013-07-23 16:36:05
编译时使用-ggdb选项,看看是否有效
http://sourceware.org/gdb/onlinedocs/gdb/Inline-Functions.html
内联是一种优化,它直接在每个调用点插入函数体的副本,而不是跳到共享例程。gdb像显示非内联函数一样显示内联函数。它们以回溯的形式出现。您可以查看它们的参数和局部变量,使用step进入它们,使用next跳过它们,使用finish退出它们。您可以使用info frame命令检查函数是否内联。
为了让gdb支持内联函数,编译器必须在调试信息中记录有关内联的信息-使用dwarf 2格式的gcc可以做到这一点,其他几个编译器也可以做到这一点。gdb仅支持使用dwarf 2时的内联函数。4.1之前的版本的gcc不会发出两个必需的属性(‘DW_AT_call_file’和‘DW_AT_call_line’);gdb不会显示较早版本的gcc的内联函数调用。相反,它将内联函数的参数和局部变量显示为调用方中的局部变量。
内联函数体直接包含在其调用位置;与非内联函数不同,没有专门用于调用的指令。gdb仍然假装调用点和内联函数的开始是不同的指令。单步执行到调用站点显示调用站点,然后再次单步执行显示内联函数的第一行,即使没有执行任何额外的指令。
这使得源代码级别的调试更加清晰;您既可以看到调用的上下文,也可以看到调用的效果。仅使用stepi或nexti单步执行一条指令并不能做到这一点;单指令步骤总是显示内联的主体。
gdb在某些方面不会假装内联函数调用与普通调用相同:
在内联函数的调用位置设置断点可能不起作用,因为调用位置不包含任何代码。在调用之后,gdb可能会错误地将断点移动到封闭函数的下一行。这一限制将在未来的gdb版本中删除;在此之前,请在较早的行或内联函数内设置断点。使用finish命令后,gdb找不到内联调用的返回值。这是编译器生成的调试信息的限制;完成后,您可以跳到下一行并打印一个变量,程序将在该变量中存储返回值。
https://stackoverflow.com/questions/17804967
复制相似问题