2012-07-20 30 views
1

我試圖調試一個核心轉儲我發現結構,其第一個變量指向0x00000055558.. 當我輸入x 0x00000055558..,它輸出:什麼將「<_ZThn24_N15 [某些命名空間] 22 [某些類名稱] D1Ev>」在gdb中的意思?

0x55558.. <_ZTVN15NameSpace22ClassNameE+16>: 0x0000005.. 

這是否意味着是這個類的一個變量在這裏定義?嘗試返回16個字節並將其轉換爲ClassName不會提供有效的值。

對不起,這樣的新手問題,但我無法在谷歌找到相當多的時間。

+1

谷歌名稱mangling,然後採取真實的名稱(不是你錯誤地爲這個問題制定的),並將其傳遞給C++ filt – PlasmaHH 2012-07-20 11:16:24

回答

3

您正在看到mangled name。你可以告訴GDB來還原函數爲你(或者更好的是,從現在開始還原函數名):

set print demangle on 

根據this website,這個命令告訴GDB:

打印C++的名字在他們的源而不是以傳遞給彙編器和鏈接器進行類型安全鏈接的編碼(「損壞」)形式。默認打開。

而且,要看到在某個地址的代碼,你可以寫:

l *0x<address> 
2

見其他答案的方式來還原函數一個符號名。它可能會變成像「vSpace for NameSpace :: ClassName」一樣。 (以_ZTV開頭的g ++符號是vtable。)

找到指向vtable內部偏移量的指針通常是一個非常好的指示,表明您已找到包含派生類型最多的對象的內存。當然,它並不保證它不會遺留在釋放內存或某些其他事物上。

相關問題