Debugging 查找从基类继承的所有实例
在WinDbg中,我使用了!name2ee查找基类的EEClass和MethodTable。Debugging 查找从基类继承的所有实例,debugging,clr,windbg,sos,Debugging,Clr,Windbg,Sos,在WinDbg中,我使用了!name2ee查找基类的EEClass和MethodTable。 如何找到从该特定类型继承的所有实例?我希望有一个简单的答案,其他人可以比这更容易解决 背景资料 以可以从输出中获取地址的方式转储所有对象:!转储堆-短 循环所有这些对象.foreach(adr{!dumpheap-short}){…} 方法表将是对象地址的第一个指针大小字节,因此不是!执行要查找方法表,也可以执行?poi() !dumpmt没有列出基类,因此您需要自己查找它。在64位上,基类相距16字节
如何找到从该特定类型继承的所有实例?我希望有一个简单的答案,其他人可以比这更容易解决 背景资料
!转储堆-短
.foreach(adr{!dumpheap-short}){…}
!执行
要查找方法表,也可以执行?poi()
!dumpmt
没有列出基类,因此您需要自己查找它。在64位上,基类相距16字节,因此要从对象地址获取基类的类型,可以执行!dumpmt poi(poi()+0x10)
。您可以重复该操作以获取基类:!dumpmt poi(poi()+0x10)+0x10)
您可以重复此操作,直到指针为0x00000000,这意味着您已经到达System.Object,并且没有更多的基类
由于您希望自动化此过程,因此还需要将其放入循环中:
r$t0=poi();
.while(@$t0){.if(@$t0==){…};r$t0=poi(@$t0+0x10);}
.echo${adr}
或转储它:!执行${adr}
Exception
作为示例。由于在任何.NET程序中都会出现StackOverflowException
、OutOfMemoryException
和ExecutionEngineeException
,因此如果您尝试它,它至少会找到三个对象
0:021> !name2ee *!System.Exception
Module: 000007fef2091000
Assembly: mscorlib.dll
Token: 0000000002000005
MethodTable: 000007fef2776738
EEClass: 000007fef214d7b0
Name: System.Exception
所以我要查找的
参数是000007fef276738
完整的语句现在是(为可读性而格式化):
或(为复制和粘贴而格式化):
.foreach ( adr {!dumpheap -short}) {
r$t0 =poi(${adr});
.while(@$t0) {
.if(@$t0 == 000007fef2776738) {!do ${adr}};
r$t0=poi(@$t0+0x10);
}
}
.foreach ( adr {!dumpheap -short}) { r$t0 =poi(${adr}); .while(@$t0) { .if(@$t0 == 000007fef2776738) {!do ${adr}}; r$t0=poi(@$t0+0x10);} }