これは、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)。