4

ライブ リモート ターゲットとクラッシュ ダンプの両方で動作する WinDbg デバッガー拡張機能を作成しようとしています。この拡張機能は、構造オフセットを介してメモリの不透明なブロックを分析し、メモリのさまざまな領域を既知のオブジェクトにキャストします。

構造体はバージョン間でフィールド/フィールドの順序を変更するため、デバッガー拡張機能自体にハードコーディングする (またはヘッダーを含める) ことはできません。代わりに、プライベート シンボルを持つ pdb から構造情報を抽出したいと考えています。

pdb/image が読み込まれたモジュール リストにあるライブ ターゲットでこれを使用すると、これはうまく機能し、 GetFieldOffsetなどの関数を使用して、クラスの構造体のフィールドを取得できます。

GetFieldOffset("MyClass!MyNestedClass", "m_Struct", &offsetInClass);

GetFieldData(offsetInClass + classAddr, "MyClass!_MY_STRUCT", "FieldInStruct",
             sizeof(ULONG), &myFieldValue);

私の問題:ロードされたモジュール リストにモジュールがない場合 (コンテキストが間違っているか、クラッシュ ダンプを分析している)、上記の関数を使用できません。

分析しているメモリ領域の先頭に、pdb GUID と年齢を格納しました。それを使用して、 SymFindFileInPathを使用して、シンボル パス/シンボル キャッシュで pdb へのパスを見つけることができます。

char symbolPath[MAX_SYMBOL_PATH] = "";
PSTR pdbPath = NULL;

hr = ExtSymbols->lpVtbl->GetSymbolPath(ExtSymbols,
                                       symbolPath,
                                       sizeof(symbolPath),
                                       NULL);

SymSetOptions(SYMOPT_IGNORE_CVREC | SYMOPT_FAIL_CRITICAL_ERRORS | 
              SYMOPT_CASE_INSENSITIVE);

result = SymFindFileInPath(hSymbols,
                           symbolPath,
                           Name,
                           &GUID,
                           Age,
                           0,
                           SSRVOPT_GUIDPTR,
                           pdbPath,
                           NULL,
                           NULL);

したがって、特定の pdb インスタンスへのパスはありますが、ここからどこに行けばよいかわかりません。DbgHelp.dll によって公開されたSym* 関数を調べると、この pdb ファイルを使用して型情報を取得する明らかな方法が見当たりません。SymGetTypeInfoなどの関数にはモジュール ベースが必要ですが、私のモジュールはロードできません。必要なのは、構造内のフィールドのバイト オフセットだけです。何か案は?

ありがとう!

4

2 に答える 2