【发布时间】:2011-10-12 20:56:13
【问题描述】:
我有一个程序的调试版本(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
}
}
但我想知道这些不同的成员(块、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 必须拥有这些信息才能打印出结构成员,但是有什么方法可以查看它?
或者,是否有其他方法可以为正在运行的程序执行此操作?
【问题讨论】: