2011-10-12 6 views
5

私はプログラム(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にこの情報が必要ですが、それを表示する方法はありますか?

実行中のプログラムでこれを行うには、他にもいくつかの方法がありますか?

答えて

4

あなたはいつでも各メンバーの住所とthisを印刷して、自分自身を理解することができます(言語自体のように、会員アドレスを取得するには&を使用します)。

0

私の知っている唯一の方法は、これが進ダンプが、それは構造を読むためにあなた次第ですあなたを与えるだろうx /<number of bytes>x <variable name>

です。

2

私は知りたがります。

ptypeを使用してメンバーを一覧表示できます。

(gdb) p/a &((my_struct_*)0)->my_member 

(gdb) p/a &((struct sk_buff*)0)->iif 
$7 = 0x74 
0

使用pahole(GDBの一部ではない):次に、あなたはこのような貧乏人のoffsetofはを製作することができます。

もう1つの可能性はpahole.py(まだコミットされていません)です。

+0

ありがとうございます。これは非常に興味深いようです。 –

関連する問題