通过使用命令!dumpgen 2 -stat,我发现有3GB字符串,23,531,124 3,110,704,598 System.String,如果我转储所有这些,它会挂起windbg,有什么方法我只能转储有限的大对象结果只有Gen 2?因此,我可以转储这些对象,看看它们是什么。同样请求LOH。提前感谢您的帮助。
答案 0 :(得分:0)
文本与String实例一起内联存储。您可以使用du
从实例中转储Unicode字符。这是一个例子。我使用03ec5528
找到的地址!dumpstat
上有一个很长的字符串。转储我得到:(我从输出中剪切了大部分字符串),而您不需要转储对象-只是为了说明我在示例中使用的内容。
0:000> !DumpObj 03ec5528
Name: System.String
MethodTable: 7235d6d8
EEClass: 71f34a50
Size: 135808(0x21280) bytes
File: C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
String: Lorem ipsum dolor sit amet, consectetur adipiscing elit. (I HAVE CUT MOST OF THE STRING FROM THE OUTPUT)
Fields:
MT Field Offset Type VT Attr Value Name
7235f52c 4000275 4 System.Int32 1 instance 67897 m_stringLength
7235e120 4000276 8 System.Char 1 instance 4c m_firstChar
7235d6d8 400027a 54 System.String 0 shared static Empty
>> Domain:Value 00f25e58:NotInit <<
要列出文本,请使用du
及其基地址和偏移量(32位为+8)。使用du
的默认输出将产生以下文本。您可以通过提供命令范围来控制长度输出。
0:000> du 03ec5528+8
03ec5530 "Lorem ipsum dolor sit amet, cons"
03ec5570 "ectetur adipiscing elit. Integer"
03ec55b0 " in dapibus urna, sed lobortis o"
03ec55f0 "rci. Integer sapien nunc, rutrum"
03ec5630 " id libero sollicitudin, interdu"
03ec5670 "m ornare velit. Aenean porttitor"
03ec56b0 " convallis vulputate. Nunc at au"
03ec56f0 "gue a nibh finibus commodo. Morb"
03ec5730 "i volutpat eleifend nunc vel mat"
03ec5770 "tis. Mauris accumsan, est ac fri"
03ec57b0 "ngilla interdum, purus mi euismo"
03ec57f0 "d purus, ac dapibus massa dolor "
我希望能有所帮助。