使用gdb检查boost shared_ptr
Examine boost shared_ptr with gdb
以下是我的源代码:
#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}}
我尝试了这个链接中提到的提示,但不起作用。
(gdb) call (obj.get())->print()
Cannot evaluate function -- may be inlined
还有别的办法吗?gdb版本为7.0.1。
明白了。!
(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
}
试试这个:
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"}}
这将是一个很难回答的问题。GDB7.x添加了Python脚本支持。网上有一些资源。与其对我没有第一次经验的事情提出糟糕的建议,我会推荐你过去的一篇帖子:
C++GDB Python漂亮打印教程?
编译时,请使用-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"answers"DW_AT_call_line");gdb不显示早期版本的gcc的内联函数调用。相反,它将内联函数的参数和局部变量显示为调用程序中的局部变量。
内联函数的主体直接包含在其调用位置;与非内联函数不同,没有专门用于调用的指令。gdb仍然假装调用站点和内联函数的开始是不同的指令。步进到调用站点显示调用站点,然后再次步进显示内联函数的第一行,即使没有执行其他指令。
这使得源代码级别的调试更加清晰;您可以同时看到调用的上下文和调用的效果。仅通过使用stepi或nexti的单个指令进行单步执行并不能做到这一点;单指令步骤总是显示内联的正文。
gdb有一些方法不会假装内联函数调用与普通调用相同:
在内联函数的调用站点设置断点可能不起作用,因为调用站点不包含任何代码。gdb可能会在调用之后错误地将断点移动到封闭函数的下一行。这一限制将在gdb的未来版本中删除;在此之前,请在前一行或内联函数内部设置断点。gdb在使用finish命令后无法定位内联调用的返回值。这是编译器生成的调试信息的限制;完成后,您可以转到下一行并打印一个变量,该变量是程序存储返回值的地方。
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理