如何使用WinDbg在托管核心转储中找到N个最大的字符串?

时间:2017-07-22 21:34:54

标签: .net windbg

我有一个包含26GB字符串的转储 - 超过350万个字符串。大对象堆只有18个略大于2.5MB - 使用!sosex.dumpgen命令检查。

Gen 2有大部分。我怎样才能获得N最大值,除非将它们全部放入日志文件然后在WinDbg之外进行分析?

2 个答案:

答案 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命令。

嘿,那不容易吗?输出到文本文件有时是一个非常好的解决方案......