1

これは、dmpファイルからオブジェクトをプルすることに関する私の前の質問に関連しています。

前の質問で述べたように、ラッパーの「リモート」オブジェクトを作成することで、dmpファイルからオブジェクトを正常に引き出すことができます。私はこれまでにこれらのいくつかを実装しましたが、うまく機能しているようです。しかし、私は障害に遭遇しました。

あるケースでは、ポインタは「SomeBaseClass」タイプのクラスに格納されますが、そのオブジェクトは実際には「SomeBaseClass」から派生した「SomeDerivedClass」タイプです。たとえば、次のようになります。

MyApplication!SomeObject
   +0x000 field1            : Ptr32 SomeBaseClass
   +0x004 field2            : Ptr32 SomeOtherClass
   +0x008 field3            : Ptr32 SomeOtherClass

'field1'の実際のタイプが何であるかを知るための何らかの方法が必要です。

具体的には、アドレスの例を使用します。

MyApplication!SomeObject
   +0x000 field1            : 0cae2e24 SomeBaseClass
   +0x004 field2            : 0x262c8d3c SomeOtherClass
   +0x008 field3            : 0x262c8d3c SomeOtherClass

0:000> dt SomeBaseClass 0cae2e24 
MyApplication!SomeBaseClass
   +0x000 __VFN_table : 0x02de89e4 
   +0x038 basefield1         : (null) 
   +0x03c basefield2        : 3

0:000> dt SomeDerivedClass 0cae2e24 
MyApplication!SomeDerivedClass
   +0x000 __VFN_table : 0x02de89e4 
   +0x038 basefield1        : (null) 
   +0x03c basefield2        : 3
   +0x040 derivedfield1     : 357
   +0x044 derivedfield2     : timecode_t

私がWinDbgにいるとき、私はこれを行うことができます:

dt 0x02de89e4 

そしてそれはタイプを示します:

0:000> dt 0x02de89e4 
SomeDerivedClass::`vftable'
Symbol  not found.

しかし、どうすれば拡張機能内でそれを取得できますか?SearchMemory()を使用して'SomeDerivedClass :: `vftable'を検索できますか?他の質問に従う場合は、このタイプ情報が必要なので、作成するラッパーリモートクラスのタイプがわかります。文字列を型に一致させる必要がある、ある種のcaseステートメントになる可能性があると思いますか?私はそれで大丈夫ですが、問題のオブジェクトのタイプを表すその文字列をどこで取得できるかはまだわかりません(つまり、上記の例ではSomeObject-> field1)。

4

1 に答える 1

1

DOH!思ったよりずっと簡単でした。仮想関数テーブルは単なる他のシンボルなので、field1のvftableのアドレスでGetSymbol()を使用できます。次に、私が期待するいくつかのタイプでcaseステートメントを設定し、状況に適したタイプを作成します。

例えば:

char buffer[255];
ULONG64 displacement;
GetSymbol(0x02de89e4,buffer, &displacement);

dprintf("0x%08lx = %s\n", 0x02de89e4, buffer);

WinDbgで拡張機能を実行すると、次のように出力されます。

0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'

単純。そのバッファを解析する必要があり、私は行ってもいいはずです...

于 2010-04-07T01:40:36.727 に答える