c++ - 如何使用 gdb 查看 C++ 类在内存中的布局?

标签 c++ gdb

我有一个程序的调试版本(V8 JavaScript VM),我想了解某些类的实例是如何在内存中布局的。我可以像这样漂亮地打印结构:

(gdb) print thread_local
$6 = {
  blocks_ = {
    data_ = 0x868ceb0,
    capacity_ = 7,
    length_ = 1
  },
  entered_contexts_ = {
    data_ = 0x868d828,
    capacity_ = 1,
    length_ = 1
  },
  saved_contexts_ = {
    data_ = 0x868d838,
    capacity_ = 1,
    length_ = 1
  },
  spare_ = 0x0,
  ignore_out_of_memory_ = false,
  call_depth_ = 1,
  handle_scope_data_ = {
    next = 0x0,
    limit = 0x0,
    level = 0
  }
}

但我想知道那些不同的成员( block 、entered_contexts 等)相对于对象的开始在物理上的位置。在基于 Solaris 的系统上,mdb 可以像这样为 C 结构执行此操作:

> ::print -at port_event_t
0 port_event_t {
    0 int portev_events 
    4 ushort_t portev_source 
    6 ushort_t portev_pad 
    8 uintptr_t portev_object 
    10 void *portev_user 
}

在该示例中,每个字段都以其距结构开头的偏移量为前缀。我想对 C++ 类做同样的事情。 gdb 必须有这些信息才能打印出结构成员,但是有什么方法可以查看它吗?

或者,对于正在运行的程序,是否有其他方法可以做到这一点?

最佳答案

你总是可以打印出每个成员的地址和this来自己弄清楚(你使用&来获取成员地址,就像在语言本身中一样).

关于c++ - 如何使用 gdb 查看 C++ 类在内存中的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7746461/

相关文章:

c++ - QT C++中对全局变量的 undefined reference

c++ - Makefile循环依赖错误

stream - 用GDB模拟回声输入

c++ - 有没有办法在 gdb 中打印 Armadillo 矩阵?

无法访问内存 - gdb

assembly - 如何检查 gdb 中 -0x14(%ebp) 中存储的值?

c++ - std::thread 如何存储通过其构造函数传递的可变参数?

c++ - 如果有多个以太网适配器,您个人如何通过 MAC 地址识别工作站?

c++ - 什么是 C++ 中的就地构造函数?

c - 检测退出时释放的 C 内存 'leaks'