5

最適化されたコードでクラッシュをデバッグしているとしましょう。逆アセンブルを見ると、次のようなものが表示されます。

lea eax,[edi+8Ch] 

ここで、どの構造がediに格納されているかを知っているとしましょう。この場合、それはやや大きな構造です。8Chオフセットがどのフィールドに対応するのか一目で分からないほど大きい。

私がやっていることは、Visual Studio でウォッチ ウィンドウを開き、キャストされた NULL ポインター (offsetof マクロが行うこと) で一致するポインターが得られるまで手動でポインター演算を行うことですが、これは面倒です。どのフィールドがアクセスされているかをより迅速に判断する方法はありますか?

4

2 に答える 2

3

VisualStrudio では、次のような式を「見る」ことができるはずです。

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

VS が正しいオフセット値を表示するまで、異なるフィールド名を入力します。

アプリをロードしてWinDbg(シンボルがロードされていることを確認してください)、dtコマンドを使用することもできます。WinDbg は、指定された型/変数名のレイアウト/内容をすべてのフィールドのオフセットと共にダンプします。

于 2012-10-05T05:21:33.880 に答える
0

このデバッグ スキームに時間を費やす必要がある場合は、構造体フィールドのすべてのオフセットを出力し、それらをoffset; fieldペアでリストするプログラムを作成することをお勧めします。

さらに進んで、構造体のテキストを取得offsetofし、構造体のすべてのフィールドのすべてのステートメントを含む C コード ファイルを生成するスクリプトを (たとえば Python で) 記述します。

于 2012-10-04T20:53:17.817 に答える