这与my previous question有关,关于从dmp文件中提取对象。
正如我在上一个问题中提到的,我可以通过创建包装器'remote'对象成功地将对象拉出dmp文件。到目前为止,我已经实现了其中的几个,它似乎运行良好。但是我遇到了障碍。
在一种情况下,指针存储在一个类中,比如'SomeBaseClass'类型,但该对象实际上是'SomeDerivedClass'类型,它派生自'SomeBaseClass'。例如,它将是这样的:
MyApplication!SomeObject
+0x000 field1 : Ptr32 SomeBaseClass
+0x004 field2 : Ptr32 SomeOtherClass
+0x008 field3 : Ptr32 SomeOtherClass
我需要一些方法来找出ACTUAL类型的'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)。
答案 0 :(得分: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'
简单。只需要解析那个缓冲区,我应该好好去...