C++ 如何在运行时从Windbg扩展名中的DMP文件中获取类型信息?
这与从dmp文件中提取对象有关 正如我在前面的问题中提到的,通过创建包装器“远程”对象,我可以成功地将对象从dmp文件中拉出。到目前为止,我已经实现了其中的几个,而且似乎工作得很好。然而,我遇到了一个障碍 在一种情况下,指针存储在一个类中,比如“SomeBaseClass”类型,但该对象实际上是从“SomeBaseClass”派生的“SomeDerivedClass”类型。例如,它可能是这样的:C++ 如何在运行时从Windbg扩展名中的DMP文件中获取类型信息?,c++,object,types,windbg,memory-dump,C++,Object,Types,Windbg,Memory Dump,这与从dmp文件中提取对象有关 正如我在前面的问题中提到的,通过创建包装器“远程”对象,我可以成功地将对象从dmp文件中拉出。到目前为止,我已经实现了其中的几个,而且似乎工作得很好。然而,我遇到了一个障碍 在一种情况下,指针存储在一个类中,比如“SomeBaseClass”类型,但该对象实际上是从“SomeBaseClass”派生的“SomeDerivedClass”类型。例如,它可能是这样的: MyApplication!SomeObject +0x000 field1
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)。DOH!这比我想象的要简单得多。虚拟函数表只是其他符号,因此我可以使用GetSymbol()和field1的vftable的地址。然后简单地用我期望的几种类型设置一个case语句,并针对这种情况创建一个正确的case语句 例如:
char buffer[255];
ULONG64 displacement;
GetSymbol(0x02de89e4,buffer, &displacement);
dprintf("0x%08lx = %s\n", 0x02de89e4, buffer);
在WinDbg中,当我运行扩展时,此输出:
0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'
简单。只要解析缓冲区,我就可以开始了…DOH!这比我想象的要简单得多。虚拟函数表只是其他符号,因此我可以使用GetSymbol()和field1的vftable的地址。然后简单地用我期望的几种类型设置一个case语句,并针对这种情况创建一个正确的case语句 例如:
char buffer[255];
ULONG64 displacement;
GetSymbol(0x02de89e4,buffer, &displacement);
dprintf("0x%08lx = %s\n", 0x02de89e4, buffer);
在WinDbg中,当我运行扩展时,此输出:
0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'
简单。只要解析缓冲区,我就可以开始了…问得好,回答得好!很好的问题和答案!