私はプログラム(V8 JavaScript VM)のデバッグビルドを持っており、特定のクラスのインスタンスがどのようにメモリにレイアウトされているかを理解したいと思います。私はこのようなきれいなプリントの構造をすることができます:どのようにC++クラスがgdbでメモリ内でどのようにレイアウトされるのか分かりますか?
(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にこの情報が必要ですが、それを表示する方法はありますか?
実行中のプログラムでこれを行うには、他にもいくつかの方法がありますか?
ありがとうございます。これは非常に興味深いようです。 –