我有一個轉儲,有26GB的字符串 - 超過350萬字符串。大型對象堆只有18個佔用略多於2.5MB - 使用!sosex.dumpgen
命令進行檢查。如何使用WinDbg在管理的核心轉儲中查找N個最大的字符串?
第2代有他們中的大多數。我怎麼能得到最大的N,除了把它們全部寫入一個日誌文件,然後在WinDbg之外分析它?
我有一個轉儲,有26GB的字符串 - 超過350萬字符串。大型對象堆只有18個佔用略多於2.5MB - 使用!sosex.dumpgen
命令進行檢查。如何使用WinDbg在管理的核心轉儲中查找N個最大的字符串?
第2代有他們中的大多數。我怎麼能得到最大的N,除了把它們全部寫入一個日誌文件,然後在WinDbg之外分析它?
我認爲這是可能的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項。通過你想要的項目數減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}
更換0n2
現在我們知道前N個字符串的最小長度,我們可以再次將其應用到原來的!wfrom
命令。
嘿,是不是很容易?輸出到一個文本文件有時是一個很好的解決方案...
sosex具有!字符串,其具有一個開關,其中我們可以指定 分鐘長度命令。
對不起,我不在一臺機器,我可以嘗試sosex。但它應該像!串-m 1000。你可以試試soshelp命令並獲得這個!sosex.help字符串這將打印所有隻有1000多個字符串的字符串。像這樣我用來嘗試賦予10000的大值並獲取大字符串。
哦,男孩,我最終輸出到一個文本文件的整個內容'!dumpheap -mt 00007fff6c9c16b8',其中'00007fff6c9c16b8'是字符串的MT 。 – mark