19

windbg を使用して !dumpheap コマンドを実行してオブジェクトのアドレスを表示する場合、特定の数のオブジェクトに制限するにはどうすればよいですか。私が見つけた唯一の方法は、ブログhttp://dotnetdebug.ne​​t /2005/07/04/dumpheap-parameters-and-some-general-information-on-sos-help-system で CTRL+BREAK とコマンド ラインを使用することでした。 /

-l X - すべてのオブジェクトではなく、各ヒープから X 項目のみを出力します。

どうやら -l は SOS.dll に存在しなくなりました

4

2 に答える 2

9

どの基準に従って出力数を制限しますか? -l オプションは、行番号に従って出力を制限するだけです。これは役に立ちません: 最初の 10 個のオブジェクトしか表示されていないとしましょう。探しているオブジェクトがリストにない可能性もあります。

WinDbgs 出力ウィンドウに対して出力が長すぎる場合は、.logopen を使用してオブジェクトをファイルにダンプし、テキスト エディターでファイルを確認します。

オブジェクトがどのように見えるか他のアイデアがある場合は、すべてのオブジェクトに対してループを実行できます

.foreach ( obj { !dumpheap -short -type MyType} )

次に.if、オブジェクトがこの基準に一致するかどうかを判断します。

例として、干し草の山から針を探していました。ヒープに 3000 を超える Hashtable があるプログラムで特定の Hashtable を検索していました。私が使用しようとしたコマンドは

.foreach ( obj { !dumpheap -short -type Hashtable }) {.if (poi(poi(${obj}+1c)) > 100) {!do ${obj}} }

1Cハッシュテーブルのカウント メンバーのオフセットです。

100Hashtable が少なくとも持つと予想されるアイテムの数です。

!dumpheap -type残念ながら、デバッガーを何らかの形でクラッシュさせた HashtableEnumerators もリストされていたため、Hashtables ではすぐには機能しませんでした。

ハッシュテーブルのみをダンプするに!dumpheap -statは、ハッシュテーブルのメソッドテーブルを実行して把握し、-mt <methodtable>代わりに を使用してコマンドを実行し-type <classname>ます。

.foreach ( obj { !dumpheap -short -mt <MT of Hashtable> }) {.if (poi(poi(${obj}+1c)) > 100) {!do ${obj}} }
于 2010-10-19T21:14:36.523 に答える
9

あなたは実際に何を探していますか?個々のオブジェクトを見る前に、関心のある領域を絞り込むのが通常です。

–stat スイッチは、ヒープ上のオブジェクトの種類ごとに概要を表示します。

DumpHeap [-stat] [-min][-max] [-thinlock] [-mt] [-type][start [end]]

  • -stat オプションは、出力を統計タイプの要約に制限します。
  • -min オプションは、バイト単位で指定された size パラメーターより小さいオブジェクトを無視します。
  • -max オプションは、バイト単位で指定された size パラメーターより大きいオブジェクトを無視します。
  • -thinlock オプションは、ThinLocks を報告します。詳細については、SyncBlk コマンドを参照してください。
  • -mt オプションは、指定された MethodTable 構造に対応するオブジェクトのみをリストします。
  • -type オプションは、型名が指定された文字列の部分文字列に一致するオブジェクトのみを一覧表示します。

start パラメーターは、指定されたアドレスからリストを開始します。end パラメーターは、指定されたアドレスでリストを停止します。

参照

于 2009-01-31T08:15:21.690 に答える