2016-10-19 58 views
1

如通過以下sos命令發現的,.NET類堆中存在許多對象。尺寸大於閾值的搜索對象

!dumpheap -stat -type MyClass 
Statistics: 
       MT Count TotalSize Class Name 
00007ff8e6253494  1700  164123 MyNameSpace.MyClass 

我需要找到那些具有更大的ObjSize然後5 MB對象的實例。我知道我可以使用以下內容列出所有1700個MyClass實例中的objsize

.foreach (res {!DumpHeap -short -MT 00007ff8e6253494 }) {.if ((!objsize res) > 41943040) {.echo res; !objsize res}} 

對於上面的腳本,儘管存在大於5MB的對象實例,但我沒有得到任何結果。我認爲問題可能是objsize的輸出如下

20288 (0x4f40) bytes 

它的字符串使得它難以與任何閾值進行比較。我怎樣才能讓這個腳本只列出objsize大於5MB的對象呢?

+0

我刪除了我的答案,因爲我不小心發佈相當於!objsize的解決方案。 –

回答

1

在WinDbg中創建複雜的腳本很容易出錯。在這種情況下,我切換到PyKd,這是一個使用Python的WinDbg擴展。

在下面,我將只包括在您的難題,這是部分缺少的部分不工作:

.if ((!objsize res) > 41943040) {.echo res; !objsize res} 

這裏是我的出發點:

0:009> !dumpheap -min 2000 
     Address    MT  Size 
00000087c6041fe8 000007f81ea5f058 10158  
00000087d6021018 000007f81ea3f1b8  8736  
00000087d6023658 000007f81ea3f1b8  8192  
00000087d6025658 000007f81ea3f1b8 16352  
00000087d6029638 000007f81ea3f1b8 32672 

你可以編寫一個腳本

from pykd import * 
import re 
import sys 
objsizeStr = dbgCommand("!objsize "+sys.argv[1]) 
number = re.search("= (.*)\(0x", objsizeStr) 
size = int(number.group(1)) 
if size > 10000: 
    print sys.argv[1], size 

和你的循環中使用它(沒有錯誤處理!):

0:009> .foreach (res {!dumpheap -short -min 2000}) { !py c:\tmp\size.py ${res}} 
00000087c6041fe8 10160 
00000087d6021018 37248 
00000087d6023658 27360 
00000087d6025658 54488 
00000087d6029638 53680 

注意如何!objsize大小從的!dumpheap不同。只是爲了交叉檢查:

0:009> !objsize 00000087d6023658 
sizeof(00000087d6023658) = 27360 (0x6ae0) bytes (System.Object[]) 

見,關於如何提高使用expr(),這樣就可以通過表情等我做到了,現在在輸出小數點大小的方式劇本也this answer,但是這並不明確。也許你想輸出一個0n前綴來說清楚。 !

+0

好點。我將它包括在內,但是,我在這裏問的是如何將包含十進制,十六進制和單位(字節)大小的objsize的返回值與閾值進行比較。 –

+1

@pauldeter:我更新了答案 –

0

以及史蒂夫評論dumpeap取最小值和最大值參數,並與它應該有可能做到這一點本身

0:004> DumpHeap型System.String -stat

Statistics: 
     MT Count TotalSize Class Name 
6588199c  1   12 System.Collectionsxxxxx 
65454aec  1   48 System.Collectionsxxxxx 
65881aa8  1   60 System.Collectionsxxxxx 
6587e388  17   596 System.String[] 
6587d834  168   5300 System.String 
Total 188 objects 

0:004> DumpHeap型System.String -stat -min 0n64 -max 0n100

Statistics: 
     MT Count TotalSize Class Name 
6587e388  3   212 System.String[] 
6587d834  9   684 System.String 
Total 12 objects 

0:004>!DumpHeap型系統。串-min 0n64 -max 0n100

Address  MT  Size 
01781280 6587d834  76  
01781354 6587d834  78  
01781478 6587e388  84  
017816d8 6587d834  64  
01781998 6587d834  78  
017819e8 6587d834  70  
01781a30 6587d834  82  
01782974 6587d834  78  
01782a6c 6587d834  90  
01782c7c 6587d834  68  
01783720 6587e388  64  
01783760 6587e388  64  

Statistics: 
     MT Count TotalSize Class Name 
6587e388  3   212 System.String[] 
6587d834  9   684 System.String 
Total 12 objects 

操縱最大值,最小值,我們可以微調到僅一個或兩個對象
,我們有1個物體上多餘的上側和上下側
2個對象額外的示例 從輸出前述此(15個對象對12級的對象)

0:004> DumpHeap型System.String -min 0n62 -max 0n106

Address  MT  Size 
01781280 6587d834  76  
01781354 6587d834  78  
017813e8 6587d834  62  
01781478 6587e388  84  
017816d8 6587d834  64  
01781898 6587d834  106  
01781998 6587d834  78  
017819e8 6587d834  70  
01781a30 6587d834  82  
01782974 6587d834  78  
01782a6c 6587d834  90  
01782c7c 6587d834  68  
01783720 6587e388  64  
01783760 6587e388  64  
01783e4c 6587d834  62  

Statistics: 
     MT Count TotalSize Class Name 
6587e388  3   212 System.String[] 
6587d834  12   914 System.String 
Total 15 objects 

如果一個人既需要出於某種原因,地址和大小一個總是可以在awk它

0: 「DumpHeap型System.String -min 0n62 -max 0n106」 004> .shell -ci AWK「{打印$ 1,$ 3}「

Address Size 
01781280 76 
01781354 78 
017813e8 62 
01781478 84 
017816d8 64 
01781898 106 
01781998 78 
017819e8 70 
01781a30 82 
01782974 78 
01782a6c 90 
01782c7c 68 
01783720 64 
01783760 64 
01783e4c 62 
+1

Steve後來刪除了他的回覆,因爲dumpheap沒有提供包含的大小,而基於包含對象的問題包含的大小是需要的。 – BKS

+0

我不確定我是否會在本地調用awk * * –

+0

確定有awk克隆擴展iirc mex – blabb