私は大規模なアプリケーションで作業しており、WinDbgを頻繁に使用して、顧客からのDMPファイルに基づいて問題を診断しています。WinDbgの小さな拡張機能をいくつか作成しました。これらは、DMPファイルから情報を引き出すのに非常に役立つことが証明されています。私の拡張コードでは、c++クラスオブジェクトを同じ方法で何度も手作業で逆参照していることに気づきました。例えば:
Address = GetExpression("somemodule!somesymbol");
ReadMemory(Address, &addressOfPtr, sizeof(addressOfPtr), &cb);
// get the actual address
ReadMemory(addressOfObj, &addressOfObj, sizeof(addressOfObj), &cb);
ULONG offset;
ULONG addressOfField;
GetFieldOffset("somemodule!somesymbolclass", "somefield", &offset);
ReadMemory(addressOfObj+offset, &addressOfField, sizeof(addressOfField), &cb);
それはうまく機能しますが、より優れた機能を備えた(そしてアプリケーションのDMPファイル内のより複雑なオブジェクトにアクセスする)拡張機能を作成するにつれて、より良いソリューションを待ち望んでいました。もちろん、私は自分のアプリケーションのソースにアクセスできるので、DMPファイルからオブジェクトをコピーし、そのメモリを使用して、関数を呼び出すことができるデバッガー拡張機能に実際のオブジェクトを作成する方法があるはずです(アプリケーションからdllにリンクすることによって)。これにより、DMPから手で物を引き出す手間を省くことができます。
これも可能ですか?拡張機能で新しいオブジェクトを作成し、それをDMPファイルから直接大きなReadMemoryで上書きするなど、明らかなことを試みました。これはデータを正しいフィールドに配置しているように見えましたが、関数を呼び出そうとするとびっくりしました。私は何かが欠けていると思います...多分c++は私が知らないいくつかのvtableファンキーさを引き出しますか?私のコードは次のようになります。
SomeClass* thisClass = SomeClass::New();
ReadMemory(addressOfObj, &(*thisClass), sizeof(*thisClass), &cb);
フォローアップ:EngExtCppのExtRemoteTypedが必要なようです。誰かがこれをうまく使用しましたか?いくつかのサンプルコードをグーグルで検索する必要がありますが、あまり運がありません。
フォローアップ2:私はこれについて2つの異なる調査ルートを追求しています。
1)ExtRemoteTypedを調べていますが、このクラスは実際にはReadMemory/GetFieldOffset呼び出しの単なるヘルパーであるようです。はい、それはALOTの速度を上げるのに役立ちますが、DMPファイルからオブジェクトを再作成する場合には実際には役立ちません。ドキュメントはスリムですが、私は何かを誤解している可能性があります。2)ReadMemoryを使用して、拡張機能で作成されたオブジェクトをDMPファイルのデータで上書きすることも検討しています。ただし、上記のようにsizeof(* thisClass)を使用するのではなく、データ要素のみを選択し、vtablesはそのままにしておくと考えていました。