# Windows のデバッグ

> Debug native C++ and managed C# game and Editor processes on Windows using Program Database symbols.

Unity には、ゲームやエディター処理のフォレンジックやライブデバッグ作業のために、Windows でデバッグを実施するオプションがいくつかあります。Unity では、ネイティブ C++ と C# マネージの 2 種類のデバッグが可能です。

* ネイティブデバッグは、関連するバイナリファイル (exe や dll など) のシンボルをプログラムデータベース (PDB) に格納します。
* Windows では、標準 .NET が管理するシンボルが、PDB ファイルに拡張子 .pdb で保管されています。

## シンボル

Unity の[シンボルストア](http://symbolserver.unity3d.com/)を使用して、Windows Debugger (WinDbg) または Visual Studio 2019 以降で Unity サーバー URL にアクセスし、シンボルの分解とダウンロードを自動で行うことができます。

### Windows Debugger (WinDbg) の設定

WinDbg にシンボルストアを追加するには、`.sympath` コマンドを使用します。

> `.sympath+ SRV*c:\symbols-cache*http://symbolserver.unity3d.com/`

上のパスで > `.sympath+`

プラス (+) は既存のシンボルパスを保持し、シンボルストアを追加します。

> `SRV*c:\symbols-cache`

SRV はフェッチ元のリモート サーバーを表します。`c:\symbols` は再度ダウンロードする前に最初に見るローカルパスで、ダウンロードしたシンボルをキャッシュします。

> `*http://symbolserver.unity3d.com/`

フェッチ元のシンボルストアのパスです。

### Visual Studio の設定

Visual Studio をデバッグのために設定するには、以下のステップに従います。

1. **Tools > Options** を選択します
2. **Debugging** セクションを展開し、**Symbols** を選択します
3. キャッシュディレクトリを指定します (指定されていない場合)
4. Unity の[シンボルストア](http://symbolserver.unity3d.com/)など、**シンボルファイル (.pdb) の場所**を追加します。

## ライブデバッグ

ライブデバッグは、すでに実行中のプロセス、または例外が検出されたプロセスにデバッガーを接続するシナリオです。デバッガーで問題を見つけるには、[Visual Studio の設定](#vs-setup)のセクションで説明されているステップを使用して、ビルドにシンボルを追加する必要があります。また、ゲームの実行ファイルがゲームと同じ名前である場合、デバッガーは、名前が変更された実行ファイルにアクセスできない場合には特に、正しい `.pdb` ファイルの検出に問題が発生する可能性があります。

#### 自動例外デバッグの設定

Windows では、アプリケーションクラッシュが自動的に Dr Watson/Error に送信され、Microsoft に報告されるように、Microsoft によってセットアップされています。ただし、Visual Studio または WinDbg がインストールされている場合は、代わりに[クラッシュのデバッグ](https://msdn.microsoft.com/en-us/library/windows/desktop/bb204634\(v=vs.85\).aspx)を選択するオプションが、Microsoft から提供されます。

以下のレジストリの内容に従ってインストールします。

```
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]
 "Auto"="1"
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug]
 "Auto"="1"
```

エディターデバッグの追加コンテンツ:

> `Unity.exe -dbgbreak`

自動クラッシュ処理が設定されている場合、上記は Unity を起動して、迅速にデバッガーを接続します。

### クラッシュ後/フォレンジックデバッグ

Windows にはクラッシュダンプファイル (.dmp か .mdmp) を検証する機能があります。クラッシュダンプに応じて、スタック情報またはプロセス全体のメモリが表示されます。ダンプファイルの内容によってクラッシュの原因が判別されます。通常は、有効なスタックである限り、少なくとも調査対象となるスタックがあります。

ダンプファイルを検証するには、Visual Studio か WinDbg を通じてオプションを起動します。Visual Studio は使いやすいですが、WinDbg には追加機能があるため、より推奨されるデバッグツールです。

### デバッグのヒントとコツ

Visual Studio を実行する場合は、デバッグをさらに簡単にする Unity の VS コード用 [UnityMixedCallstack](https://github.com/Unity-Technologies/UnityMixedCallstack) 拡張子を使用できます。

#### ネイティブの Managed 例外

`NullReferenceException` は通常、以下のように表示されます。

```
    1b45558c()	
&gt;	mono-2.0-bdwgc.dll!malloc(unsigned int size=12)  Line 163 + 0x5f bytes	C  
    mono-2.0-bdwgc.dll!g_hash_table_insert_replace(_GHashTable * hash=0x065c3960, void * key=0x0018cba4, void * value=0x0018cb8c, int replace=457528232)  Line 204 + 0x7 bytes	C  
 	mono-2.0-bdwgc.dll!mono_jit_runtime_invoke(_MonoMethod * method=0x242bf8b0, void * obj=0x065c3960, void ** params=0x0018cba4, MonoObject * * exc=0x0018cb8c)  Line 4889 + 0xc bytes	C  
```

#### マネージスタックフレーム

マネージスタックフレームは通常、次のようになります。

```
    1b45558c()	
&gt;	mono-2.0-bdwgc.dll!malloc(unsigned int size=12)  Line 163 + 0x5f bytes	C  
    mono-2.0-bdwgc.dll!g_hash_table_insert_replace(_GHashTable * hash=0x065c3960, void * key=0x0018cba4, void * value=0x0018cb8c, int replace=457528232)  Line 204 + 0x7 bytes	C  
 	mono-2.0-bdwgc.dll!mono_jit_runtime_invoke(_MonoMethod * method=0x242bf8b0, void * obj=0x065c3960, void ** params=0x0018cba4, MonoObject * * exc=0x0018cb8c)  Line 4889 + 0xc bytes	C  
```

情報がない行はマネージフレームです。Mono のマネージスタック情報は、`mono_pmip` というビルトイン関数を使用して取得できます。この関数は、スタックフレームのアドレスを受け入れ、情報と文字 \* を返します。Visual Studio Immediate ウィンドウで `mono_pmip` を呼び出し、デバッグできます。

> `?(char*){,,mono-2.0-bdwgc.dll}mono_pmip((void*)0x1b45558c)`

0x26a296c0 " Tiles:OnPostRender () + 0x1e4 (1B4553A8 1B4555DC) \[065C6BD0 - Unity Child Domain]"\`

**注意**これは、`mono-2.0-bdwgc.dll` シンボルが適切にロードされている場合にのみ機能します。

#### アプリケーションの強制による、ダンプファイルの作成

デバッガーが接続されているにもかかわらずアプリケーションがクラッシュしない場合や、デバッガーが使用できないリモートデバイス上でクラッシュする場合があります。このような場合は、以下のステップでダンプファイルから有用な情報を取得できます。

**注意**これらの手順は、**Windows スタンドアロン**と**ユニバーサル Windows** プラットフォーム (UWP) 用 (デスクトップで実行している場合) です。

1. Windows レジストリを開きます。

2. `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting` に移動します。

3. `LocalDumps` フォルダーがない場合は作成します。

4. 次のキーを作成します。

   * `“DumpFolder”=&lt;FolderPath goes here&gt; , e.g., C:\Temp`
   * `“DumpCount”=dword:00000010`
   * `“DumpType”=dword:00000002`

5. ユニバーサル Windows プラットフォーム (UWP) または Windows スタンドアロン実行ファイルからアプリケーションを起動します。

6. クラッシュを再現します。ダンプファイルは前に指定したフォルダーに作成されます。ダンプファイルを、Visual Studio や WinDbg などの任意のデバッグツールで開きます。
