1

クラスの 1 つは、次の sos コマンドで検出されたように、.NET ヒープに多数のオブジェクトが存在します。

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

ObjSizeが 5 MB を超えるオブジェクトのインスタンスを見つける必要があります。以下を使用して、MyClass の 1700 個のインスタンスすべてのobjsizeを一覧表示できることはわかっています。

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

上記のスクリプトでは、5MB を超えるオブジェクト インスタンスがありますが、結果が得られません。objsize の出力が次のようになることが問題かもしれないと思います

20288 (0x4f40) bytes

しきい値との比較を困難にする文字列です。このスクリプトで objsize が 5MB を超えるオブジェクトのみを一覧表示するにはどうすればよいですか?

4

2 に答える 2

1

WinDbg で複雑なスクリプトを作成すると、エラーが発生しやすくなります。そのような状況では、Python を使用する WinDbg 拡張機能であるPyKdに切り替えます。

以下では、パズルの欠けている部分のみを取り上げます。これは機能しない部分です。

.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()。私が行った方法では、サイズが 10 進数で出力されるようになりましたが、明示的ではありません。0n明確にするために接頭辞を出力したいかもしれません。

于 2016-10-20T07:05:45.403 に答える