SOS デバッガ拡張 (SOS.dll)
更新 : 2007 年 11 月
SOS デバッガ拡張 (SOS.dll) を使用して内部の共通言語ランタイム (CLR: Common Language Runtime) 環境に関する情報を渡すことにより、WinDbg.exe デバッガおよび Visual Studio でマネージ プログラムをデバッグできます。
![command] [options]
コマンド
コマンド |
説明 |
---|---|
BPMD [<module name> <method name>] [-md <MethodDesc>] |
指定したモジュールの指定したメソッドにブレークポイントを作成します。 指定したモジュールとメソッドが読み込まれていない場合、このコマンドは、モジュールが読み込まれ、Just-In-Time コンパイルが終了したことを示す通知を受け取るまで待機してから、ブレークポイントを作成します。 |
CLRStack [-a] [-l] [-p] |
マネージ コードのみのスタック トレースを提供します。 -p オプションは、マネージ関数に渡す引数を表示します。 -l オプションは、フレーム内のローカル変数に関する情報を表示します。SOS デバッガ拡張はローカル名を取得できないため、ローカル名の出力は <local address> = <value> の形式になります。 -a (すべて) オプションは、-l と -p の組み合わせへのショートカットです。 x64 ベースおよび IA-64 ベースのプラットフォーム上では、SOS デバッガ拡張で遷移フレームは表示されません。 |
COMState |
COM アパートメント モデルを使用可能な場合、各スレッドと Context ポインタについてモデルを一覧表示します。 |
DumpArray [-start <startIndex>] [-length <length>] [-details] [-nofields] <array object address> または DA [-start <startIndex>] [-length <length>] [-detail] [-nofields] array object address> |
配列オブジェクトの要素を調べます。 -start オプションは、要素の表示を始めるインデックス位置を指定します。 -length オプションは、表示する要素の数を指定します。 -detail オプションは、DumpObj 形式および DumpVC 形式を使用して要素の詳細を表示します。 -nofields オプションは、配列が表示されないようにします。-detail オプションを指定した場合にのみこのオプションを使用できます。 |
DumpAssembly <Assembly address> |
アセンブリに関する情報を表示します。 DumpAssembly コマンドは、複数のモジュールが存在する場合はそれらを一覧表示します。 DumpDomain コマンドを使用するとアセンブリ アドレスを取得できます。 |
DumpClass <EEClass address> |
型に関連付けられている EEClass 構造体に関する情報を表示します。 DumpClass コマンドを実行すると静的なフィールド値は表示されますが、静的でないフィールド値は表示されません。 DumpMT、DumpObj、Name2EE、または Token2EE コマンドを使用して EEClass 構造体のアドレスを取得します。 |
DumpDomain [<Domain address>] |
指定した AppDomain オブジェクトのアドレス内に読み込まれている各 Assembly オブジェクトを列挙します。パラメータを指定しないで呼び出すと、DumpDomain コマンドはプロセス内のすべての AppDomain オブジェクトを一覧表示します。 |
DumpHeap [-stat] [-min <size>][-max <size>] [-thinlock] [-mt <MethodTable address>] [-type <partial type name>][start [end]] |
ガベージ コレクトされたヒープと、オブジェクトの収集統計に関する情報を表示します。 ガベージ コレクタ ヒープが過剰に断片化されていることを DumpHeap コマンドが検出すると、警告が表示されます。 -stat オプションは、統計的な型の概要のみを出力するよう制限を加えます。 -min オプションは、バイト単位で指定した size パラメータ未満のオブジェクトを無視します。 -max オプションは、バイト単位で指定した size パラメータを超えるオブジェクトを無視します。 -thinlock オプションは、ThinLocks を報告します。詳細については、SyncBlk コマンドを参照してください。 -mt オプションは、指定した MethodTable 構造体に対応するオブジェクトのみを一覧表示します。 -type オプションは、指定した文字列に対して部分文字列一致する型名を持つオブジェクトのみを一覧表示します。 start パラメータは、指定したアドレスから一覧表示を開始します。 end パラメータは、指定したアドレスで一覧表示を終了します。 |
DumpIL [<DynamicMethod address>] [<DynamicMethodDesc address>] [<MethodDesc address>] |
マネージ メソッドに関連付けられている中間言語 (IL: Iintermediate Language) を表示します。 動的な IL は、アセンブリから読み込まれた IL とは異なる形式で出力されます。動的な IL は、メタデータ トークンではなくマネージ オブジェクト配列内のオブジェクトを参照します。 |
DumpLog [<Filename>] |
メモリ内ストレス ログの内容を、指定したファイルに書き込みます。名前を指定しないと、現在のディレクトリ内に Stresslog.txt という名前のファイルが作成されます。 共通言語ランタイムは、ストレス エラーの診断に役立つメモリ内ストレス ログを提供します。このログで、ロックまたは I/O を使用せずにエラーを診断できます。ストレス ログを有効にするには、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework の下に次のレジストリ キーを設定します。 (DWORD) StressLog = 1 (DWORD) LogFacility = 0xffffffff (DWORD) StressLogSize = 65536 |
DumpMD <MethodDesc address> |
指定したアドレスにある MethodDesc 構造体に関する情報を表示します。 IP2MD コマンドを使用すると、マネージ関数から MethodDesc 構造体のアドレスを取得できます。 |
DumpMT [-MD] <MethodTable address> |
指定したアドレスにあるメソッド テーブルに関する情報を表示します。-MD オプションを指定すると、オブジェクトに定義されているすべてのメソッドの一覧が表示されます。 各マネージ オブジェクトにメソッド テーブルのポインタが含まれています。 |
DumpMethodSig <sigaddr> <moduleaddr> |
指定したアドレスにある MethodSig 構造体に関する情報を表示します。 |
DumpModule [-mt] <Module address> |
指定したアドレスにあるモジュールに関する情報を表示します。-mt オプションは、モジュール内に定義されている型とモジュールから参照される型を表示します。 DumpDomain コマンドまたは DumpAssembly コマンドを使用すると、モジュールのアドレスを取得できます。 |
DumpObj <object address> または DO <object address> |
指定したアドレスにあるオブジェクトに関する情報を表示します。DumpObj コマンドを実行すると、フィールド、EEClass 構造体の情報、メソッド テーブル、およびオブジェクトのサイズが表示されます。 DumpStackObjects コマンドを使用すると、オブジェクトのアドレスを取得できます。 CLASS 型のフィールドはオブジェクトであるため、この型に対しても DumpObj コマンドを実行できます。 |
DumpRuntimeTypes |
ガベージ コレクタ ヒープの中にあるランタイムの型オブジェクトを表示し、それらに関連付けられている型名とメソッド テーブルを一覧表示します。 |
DumpStack [-EE] [top stack [bottom stack]] |
スタック トレースを表示します。 DumpStack コマンドで -EE オプションを指定すると、マネージ関数のみが表示されます。top パラメータおよび bottomパラメータを使用して、x86 プラットフォーム上で表示するスタック フレームを制限します。 x86 プラットフォーム上では、DumpStack コマンドによって詳細なスタック トレースが作成されます。 x64 プラットフォームおよび IA-64 ベースのプラットフォーム上では、DumpStack コマンドはデバッガの K コマンドと同様の動作を実行します。x64 プラットフォームおよび IA-64 ベースのプラットフォーム上では、top パラメータと bottomパラメータは無視されます。 |
DumpSig <sigaddr> <moduleaddr> |
指定したアドレスにある Sig 構造体に関する情報を表示します。 |
DumpStackObjects [-verify] [top stack [bottom stack]] または DSO [-verify] [top stack [bottom stack]] |
現在のスタックの範囲内で見つかったすべてのマネージ オブジェクトを表示します。 -verify オプションは、オブジェクト フィールドの静的でない各 CLASS フィールドを検証します。 K コマンド、CLRStack コマンドなどのスタック トレース コマンドと共に DumpStackObject コマンドを使用して、ローカル変数とパラメータの値を確認します。 |
DumpVC <MethodTable address> <Address> |
指定したアドレスにある値クラスのフィールドに関する情報を表示します。 DumpVC コマンドで MethodTable パラメータを指定すると、フィールドを正しく解釈できます。値クラスでは、最初のフィールドがメソッド テーブルになることはありません。 |
EEHeap [-gc] [-loader] |
内部の共通言語ランタイム データ構造体によって消費されるプロセス メモリに関する情報を表示します。 -gc オプションと -loader オプションは、このコマンドによる出力を、ガベージ コレクタまたはローダーのデータ構造体のいずれかに制限します。 ガベージ コレクタの場合、マネージ ヒープの各セグメントの範囲内にある情報が一覧表示されます。ポインタが EEHeap -gc で指定されたセグメント内にある場合、そのポインタはオブジェクト ポインタです。 |
EEStack [-short] [-EE] |
プロセス内のすべてのスレッドに対して DumpStack コマンドを実行します。 -EE オプションは、DumpStack コマンドに直接渡されます。-short パラメータは、次の種類のスレッドに制限してその内容を出力します。
|
EEVersion |
共通言語ランタイムのバージョンを表示します。 |
EHInfo [<MethodDesc address>] [<Code address>] |
指定したメソッドの例外処理ブロックを表示します。このコマンドを使用すると、句ブロック (try ブロック) およびハンドラ ブロック (catch ブロック) のコード アドレスとオフセットが表示されます。 |
FinalizeQueue [-detail] |
完了の目的で登録されているすべてのオブジェクトを表示します。 -detail オプションは、クリーンアップの実行を待っているすべての SyncBlocks に関する追加情報およびクリーンアップの実行を待っているすべての RuntimeCallableWrappers (RCW) に関する特別な情報を表示します。両方のデータ構造体が、ファイナライザ スレッドでキャッシュされクリーンアップされます。 |
FindAppDomain <Object address> |
指定したアドレスにあるオブジェクトのアプリケーション ドメインを確認します。 |
GCHandles [-perdomain] |
プロセス内のガベージ コレクタ ハンドルに関する統計を表示します。 -perdomain オプションを渡し、アプリケーション ドメイン別に統計を再配置します。 GCHandles コマンドを使用して、ガベージ コレクタ ハンドルのリークによって発生するメモリ リークを検索します。たとえば、厳密なガベージ コレクタ ハンドルが大きな配列を指しているためコードがその配列を保持したままになっているときに、その配列を解放せずにハンドルを破棄すると、メモリ リークが発生します。 |
GCHandleLeaks |
プロセスの強力なガベージ コレクタ ハンドルおよび固定されたガベージ コレクタ ハンドルへの参照についてメモリ内を検索し、結果を表示します。ハンドルが見つかった場合、GCHandleLeaks コマンドは参照のアドレスを表示します。メモリ内にハンドルが見つからない場合、このコマンドは通知を表示します。 |
GCInfo <MethodDesc address><Code address> |
レジスタまたはスタックの場所にマネージ オブジェクトが格納された時期を示すデータを表示します。ガベージ コレクションを実行する場合は、コレクタはオブジェクトに対する参照の場所を把握しておく必要があります。その結果、新しいオブジェクト ポインタの値を使用して参照を更新できます。 |
GCRoot [-nostacks] <Object address> |
指定したアドレスにあるオブジェクトへの参照 (またはルート) に関する情報を表示します。 GCRoot コマンドは、マネージ ヒープ全体と、スタック上の他のオブジェクトおよびハンドル内にあるハンドルから成るハンドル テーブルを調べます。次に、オブジェクトへのポインタについて各スタックを検索し、さらにファイナライザ キューも検索します。 このコマンドは、スタック ルートが有効かまたは破棄されているかどうかを確認しません。スタック ルートが使用中であるかどうかを確認するには、CLRStack コマンドと U コマンドを使用して、ローカルまたは引数の値が属するフレームを逆アセンブルします。 -nostacks オプションは、ガベージ コレクタ ハンドルおよび到達可能なオブジェクトのみを検索するよう制限を加えます。 |
help [<command>] [<faq>] |
パラメータを指定しない場合は、使用できるすべてのコマンドを表示します。パラメータとしてコマンドを指定した場合は、そのコマンドに関する詳細なヘルプを表示します。 faq パラメータを指定すると、よく寄せられる質問に対する回答が表示されます。 |
IP2MD <Code address> |
Just-In-Time (JIT) コンパイルされているコード内の指定したアドレスにある MethodDesc 構造体を表示します。 |
MinidumpMode [0] [1] |
ミニダンプを使用するときに安全でないコマンドが実行されるのを防止します。 この機能を無効にするには 0 を渡し、機能を有効にするには 1 を渡します。既定では、MinidumpMode の値は 0 に設定されます。 .dump /m コマンドまたは .dump コマンドで作成されるミニダンプの内容は CLR 固有のデータに制限され、このミニダンプは SOS コマンドのサブセットでのみ正しく実行できます。一部のコマンドはメモリの必要領域が割り当てられていないか一部分しか割り当てられていないため、予期しないエラーが発生して失敗することがあります。このオプションは、ミニダンプに対して安全でないコマンドが実行されるのを防止します。 |
Name2EE <module name> <type or method name> または Name2EE <module name>!<type or method name> |
指定したモジュール内の指定した型またはメソッドの MethodTable 構造体および EEClass 構造体を表示します。 指定したモジュールをプロセスに読み込む必要があります。 適切な型名を取得するには、MSIL 逆アセンブラ (Ildasm.exe) を使用してモジュールを参照します。また、* を module name パラメータとして渡すと、読み込まれているすべてのマネージ モジュールを検索できます。module name パラメータには、mscorlib、image00400000 など、デバッガのモジュールの名前も指定できます。 このコマンドは、Windows のデバッガ構文 <module>!<type> をサポートします。型は、完全修飾する必要があります。 |
ObjSize [<Object address>] |
指定したオブジェクトのサイズを表示します。パラメータを指定しないで ObjSize コマンドを使用すると、マネージ スレッドで見つかったすべてのオブジェクトのサイズが表示され、プロセス内のすべてのガベージ コレクタ ハンドル、およびそれらのハンドルが指すオブジェクトのサイズの合計が表示されます。ObjSize コマンドの結果には、親オブジェクトに加え、すべての子オブジェクトのサイズが含まれます。 |
PrintException [-nested] [<Exception object address>] または PE [-nested] [<Exception object address>] |
指定したアドレスにある Exception クラスから派生したすべてのオブジェクトのフィールドが表示および書式設定されます。アドレスを指定しないで PrintException コマンドを使用すると、現在のスレッドで最後にスローされた例外が表示されます。 -nested オプションは、入れ子になった例外オブジェクトに関する詳細を表示します。 このコマンドを使用すると、バイナリ配列の _stackTrace フィールドを書式設定して表示できます。 |
ProcInfo [-env] [-time] [-mem] |
プロセスの環境変数、カーネル CPU 時間、およびメモリ使用率統計を表示します。 |
RCWCleanupList <RCWCleanupList address> |
指定したアドレスにあり、クリーンアップを待っているランタイム呼び出し可能ラッパーの一覧を表示します。 |
SaveModule <Base address> <Filename> |
メモリ内の指定したアドレスに読み込まれているイメージを、指定したファイルに書き込みます。 |
StopOnException [-derived] [-create | -create2] <Exception> <Pseudo-register number> |
指定した例外がスローされたときにデバッガを停止しますが、それ以外の例外がスローされたときは実行を続行します。 -derived オプションは、指定した例外、および指定した例外から派生したすべての例外をキャッチします。 |
SyncBlk [-all | <syncblk number>] |
指定した SyncBlock 構造体またはすべての SyncBlock 構造体を表示します。SyncBlk コマンドに引数を渡さない場合は、スレッドが所有しているオブジェクトに対応する SyncBlock 構造体が表示されます。 SyncBlock 構造体は、オブジェクトによっては作成する必要のないこともある追加情報のコンテナです。この構造体は、COM 相互運用機能データ、ハッシュ コード、およびスレッド セーフ操作用のロック情報を保持できます。 |
ThreadPool |
キュー内の作業要求の数、完了ポート スレッドの数、タイマの数を含め、マネージ スレッド プールに関する情報を表示します。 |
Token2EE <module name> <token> |
指定したモジュール内の指定したメタデータ トークンを MethodTable 構造体または MethodDesc 構造体に変換します。 module name パラメータに * を渡すと、読み込まれているすべてのマネージ モジュール内にあるそのトークンの割り当て先を検索できます。また、デバッガの mscorlib、image00400000 などのモジュール名を渡すこともできます。 |
Threads [-live] [-special] |
プロセス内のすべてのマネージ スレッドを表示します。 Threads コマンドを使用すると、デバッガの短縮 ID、共通言語ランタイムのスレッド ID、およびオペレーティング システムのスレッド ID が表示されます。さらに、Threads コマンドでは、スレッドを実行しているアプリケーション ドメインを示すドメイン列、COM アパートメント モードが表示される APT 列、およびスレッド内の最後にスローされた例外が表示される例外列が表示されます。 -live オプションは、ライブ スレッドに関連付けられているスレッドを表示します。 -special オプションは、CLR で作成されたすべての特殊なスレッドを表示します。特殊なスレッドには、同時実行 GC およびサーバー GC のガベージ コレクション (GC: Garbage Collection) スレッド、デバッガ ヘルパー スレッド、ファイナライザ スレッド、AppDomain アンロード スレッド、およびスレッドプール タイマ スレッドがあります。 |
TraverseHeap [-xml] <filename> |
ヒープ情報を、CLR プロファイラが処理できる形式で指定したファイルに書き込みます。TraverseHeap コマンドの -xml オプションを指定すると、ファイルが XML 形式として設定されます。 CLR プロファイラは、Microsoft ダウンロード センターからダウンロードできます。 |
U [-gcinfo] [-ehinfo] <MethodDesc address> | <Code address> |
メソッドの MethodDesc 構造体ポインタまたはメソッド本体のコード アドレスで指定したマネージ メソッドの注釈付き逆アセンブリを表示します。U コマンドを使用すると、開始から終了までのすべてのメソッドが、メタデータ トークンを名前に変換する注釈付きで表示されます。 U コマンドの -gcinfo オプションを指定すると、メソッドの GCInfo 構造体が表示されます。 -ehinfo オプションは、メソッドの例外情報を表示します。この情報は EHInfo コマンドでも取得できます。 |
VerifyHeap |
ガベージ コレクタ ヒープの破損の兆候をチェックし、検出されたすべてのエラーを表示します。 ヒープが正しく構築されていない場合、プラットフォームが呼び出しを実行したことが原因で、ヒープが破損する可能性があります。 |
VMMap |
仮想アドレス空間を走査し、各領域に適用されている保護方法の種類を表示します。 |
VMStat |
仮想アドレス空間の概要を、そのメモリに適用されている保護方法の種類 (保護なし、予約済み、コミット、プライベート、割り当て済み、イメージ) の順に表示します。AVERAGE 列に BLK COUNT 列を掛けた結果が TOTAL 列に表示されます。 |
解説
SOS デバッガ拡張は、Debugging Tools for Windows Web サイトから入手できる WinDbg.exe デバッガ、または Visual Studio 2005 以前のバージョンに読み込んで使用します。WinDgb.exe 内または Visual Studio のイミディエイト ウィンドウ内でコマンドを実行できます。
SOS デバッガ拡張を使用すると、共通言語ランタイム内部で実行しているコードに関する情報を表示できます。たとえば、SOS デバッガ拡張を使用して、マネージ ヒープに関する情報の表示、ヒープ破損の検索、ランタイムが使用している内部データ型の表示、およびランタイム内部で実行しているすべてのマネージ コードに関する情報の表示を行うことができます。
SOS デバッガ拡張の読み込み
WinDbg.exe デバッガに SOS デバッガ拡張を読み込むには、ツールで次のコマンドを実行します。また、Visual Studio に SOS デバッガ拡張を読み込むには、デバッグ時にイミディエイト ウィンドウで次のコマンドを実行します。
.loadby sos mscorwks
SOS デバッガ拡張を読み込む前に、ソリューションのプロジェクト設定でアンマネージ デバッグを有効にする必要があります。一部の言語では、アンマネージ デバッグが既定で無効になっています。
メモ Visual Studio 2005 のイミディエイト ウィンドウを表示するには、[デバッグ] メニューの [ウィンドウ] をクリックし、[イミディエイト] をクリックします。また、Ctrl キーと Alt キーを押しながら I キーを押して、Visual Studio のイミディエイト ウィンドウを開くこともできます。
WinDbg.exe と Visual Studio は、現在使用している Mscorwks.dll のバージョンに対応する SOS.dll のバージョンを使用します。.NET Framework の Version 1.1 および 2.0 では、SOS.dll は Mscorwks.dll と同じディレクトリにインストールされます。既定では、Mscorwks.dll の現在のバージョンに一致する SOS.dll のバージョンを使用することになります。
別のコンピュータで作成されたダンプ ファイルを使用するには、そのインストールに付属していた Mscorwks.dll ファイルが現在のコンピュータのシンボル パスにあることを確認し、対応するバージョンの SOS.dll を読み込みます。
特定のバージョンの SOS.dll を読み込むには、Windows デバッガに次のコマンドを入力します。
.load <full path to sos.dll>
サンプル
次のコマンドは、アドレス 00ad28d0 にある配列の内容を表示します。2 番目の要素およびそれ以降にある合計 5 つの要素が表示されます。
!dumparray -start 2 -length 5 -detail 00ad28d0
次のコマンドは、アドレス 1ca248 にあるアセンブリの内容を表示します。
!dumpassembly 1ca248
次のコマンドは、ガベージ コレクタ ヒープに関する情報を表示します。
!dumpheap
次のコマンドは、メモリ内ストレス ログの内容を、現在のディレクトリ内にある Stresslog.txt という名前のファイルに書き込みます。
!DumpLog
次のコマンドは、アドレス 902f40 にある MethodDesc 構造体を表示します。
!dumpmd 902f40
次のコマンドは、アドレス 1caa50 にあるモジュールに関する情報を表示します。
!dumpmodule 1caa50
次のコマンドは、アドレス a79d40 にあるオブジェクトに関する情報を表示します。
!DumpObj a79d40
次のコマンドは、アドレス 0090320c にあるメソッド テーブルを使用して、アドレス 00a79d9c にある値クラスのフィールドを表示します。
!DumpVC 0090320c 00a79d9c
次のコマンドは、ガベージ コレクタによって使用されるプロセス メモリを表示します。
!eeheap -gc
次のコマンドは、完了の目的でスケジュールされているすべてのオブジェクトを表示します。
!finalizequeue
次のコマンドは、アドレス 00a79d98 にあるオブジェクトのアプリケーション ドメインを確認します。
!findappdomain 00a79d98
次のコマンドは、現在のプロセス内のすべてのガベージ コレクタ ハンドルを表示します。
!gcinfo 5b68dbb8
次のコマンドは、unittest.exe モジュールにある MainClass クラスの Main メソッドの MethodTable 構造体および EEClass 構造体を表示します。
!name2ee unittest.exe MainClass.Main
次のコマンドは、unittest.exe モジュールのアドレス 02000003 にあるメタデータ トークンに関する情報を表示します。
!token2ee unittest.exe 02000003