我有一个包含26GB字符串的转储 - 超过350万个字符串。大对象堆只有18个略大于2.5MB - 使用!sosex.dumpgen
命令检查。
Gen 2有大部分。我怎样才能获得N最大值,除非将它们全部放入日志文件然后在WinDbg之外进行分析?
答案 0 :(得分:1)
sosex有!strings 命令,它有一个我们可以指定的开关 最小长度。
抱歉,我不在我可以试用sosex的机器附近。但它应该像例如!strings -m 1000。您可以尝试使用soshelp命令并获取此!sosex.help字符串这将打印所有仅超过1000的字符串。就像我以前尝试提供10000这样的大值并获得大字符串一样。
答案 1 :(得分:1)
我认为可以使用Netext,但它只接近SOSEx' !strings
,因此需要更多脚本
0:000> .load F:\...\netext\2.0.1.5580\x86\NetExt.dll
NetExt version 2.0.1.5580 Aug 3 2015
License and usage can be seen here: !whelp license
Check Latest version: !wupdate
For help, type !whelp (or in WinDBG run: '.browse !whelp')
Questions and Feedback: http://netext.codeplex.com/discussions
Copyright (c) 2014-2015 Rodney Viana (http://blogs.msdn.com/b/rodneyviana)
Type: !windex -tree or ~*e!wstack to get started
0:000> !windex
Starting indexing at 20:55:54
Indexing finished at 20:55:54
30,707 Bytes in 343 Objects
Index took 00:00:00
0:000> !wfrom /nofield /type System.String where (m_stringLength>50) select m_stringLength
0n100
0n137
0n130
0n100
...
要删除0n
前缀,我们使用$substr(m_stringLength,2,100)
。
像这样我们可以概览字符串的长度。这个列表需要一些排序,所以让我们使用.shell
和DOS sort /R
命令:
!! -ci "!wfrom /nospace /nofield /type System.String where (m_stringLength>50) select $substr(m_stringLength,2,100)" sort /R
从结果中,让我们使用循环获取前N个项目并跳过一些项目。将0n2
替换为您想要的项目数减去1。
.foreach /pS 0n2 /ps 999999 (length {!! -ci "!wfrom /nospace /nofield /type System.String where (m_stringLength>50) select $substr(m_stringLength,2,100)" sort /R}) {.echo length}
现在我们知道前N个字符串的最小长度,我们可以再次将它应用于原始的!wfrom
命令。