[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]] -[[戻る>ダンプの概要(種類と取得)]] * 目次 [#k33cf768] #contents *概要 [#u6bd2f21] クラッシュ時にプロセスに事後分析デバッガをアタッチしてダンプを取得する。 問題が起きた時刻に近い情報(メモリ&スタック)を取得可能であるが、~ 上記に問題の情報が含まれないケースや、マルチスレッド環境化などで、~ 重要な情報をタイミングによって取り逃がしているケースはあり得る。 *使用可能なツール [#a7ded6cc] OSや対象プロセス(マネージド、アンマネージド)によって~ 使用するツール・手順・設定等が異なるのでサポートと連携して行う。 以下は、[[クラッシュ・ダンプ]]の専用ツール。 [[ハング・ダンプ]]と併用可能なツールは[[こちら>ダンプの概要(種類と取得)#hbe6158e]]。 **OS標準 [#k89113b1] -以下のツールを使用できる。 -ただし、マネージド・プロセスの[[クラッシュ・ダンプ]]は取得不可。~ この場合は、ADPlus(か、cdb.exe単独実行)を利用する。 ***ワトソン博士、ワトソンログ [#f8ccf70d] -Windows OS標準のデバッガでクラッシュ・ダンプ・ファイルを生成できる。 -ファイル名を指定して実行:「drwtsn32」でワトソン博士の設定画面が開く。 --Windows のワトソン博士を有効または無効にする方法~ http://support.microsoft.com/kb/188296/ja -ただし、Vista以降のOSでは使用できない。 --Windows Vista では、完全なユーザー モードのダンプ ファイルを生成する方法~ http://support.microsoft.com/kb/951018/ja --Windows Vista でユーザーモード プロセスのダンプ ファイルを作成する方法~ http://support.microsoft.com/kb/931673 --Windows Server 2008 でユーザー モード プロセス ダンプを取得する方法~ http://support.microsoft.com/kb/949180/ja ***WER(Windows Error Report) [#gd2a0752] ワトソン博士の後継で、Vista以降のOS、クラッシュダンプ以外も取得可能。 -ダンプ取得設定~ 以下のレジストリ設定で、アンマネージド・プロセスのダンプ取得が可能になる。 --キー:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps --エントリ値 ---DampFolder(REG_EXPAND_SZ)~ ダンプファイルが保存されるパス ---DampCount(REG_DWORD)~ ダンプファイルが保存される世代数 ---DampType(REG_DWORD)~ ダンプタイプ(0:カスタムダンプ、1:ミニダンプ、2:フルダンプ)~ WERのミニダンプ、フルダンプに正確な定義が無いのでカスタムダンプを推奨。 ---CustomDampFlags(REG_DWORD)~ カスタムダンプオプション(MINIDUMP_TYPE enumerationの表を参照) -また、WERのAPIを使用したセルフダンプも可能。 --WER Reference (Windows)~ http://msdn.microsoft.com/en-us/library/windows/desktop/bb513636(v=vs.85).aspx ---WER Functions (Windows)~ https://msdn.microsoft.com/en-us/library/windows/desktop/bb513635(v=vs.85).aspx -ダンプファイル名~ なお、WERで取得したダンプファイル名は、 --Vista、2008では:「問題のレポートと解決策」 --7、2008R2では:「信頼性モニター」 >にレポートとして表示される。 -参考 --Windows エラー報告~ http://technet.microsoft.com/ja-jp/library/cc754364.aspx --Windows エラー報告 はじめに~ http://msdn.microsoft.com/ja-jp/library/windows/hardware/gg487440.aspx --WER Settings~ http://msdn.microsoft.com/en-us/library/windows/desktop/bb513638.aspx --Collecting User-Mode Dumps~ http://msdn.microsoft.com/en-us/library/windows/desktop/bb787181.aspx **その他 [#d4468c5c] ***[[UMPD]] [#i69b04fe] ***WinDbg [#a3262b90] ***CDB [#o6ad9d08] ***NTSD [#y185976f] ***ProcDump [#z7322665] -ProcDump~ https://technet.microsoft.com/ja-jp/sysinternals/dd996900.aspx -Sysinternals ProcDump v4.0~ Writing a Plug-in for Sysinternals ProcDump v4.0~ http://msdn.microsoft.com/en-us/magazine/hh580738.aspx ***マネージド・コードの場合 [#b44e916d] [[UMPD]]、WinDbg、CDB、NTSDのオプション指定により~ CLRの例外発生時のマネージコードのクラッシュダンプ取得も可能。 ***参考 [#j670022d] -技術/Windows/メモリダンプ取得方法メモ~ http://www.glamenv-septzen.net/view/918 *取得方法 [#oaaa3d07] **未処理例外のディスパッチ [#zfec06e1] 未処理例外=セカンドチャンス(ラストチャンス)例外 -通常は無害な(ハンドリングされた)ファーストチャンス例外は無視して継続する。 -セカンドチャンス(ラストチャンス)例外の通知により、事後分析デバッガ(ダンプツール)をアタッチしてダンプを出力する。 ***ファーストチャンス例外 [#vd71c433] 無害な(ハンドリングされた例外 ***ダンプ取得できないマネージ例外 [#iffa2486] .NETのランタイム(mccorwks.dll内部)でAccess Violation等の例外が発生した場合、.NETでは、ユーザアプリケーションでは例外をハンドルできない仕様となっている。この場合、ファーストチャンス例外発生後に、イベントログを出力しプロセスを終了するので、セカンドチャンス例外が発生せず、クラッシュダンプをデバッガから取得できない。このため、このようなケースではファーストチャンス例外の監視機能を持つ[[UMPD]]や[[ADPlus]]などのダンプ取得ツールを使用してクラッシュダンプを取得する。 **事後分析デバッガのインストール方法と設定方法 [#e1100caf] -デフォルトのデハッガのレジストリ登録位置は以下。~ ※ マネージドプロセスのダンプは対象外 --キー:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug --エントリ ---Auto値:1 ---Debugger値:ツール・動作により可変(下記参照) ***ワトソン博士 [#u8911f61] -インストール方法:drwtsn32 -i -Debugger値 --デバッグ:-(ダンプ専用) --ダンプ:drwtsn32 -p %ld -e %ld -g ***[[UMPD]] [#bf234739] -インストール方法:userdump -I -d 出力先パス -Debugger値 --デバッグ時:-(ダンプ専用) --ダンプ時:userdump -E %ld %ld -D 出力先パス ***WinDbg [#f26deaed] -インストール方法:WinDbg -I -Debugger値 --デバッグ時:windbg.exe -p %ld -e %ld -g --ダンプ時:windbg.exe -p %ld -e %ld -g -c '.dump /o /ma /u 出力先パス\new.dmp; q' -Q -QS -QY -QSY ***CDB [#xc4deb41] -インストール方法:cdb -iae -Debugger値 --デバッグ時:cdb.exe -p %ld -e %ld -g --ダンプ時:cdb.exe -p %ld -e %ld -g -c ".dump /o /ma /u 出力先パス\new.dmp; q" ***NTSD [#jf1a22d0] -インストール方法:ntsd -iae -Debugger値 --デバッグ時:ntsd.exe -p %ld -e %ld -g --ダンプ時:ntsd.exe -p %ld -e %ld -g -c ".dump /o /ma /u 出力先パス\new.dmp; q" ***VisualStudio 2010 以降 [#oa746aec] -インストール方法:- -Debugger値 --デバッグ時:Debugger=vsjitdebugger.exe" -p %ld -e %ld --ダンプ時:- ***.NET Framework 4 以降 [#x078bb09] -インストール方法:- -Debugger値 --デバッグ時:Debugger=cordbg.exe" !a 0x%x --ダンプ時:- ***VisualStudio 2010 以前 [#r72282db] 設定場所と値が異なるが割愛 -キー:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\DbgJIT --エントリ ---DebugLaunchSetting ***.NET Framework 3.5 以前 [#w6b8ebdf] 設定場所と値が異なるが割愛 -キー:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\DbgJIT --エントリ ---DebugLaunchSetting ***[[Windows Forms]] [#j342abfa] Windows フォームで Just-In-Time デバッグを有効にするには、~ 本設定を併用しないとデバッガを無効化できない事がある模様。 -方法 Windows フォームで Just-In-Time デバッグを有効にする~ http://msdn.microsoft.com/ja-jp/library/bdcetka3(VS.80).aspx *その他の取得方法 [#ece7161e] **UnhandledExceptionFilter関数 [#w7d8cfcf] プログラムはクラッシュさせずに自前の未処理例外フィルタを実行することもできる。また、ここでセルフダンプの取得を行う事もできる。 -UnhandledExceptionFilter 関数~ http://msdn.microsoft.com/ja-jp/library/cc429058.aspx -構造化例外処理と UnhandledExceptionFilter | Web-DB プログラミング徹底解説~ http://keicode.com/windows/windows_exception_handling.php *メモリリーク用 [#r3dcbb2e] -通常、[[ユーザモード・プロセス・ダンプ]]の[[ハング・ダンプ]]を使用する。 -[[メモリ・リーク]]に起因するOutOfMemory等で異常終了する場合は[[クラッシュ・ダンプ]]でも可。 **グローバルフラグ [#g2aa5c94] また、グローバルフラグを設定して -ヒープリーク検出機能(ページ ヒープ)~ → !Heap -p -a コマンドコマンドでstacktraceを出力可能にする(必須)。 -ユーザモード スタックトレース データベース~ → !Heap -a コマンドでstacktraceを出力可能にする(オプション)、UMDH用(必須) を有効にする必要がある。 ページ ヒープをオンにした場合、ヒープオーバーランの検出も可能になる。~ ※ ヒープに対するバッファオーバーランをヒープオーバーランと呼ぶ。 -ページヒープ (PageHeap) によるヒープオーバーランの検出 - Web-DB プログラミング徹底解説~ http://keicode.com/debug/dbg-pageheap.php ページ ヒープ、ユーザモード スタックトレース データベースはメモリを使用するため、調査後には無効にする。 ***Global Flags Editor [#u9810f49] グローバルフラグの設定には、~ Global Flags Editor (Gflags.exe) ユーティリティを使用する。 (Debugging Tools for Windowsに同梱されている) -CUI --有効化:gflags -i <実行ファイル名> +ust +hpa --無効化:gflags -i <実行ファイル名> -ust -hpa -GUI~ ImageFileタブから、対象イメージの --enable page heapチェックボックス --create user mode stack trace databaseチェックボックス >を有効・無効にする。 *参考 [#ee2d38b0] -例外 - Web-DB プログラミング徹底解説~ http://keicode.com/debug/dbg320.php -致命的な例外エラーについて~ http://support.microsoft.com/kb/150314/ja~ プロセッサ例外とその定義 --00 : Divide Fault (除算違反) --02 : NMI Interrupt (NMI 割り込み) --04 : Overflow Trap (オーバーフロー トラップ) --05 : Bounds Check Fault (境界チェック違反) --06 : Invalid Opcode Fault (無効なオペコード違反) --07 : Coprocessor Not Available Fault (コプロセッサ利用不可違反) --08 : Double Fault (ダブル フォールト) --09 : Coprocessor Segment Overrun (コプロセッサ セグメント オーバーラン) --10 (0Ah) : Invalid Task State Segment Fault (無効なタスク状態セグメント) --11 (0Bh) : Not Present Fault (不在違反) --12 (0Ch) : Stack Fault (スタック違反) --13 (0Dh) : General Protection Fault (一般保護違反) --14 (0Eh) : Page Fault (ページ違反) --16 (10h) : Coprocessor Error Fault (コプロセッサ エラー) --17 (11h): Alignment Check Fault (アライメント チェック違反) -事後分析デバッガのアタッチ --sdk32 システムが起動するデバッガの選択~ http://support.microsoft.com/kb/103861/ja --JIT アタッチ デバッグの有効化~ http://msdn.microsoft.com/ja-jp/library/2ac5yxx6.aspx --@IT:.NET TIPS [アプリケーション・エラー]ダイアログを非表示にするには? - VS.NET~ http://www.atmarkit.co.jp/fdotnet/dotnettips/262apperror/apperror.html ---- Tags: [[:障害対応]], [[:性能]], [[:デバッグ]]