WinDbg のインストール、シンボル パスの設定、Mex の導入

WinDbg (Windows Debugger) は、Windows 用の強力なデバッガーで、カーネルモードやユーザーモードのプログラムを解析ができます。

ブルースクリーン発生時に出力されるメモリ ダンプ（MEMORY.DMP）やアプリケーションのクラッシュ ダンプ解析、ライブ デバッグ等に広く使われ、詳細なメモリやスレッドの情報等が確認できます。

今回は、WinDbg のインストール方法とやっておいたほうがよいシンボル パスの設定と Mex の導入方法を紹介します。

## 環境
Windows 10
Windows 11
※ スクリーンショットは、Windows 11 23H2 で取得しています。

## Step 1. WinDbg インストール
WinDbg は、Microsoft Store から簡単にインストール可能です。Microsoft Store へは以下のリンクからアクセスできます。

https://apps.microsoft.com/detail/9pgjgd53tn86?launch=true&mode=mini

Microsoft Store が使用できない場合、Microsoft Store 以外のインストール方法は、以下の Web サイトで紹介されているので、こちらを確認してください。

https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/

## Step 2. シンボル パス設定
### シンボル
シンボルは、ソフトウェア開発やデバッグにおいて特定のプログラム要素を識別するための名前を指します。シンボルは、ソースコードとコンパイルされたバイナリコードの間で対応関係を持ち、開発者がコードを理解しやすくするために使われます。具体的には、以下のようなものがシンボルに該当します。

### シンボルの例
- **関数名**: 例えば、`CalculateSum()` という関数の名前
- **変数名**: 例えば、`totalAmount` という変数名
- **クラス名**: 例えば、`UserProfile` というクラス名
- **メソッド名**: 例えば、`UserProfile.getUserName()` というメソッドの名前

### デバッグにおけるシンボルの役割
シンボルがあることで、デバッガーはバイナリコードを人間が理解しやすい形に変換できます。例えば、エラーメッセージやスタックトレースに表示される情報が「0x0042F56A のメモリアドレスでエラーが発生」ではなく、「CalculateSum 関数の23行目でエラーが発生」というように分かりやすくなります。

### シンボルと PDB ファイル
シンボルは、通常、コンパイル後にバイナリコードからは削除されますが、デバッグ用に生成される PDB ファイルへ保存されます。これにより、デバッグ セッション中にソースコードと実行中のコードとの間の対応関係が維持され、デバッグがしやすくなります。

シンボルは、特にデバッグや解析の際に不可欠な要素で、コードの動作やエラーの原因を迅速に把握するために使われます。`https://msdl.microsoft.com/download/symbols` で Windows OS の PDB ファイルは、公開されています。ただ、未公開なシンボル情報が多いため、確認できる範囲は限定的です。

PDB ファイルのことをシンボルファイルと呼ぶこともあり、PDB ファイルが保存されているフォルダのパスがシンボル パスになります。

### シンボル パスを環境変数から設定
#### 1. Windows + r から sysdm.cpl を実行
![sysdm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/42f6b94b-e723-ae4b-1f96-e59bd3164530.png)

#### 2. 詳細設定タブの [環境変数] ボタンをクリック
![system_property.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/c66ffa14-398f-3ffc-d852-94564abbb2cd.png)

#### 3. ユーザーの環境変数へシンボル パスを追加
上の段にあるユーザー側の [新規] ボタンをクリックします。
![environment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/9c201c64-50a8-5697-eabb-f1b8a0b89d75.png)

:::note info
システムの環境変数に追加しても OK です。その場合、端末にログインするすべてのユーザーに対して、同じシンボル パスの設定が可能です。
:::


新しいユーザー変数を追加します。
変数名：_NT_SYMBOL_PATH
変数値：`srv*d:\symbols*https://msdl.microsoft.com/download/symbols`
![environment_user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/c2295aab-5368-6d83-af8f-30419094253f.png)

:::note info
変数値にある `d:\symbols` は、シンボル パスの保存先のフォルダになり、任意の場所に変更が可能です。シンボル ファイルのサイズはかなり大きくなりますので、容量に空きのあるドライブを指定するとよいです。
:::

https://learn.microsoft.com/en-us/windows-hardware/test/wpt/symbol-support

## Step 3. Mex の導入
### Mex
Mex は、WinDbg の機能を拡張するツールで、Windows のクラッシュダンプ解析やデバッグを効率化します。MEX は、メモリリークの検出やシステム状態の概要表示、ヒープ解析、オートマチックレポート生成などの機能を提供します。また、特定のクラッシュパターンを自動的に識別し、開発者に問題解決のための具体的な手がかりを与えます。MEX は、デバッグ作業をより簡単にし、分析の精度と速度を向上させるための重要なツールです。

### Mex の導入方法
#### 1. Mex をダウンロード
Mex は、以下の Web サイトのダウンロード ボタンよりダウンロードできます。

https://www.microsoft.com/en-us/download/details.aspx?id=53304

#### 2. Mex を配置
ダウンロードした Mex.exe を実行すると、Mex.zip ファイルが作成されます。Mex.zip を解凍すると、x64 と x86 フォルダが作成され、それぞれに mex.dll ファイルが確認できます。

mex.dll を以下の拡張機能を配置するフォルダへ配置することで WinDbg で使用できるようになります。
- x64: %localappdata%\dbg\EngineExtensions
- x86: %localappdata%\dbg\EngineExtensions32

EngineExtensions フォルダの例
![EngineExtensions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/a2cd2913-0663-aaf5-3680-c5c7b989df90.png)

## WinDbg 実行テスト
実際にダンプ ファイルを開き、問題なくシンボルの設定や Mex が使用できるか確認します。ダンプ ファイルは、タスクマネージャーで [メモリ ダンプ ファイルの作成] をクリックすると、簡単に作成できます。

![taskmgr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/decfef41-6919-751d-107b-14e4232ae917.png)

作成したエクスプローラーのダンプファイル（explorer.DMP）を WinDbg で開き、まず、シンボル パスが正しく設定されているか、`.sympath` コマンドで確認しましょう。先ほど環境変数で追加したシンボル パスが表示されれば、環境変数の設定が正しく行われています。

![sympath.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/0426ae60-09f5-8991-8769-9f02cf9c1358.png)

環境変数で設定したパスに加えて他に設定されているパスが存在する場合には、以下のように `.sympath` コマンドに環境変数で設定した値を指定して実行すれば、他のシンボル パスを上書きできるので、実行しておきましょう。

```powershell
.sympath srv*d:\symbols*https://msdl.microsoft.com/download/symbols
```
https://learn.microsoft.com/en-us/windows-hardware/drivers/debuggercmds/-sympath--set-symbol-path-

シンボル ファイルが、出力フォルダ（今回は、`D:\symbols`）にダウンロードされていることも確認しておきましょう。
![symbols.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/26cf447e-8e60-c7b1-e978-7725282c282e.png)


次に、Mex が使えるか確認するため、!（ビックリマーク）に続けて、`mex.help` と入力します。Mex がロードされ、Help の実行結果が返ってこれば、Mex が正しく動作していると判断できます。
```powershell
!mex.help
```
![mex.help.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/658331d6-04cb-a8e6-d5b8-5d9149294756.png)

## さいごに
これで、Windows OS で発生する様々な問題の原因調査ができる状態になりましたので、ガンガン不具合を見つけていきましょう！