2011-10-12 135 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列出成員。然後,你可以製造一個窮人的offsetof這樣的:

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

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

使用pahole(不GDB的一部分)。

另一種可能性是pahole.py(尚未提交)。

+0

謝謝。這看起來很有趣。 –

相關問題