0

通过使用命令!dumpgen 2 -stat,我发现有3GB的字符串,23,531,124 3,110,704,598 System.String,如果我将它们全部转储,它将挂起windbg,有什么办法我只能在Gen中转储有限的大对象结果只有2个?因此我可以转储这些对象并查看它们是什么。同样要求 LOH。提前感谢您的帮助。

4

1 回答 1

0

文本与字符串的实例内联存储。您可以使用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 "

我希望这会有所帮助。

于 2018-11-05T13:38:50.033 回答