Windowsでアプリケーションがクラッシュしたりフリーズした場合のデバッグツールである、WinDbgのインストール方法および基本的な使い方について解説します。
WinDbgを使うことで、アプリケーションのクラッシュ時のコンテキストと、ソースのクラッシュ箇所を可視化することができます。
WinDbgのインストール
Microsoftの公式サイトからインストーラーをダウンロードします。
ダウンロードしたインストーラー(winsdksetup.exe)を実行してインストールします。以下の箇所だけ変更し、それ以外はデフォルトの設定のままでOKです。
これで、Windowsのメニューから検索すると、WinDbgがヒットします。
WinDbgの使い方
レジストリの設定
WinDbgはクラッシュダンプ(*.dmpファイル)を解析するツールです。
クラッシュダンプを出力するには、レジストリの設定が必要です。
レジストリ エディターを開きます。
レジストリキー「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps」に、以下を追加します。(デフォルトでレジストリキー「LocalDumps」が無ければ、Windows Error Reportingを選択して右クリック ⇒ 新規 ⇒ キーで追加して下さい)
レジストリキー | 種類 | 値 | 備考 |
---|---|---|---|
DumpFolder | REG_EXPAND_SZ | %LOCALAPPDATA%\CrashDumps | |
DumpCount | REG_DWORD | 10 | 値は10進数 |
DumpType | REG_DWORD | 2 | 値は10進数 |
動作確認
こちらを参考にプロジェクトファイルを用意し、cppファイルを例えば以下のように実装し、exeファイルをつくります。
src/components/component*/main.cpp
#include <stdio.h>
void func3()
{
::printf("5 \n");
::printf("4 \n");
::printf("3 \n");
::printf("2 \n");
::printf("1 \n");
char* p = NULL;
*p = 'a';
}
void func2()
{
func3();
}
void func1()
{
func2();
}
int main(int argc, const char** argv)
{
::printf("start\n");
func1();
::printf("end\n");
return 0;
}
exeファイルを実行後、レジストリで設定した「%LOCALAPPDATA%\CrashDumps」を見ると、クラッシュダンプ(*.dmp)が出来ています。
Windowsのメニューから「WinDbg (X64)」を開き、File ⇒ Open Crash Dumpで、先に出力されたdmpファイルを選択します。
Command表示領域の下部の「0:000>」で「.ecxr」と入力してEnterを押すと、アプリクラッシュ時のコンテキストと、ソースコードの当該行が表示されます。