2012-10-04 75 views
4

可以說我正在優化代碼中調試崩潰。我看在拆卸和我看到類似以下內容:給定字段的偏移量來確定結構的字段

lea eax,[edi+8Ch] 

現在可以說,我知道什麼結構被存儲在電子數據交換,在這種情況下,這是一個有點大的結構。足夠大,我無法一目瞭然地知道8Ch偏移對應的字段。

我一直在做的只是在Visual Studio中打開我的觀察窗口,並手動對流水線的NULL指針(offsetof宏將做什麼)進行指針運算,直到找到匹配的指針,但這很乏味。有沒有辦法可以更快地確定哪個字段正在被訪問?

+0

是否有一個很好的理由,你正在閱讀反彙編調試C程序? –

+0

由於許多函數被內聯(而崩潰本身是內聯函數),因此調用堆棧並不能準確地反映我所處的函數。我需要查看反彙編以查看實際發生崩潰的位置。 – Alex

+0

這個代碼不能在調試模式下調試嗎? –

回答

0

如果您需要花時間使用這個調試方案,我會建議您編寫一個程序來打印所有結構字段的偏移量,並將它們列在offset; field對中。

我會走得更遠,編寫一個腳本(例如Python),它接受結構的文本並生成一個包含所有結構字段的所有offsetof語句的C代碼文件。

+0

這看起來好像會起作用,但這會很痛苦 - 我必須讓我的腳本解析我的整個程序,以查找嵌入結構或typedef的情況,並瞭解事情是如何打包和對齊的。正確地處理所有的邊緣情況是很痛苦的。 – Alex

+0

[MSVC可以給你這個信息,如果你編譯你的代碼爲C++](http://stackoverflow.com/questions/12735455/determining-the-field-of-a-struct-given-the-fields-offset# comment17209556_12735455)。是的,我知道這在某些情況下可能不是一種選擇。 – DCoder

+0

是的,在這種情況下絕對不是一種選擇。代碼不是C++兼容的。 : -/ – Alex

3

在VisualStrudio你應該能夠「看」的表達是這樣的:

(unsigned)&(((StructTypeName*)0)->StructFieldName) 

你把不同的字段名稱,直到您VS顯示正確的偏移值。

您還可以將您的應用加載到WinDbg(確保符號已加載)並使用dt命令。 WinDbg會將所提供的類型/變量名稱的佈局/內容轉儲爲所有字段的偏移量。

+0

對於第一個建議,我已經在我的最初問題中發佈了這是我目前正在做的事情,但是在大型結構中,手工對所有字段執行二分搜索會很繁瑣。我會看看WinDbg,看看'dt'是否符合我的要求。 – Alex

相關問題