[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]] -[[戻る>障害対応に使用するツールの一覧]] * 目次 [#idb6826d] #contents *概要 [#ba4525a8] ダンプ解析やライブデバッグなどができます。 ダンプ解析は高度な技術を要しますが、クラッシュダンプに以下のコマンドを実行することで~ スタックトレースを取得しプロセスをクラッシュさせたプログラムの特定などができます。 **例 [#of9c8a8c] ダンプをWinDbgのKコマンドで確認した所、~ 以下の様にスタックトレースが出力された。 ChildEBP RetAddr 1c2fd0b8 774a5620 ntdll!KiFastSystemCallRet 1c2fd0bc 774d3c62 ntdll!NtWaitForSingleObject+0xc 1c2fd140 774d3d4b ntdll!RtlReportExceptionEx+0x14b 1c2fd180 774efa87 ntdll!RtlReportException+0x3c 1c2fd194 774efb0d ntdll!RtlpTerminateFailureFilter+0x14 1c2fd1a0 77449bdc ntdll!RtlReportCriticalFailure+0x6b 1c2fd1b4 77444067 ntdll!_EH4_CallFilterFunc+0x12 1c2fd1dc 774a5f79 ntdll!_except_handler4+0x8e 1c2fd200 774a5f4b ntdll!ExecuteHandler2+0x26 1c2fd2b0 774a5dd7 ntdll!ExecuteHandler+0x24 1c2fd2b0 774efaf8 ntdll!KiUserExceptionDispatcher+0xf 1c2fd624 774f0704 ntdll!RtlReportCriticalFailure+0x5b 1c2fd634 774f07f2 ntdll!RtlpReportHeapFailure+0x21 1c2fd668 774afc25 ntdll!RtlpLogHeapFailure+0xa1 1c2fd694 763b9a26 ntdll!RtlFreeHeap+0x60 1c2fd6a8 76079c03 kernel32!HeapFree+0x14 Unable to load image C:\YYYYY\XXXXX.dll, Win32 error 0n2 *** WARNING: Unable to verify timestamp for XXXXX.dll *** ERROR: Module load completed but symbols could not be loaded for XXXXX.dll |---> "C:\YYYYY\XXXXX.dll" がプロセスをクラッシュさせている。 *Windbgによるスレッド・スタック、例外分析 [#e05ec6f7] **アンマネージでもマネージでも利用可能。 [#ed7fa0e9] ***「!analyze -v」コマンド [#s3eb6f80] クラッシュ分析ヒューリスティックにより現在の例外に関する詳細情報を表示 ***「~」コマンド [#nb8451f9] スレッド一覧表示 ***「~*k」コマンド [#n866c6b0] スレッドのコール・スタックを表示 ***~<thread>s [#p0110f41] カレント・スレッドの設定 ***「KN, .Frame , DV, and DT 」コマンド [#y8f70925] 現在のコール・スタックの引数、ローカル変数を確認できる。 -Windbg Tip KN, .Frame , DV, and DT - It's so easy - Ntdebugging Blog - Site Home - MSDN Blogs~ http://blogs.msdn.com/b/ntdebugging/archive/2008/06/06/windbg-tip-kn-frame-dv-and-dt-it-s-so-easy.aspx **マネージで利用可能 [#e1f60dac] ***「!PrintException -nested」コマンド [#la6dbd9e] クラッシュ分析ヒューリスティックにより現在の例外に関する詳細情報を表示 ***「!thread」コマンド [#n20e1098] スレッドの状態を表示 -アンマネージスレッドか? -マネージスレッドか? --ファイナライザスレッドか? --ステータス情報を確認できる。 ---Appendix~ http://msdn.microsoft.com/en-us/library/ee817657.aspx~ ・Thread State Values ***「!ClrStack -a」コマンド [#b176bc5a] -マネージドコードのコールスタック -「~*k」コマンドより若干詳しい。 なお、ここに表示される -引数 -ローカル変数 は、以下のコマンドを使用して値を確認できる。 -変数がStringである場合、~ !DumpObjコマンドに指定すれば、文字列情報を取得できる。 -変数が配列である場合、~ !DumpArrayコマンドを使用して、各要素の情報を取得できる。 -参照渡しの引数である場合~ ddコマンドを使用してアドレス情報を確認できる。~ (ddコマンドではポインタ(オブジェクト参照)の指す値を確認できる) *WinDbgによるメモリ・リーク分析 [#r14b7f86] -プロセスのスレッドのヒープの使用状況のログを取得できる。 -このログを比較することで、どのスタックトーレスが[[メモリ・リーク]]に関係しているかを絞り込むことができる。 -javaや.netのマネージ・リソースの[[メモリ・リーク]]は検出できないことがあるので注意する。 -これは、マネージド・ヒープがガベージ・コレクタによって管理されているため。 **準備 [#tb07cdd5] ヒープマネージャに管理されるヒープ内の利用状況に関する情報を所得したい場合、~ ダンプ取得コマンドを実行する前に、グローバルフラグを使用して -ヒープリーク検出機能(ページ ヒープ)、 -ユーザモード スタックトレース データベース を有効にする必要がある。 >※ [ダンプの種類と概要、取得ツール]のシートの[メモリリーク分析用のダンプ]を参照のこと。~ なお、リークを疑っている場合、同じダンプを見ても解らないので、差分を見るなどする。~ 若しくは、[[UMDH]]ツールを使用してログ出力してヒープの差分を確認するなどする。 **ダンプ取得 [#x6d0af1f] 任意のツールを使用してユーザモード・プロセスダンプを取得する。 **ダンプ分析 [#k4e7b041] ***仮想アドレス空間の情報 [#e0876dd6] -!addressコマンドから仮想アドレス空間の全情報を取得できる。 --!address~ プロセスの仮想アドレス空間の全情報を表示 --!address -summary~ プロセスの仮想アドレス空間のサマリを表示 --!address –RegionUsageStack~ プロセスの全スレッドのスタック領域を表示 -ただし、ヒープ・マネージャに管理される~ ヒープ内のメモリ利用状況に関する情報は取得できない。 ***ヒープ内の利用状況の情報 [#a38479a8] 下記を実行してヒープ内のメモリ利用状況を確認する。 -ヒープリーク検出(ページ ヒープ)~ !Heap -p -a コマンドコマンドでstacktraceを出力 -ユーザモード スタックトレース データベース~ !Heap -a コマンドでstacktraceを出力 *Windbgによる[[カーネル・ダンプ]](完全メモリ・ダンプ)分析 [#i36f4dfe] **準備と取得 [#ve97b358] ***[[準備>カーネル・ダンプ#m64be791]] [#t6be2148] ***[[取得>カーネル・ダンプ#be65c218]] [#x6f23ebc] **分析 [#dc142064] ***参考 [#lbed644f] -STOPエラーの原因解析~ http://www.nextftp.com/to-i/analyze.htm -Windowsダンプの極意(書籍)~ http://ascii.asciimw.jp/books/books/detail/978-4-04-867509-3.shtml *[[WinDbg+SOS拡張によるマネージ・ライブ・デバック>.NETのメモリ・リーク#mfaa3ea9]] [#a301f79a] *参考 [#peffdc7b] -WinDbg_A_to_Z_mono_JP.pdf~ http://windbg.info/download/doc/pdf/WinDbg_A_to_Z_mono_JP.pdf -Debugger Commands~ http://msdn.microsoft.com/en-us/library/ff540507.aspx -WinDbg入門~ http://www.ttoyota.com/php/install_intro.php --WinDbgについて --WinDbgの適応範囲 --WinDbgのインストール --WinDbgの基本設定 --WinDbgの動作確認(ユーザーモード) --WinDbgの動作確認(カーネルモード) --!analyze -vコマンドの実行 --クラッシュダンプ自動解析入門 -Windbg Hoster-JP~ http://www.hoster.jp/tag/windbg --[Windbg 第1回] Windbgを知っていますか? --[Windbg 第2回] Windbgはどこにありますか? --[Windbg 第3回] ツールはどのようにインストールしますか。 --[Windbg 第4回] カーネルメモリ空間のダンプを取得する。 --[Windbg 第5回] ユーザメモリ空間のダンプを取得する。 --[Windbg 第6回] 取得したダンプをWindbgで開く --[Windbg 第7回] 取得したダンプをkanalyzeで開く --[Windbg 第8回] Windbgでよく使うコマンド~ (その1)クラッシュ時に起動しているアプリケーションを確認する --[Windbg 第9回] Windbgでよく使うコマンド~ (その2)クラッシュ時に読み込まれていたドライバーを確認する --[Windbg 第10回] Windbgでよく使うコマンド~ (その3)クラッシュしたサーバのハードウェア情報を確認する -現場で使えるWinDbgカーネルコマンド:EnterpriseZine (EZ)~ http://enterprisezine.jp/article/corner/69 --システム管理とWinDbgカーネルデバッガー --WinDbgのインストールと3つのコマンド --システム管理者のためのプロセス構造体入門 --プロセスはオブジェクトである」の意味は --プロセスと!objectコマンド -技術-Windows-WinDbgメモ - Glamenv-Septzen.net~ http://www.glamenv-septzen.net/view/706