ダンプ解析(Windows)
※かきかけです。
ダンプ解析の準備手順などをまとめておきます。
最初Windows 7(64bit)で行おうと思いましたが、
どうもスタックフレーム復元時のレジスタの値がおかしい気がするので
途中からXP(32bit)に切り替えています。
なので記載が少し混ぜこぜになっているかも。ごめんなさい。
デバッガの準備
Debugging Tools for WindowsはWDK(Windows Driver Kit)に統合されているようです。
.NET Framework 4が必要です。先にインストールしておいてください。
以下のページ「スタンドアロンの Debugging Tools for Windows」からダウンロードします。
http://msdn.microsoft.com/ja-jp/windows/hardware/hh852365
Windows Vista以前の場合
「スタンドアロンのデバッグ ツール (Windows XP と Windows Vista のデバッグ用)」を選んでダウンロード・インストールします。
デバッガは「C:\Program Files\Debugging Tools for Windows (x86)」あたりにあります。
シンボルサーバーの設定
x86とx64がありますが、用途に応じてデバッガを起動してください。
[File]→[SymbolFilePath]に以下を設定します。
srv*c:\websymbols*http://msdl.microsoft.com/download/symbols
拡張子の関連付け
そのままです。拡張子.dmpをwindbgに関連付けしておいてください。
windbg起動スクリプト
Windows 7以降の場合、.dmpを直接ダブルクリックして起動した際に
追加で引数を渡すことができません。
そこで以下のバッチを作成し、dmpファイルを開くときは
そのバッチファイルにdmpファイルをドラッグアンドドロップして開くようにしています。
デバッガのパスは必要に応じて変更してください。
@echo off set ret=0 @rem *********** 引数チェック *********** if "%1" == "" ( echo ファイルが指定されていません。 set ret=1 goto EXITEND ) @rem *********** デバッガ起動 *********** echo 入力されたファイルは「%1」です。 echo windbg.exeを起動します。 C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\windbg.exe -z "%1" -y "srv*c:\websymbols*http://msdl.microsoft.com/download/symbols" @rem *********** 終了処理 *********** :EXITEND echo 何かキーを入力してEnterを押すと終了します... set /P inputtemp="%inputtemp%" exit /b %ret%
OS全体のダンプの設定
完全ダンプを選びます。
システムドライブの仮想メモリの初期サイズを「物理メモリ+11MB」以上に設定します。
Windows 7以降の場合、なぜかカーネルダンプが選べません。
以下のレジストリを設定する必要があります。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl\CrashDumpEnabled
値:1→完全ダンプ 2→カーネルダンプ 3→最小ダンプ
OS再起動後に有効になる。
手動でダンプを取るには?
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters
CrashOnCtrlScrollを作成して「1」
右Ctrl + ScrollLockを2回連続で押す。 →意図的にブルースクリーンを発生させることができます。
ユーザーダンプ(プロセスダンプ)の設定
Windows Vista以降の場合
User Mode Process Dumper(UMPD)を使って手動でダンプを取ります。
Windows 2003/XP以前の場合
ワトソン博士が勝手にダンプ(user.dmp)を作成してくれます。
ワトソン博士の設定で「完全ダンプ」にするのを忘れないようにしましょう。
[ファイル名を指定して実行]からdrwtsn32として設定を見ることができます。
また、ワトソン博士を規定のデバッガとしたい場合は「drwtsn32 -i」と入力することで設定できます。
こちらもエラー以外のときに手動でダンプを取りたいときはUMPDを使います。