获取 LOH 中的对象实例列表

pau*_*ter 5 .net windbg sos large-object-heap sosex

我在托管堆中存在数百个MyClass实例。其中一些位于大对象堆中。下面是各种堆结构的样子

0:000> !EEHeap -gc
Number of GC Heaps: 1
generation 0 starts at 0x0000000002df9de8
generation 1 starts at 0x0000000002dc6710
generation 2 starts at 0x0000000002a01000
ephemeral segment allocation context: none
 segment     begin allocated  size
0000000002a00000  0000000002a01000  0000000002e3c2c0  0x43b2c0(4436672)
Large object heap starts at 0x0000000012a01000
 segment     begin allocated  size
0000000012a00000  0000000012a01000  000000001a5ed558  0x7bec558(129942872)
000000002a980000  000000002a981000  00000000328110b8  0x7e900b8(132710584)
0000000033e00000  0000000033e01000  000000003bd80d78  0x7f7fd78(133692792)
000000001daf0000  000000001daf1000  0000000025996188  0x7ea5188(132796808)
00000000542b0000  00000000542b1000  000000005a4bf100  0x620e100(102818048)
000000005c2b0000  000000005c2b1000  000000006344df88  0x719cf88(119132040)
000000007fff0000  000000007fff1000  00000000878bfbc0  0x78cebc0(126675904)
Total Size:              Size: 0x34956418 (882205720) bytes.
------------------------------
GC Heap Size:            Size: 0x34956418 (882205720) bytes.
Run Code Online (Sandbox Code Playgroud)

我的问题是
1. 如何找到大对象堆中MyClass的所有实例的地址。
2. 是否可以在大对象堆中的MyClass实例上运行 !ObjSize?

Tho*_*ler 7

要获取 LOH 上的所有对象,您可以使用 SOS!dumpheap选项-min

!dumpheap -min 85001
Run Code Online (Sandbox Code Playgroud)

要将输出限制为您要查找的对象类型,请首先通过执行以下操作来确定对象的方法表 (MT)

!dumpheap -type <MyClass>

 Address       MT     Size
03653250 785037b8 10485776
...
Run Code Online (Sandbox Code Playgroud)

由于!dumpheap将在类中查找子字符串,因此需要将输出真正减少为类的类型。然后使用-mt您找到的方法表:

!dumpheap -min 85001 -mt <MethodTable>
Run Code Online (Sandbox Code Playgroud)

要仅最小化到地址的输出,请添加参数-short,这样您就得到

!dumpheap -min 85001 -mt <MethodTable> -short
Run Code Online (Sandbox Code Playgroud)

然后您可以在 foreach 循环中使用这些地址

.foreach (address {!dumpheap -min 85001 -mt <MethodTable> -short}) {!do ${address}}
Run Code Online (Sandbox Code Playgroud)

由于在有多个对象的情况下输出可能会很大,因此请考虑将所有内容记录到文件中

.logopen c:\debug\logs\largeobjects.txt
Run Code Online (Sandbox Code Playgroud)