以下是我的源代码:
#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。
答案 0 :(得分:30)
知道了。!
(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
}
答案 1 :(得分:2)
试试这个:
print(* obj.px)。i
完整代码如下:
(gdb) list 1,23
1 #include <iostream>
2 #include <boost/shared_ptr.hpp>
3 #include <string>
4
5 class MyClass
6 {
7 public:
8 MyClass()
9 : name("Testing")
10 {
11 i=10;
12 }
13 private:
14 int i;
15 std::string name;
16 };
17
18
19 int main(int argc, const char *argv[])
20 {
21 boost::shared_ptr <MyClass> obj(new MyClass());
22 return 0;
23 }
(gdb) p obj
$9 = {px = 0x602010, pn = {pi_ = 0x602060}}
(gdb) p (*obj.px).i
$10 = 10
(gdb) p (*obj.px).name
$11 = {static npos = 18446744073709551615,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x602048 "Testing"}}
答案 2 :(得分:0)
这将是一个难以回答的问题。 GDB 7.x增加了Python脚本支持。网上有一些资源。我会把你推荐给过去的帖子,而不是做一些我没有第一次体验的不好的建议。
答案 3 :(得分:0)
编译时使用-ggdb选项并查看是否有效
http://sourceware.org/gdb/onlinedocs/gdb/Inline-Functions.html
内联是一种优化,它直接在每个调用站点插入函数体的副本,而不是跳转到共享例程。 gdb显示内联函数,就像非内联函数一样。它们出现在回溯中。您可以查看他们的参数和局部变量,使用步骤进入它们,使用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无法找到内联调用的返回值。这是编译器生成的调试信息的限制;完成后,您可以跳到下一行并打印一个变量,其中程序存储了返回值。