Debugging 查找从基类继承的所有实例

Debugging 查找从基类继承的所有实例,debugging,clr,windbg,sos,Debugging,Clr,Windbg,Sos,在WinDbg中,我使用了!name2ee查找基类的EEClass和MethodTable。 如何找到从该特定类型继承的所有实例?我希望有一个简单的答案,其他人可以比这更容易解决 背景资料 以可以从输出中获取地址的方式转储所有对象:!转储堆-短 循环所有这些对象.foreach(adr{!dumpheap-short}){…} 方法表将是对象地址的第一个指针大小字节,因此不是!执行要查找方法表,也可以执行?poi() !dumpmt没有列出基类,因此您需要自己查找它。在64位上,基类相距16字节

在WinDbg中,我使用了!name2ee查找基类的EEClass和MethodTable。
如何找到从该特定类型继承的所有实例?

我希望有一个简单的答案,其他人可以比这更容易解决

背景资料
  • 以可以从输出中获取地址的方式转储所有对象:
    !转储堆-短

  • 循环所有这些对象
    .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);} }