Unity には、ゲームやエディター処理のフォレンジックやライブデバッグ作業のために、Windows でデバッグを実施するオプションがいくつかあります。Unity では、ネイティブ C++ と C# マネージの 2 種類のデバッグが可能です。
Unity のシンボルストアを使用して、Windows Debugger (WinDbg) または Visual Studio 2019 以降で Unity サーバー URL にアクセスし、シンボルの分解とダウンロードを自動で行うことができます。
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 をデバッグのために設定するには、以下のステップに従います。 1. Tools > Options を選択します 2. Debugging セクションを展開し、Symbols を選択します 3. キャッシュディレクトリを指定します (指定されていない場合) 4. Unity のシンボルストアなど、シンボルファイル (.pdb) の場所を追加します。
ライブデバッグは、すでに実行中のプロセス、または例外が検出されたプロセスにデバッガーを接続するシナリオです。デバッガーで問題を見つけるには、Visual Studio の設定のセクションで説明されているステップを使用して、ビルドにシンボルを追加する必要があります。また、ゲームの実行ファイルがゲームと同じ名前である場合、デバッガーは、名前が変更された実行ファイルにアクセスできない場合には特に、正しい .pdb ファイルの検出に問題が発生する可能性があります。
Windows では、アプリケーションクラッシュが自動的に Dr Watson/Error に送信され、Microsoft に報告されるように、Microsoft によってセットアップされています。ただし、Visual Studio または WinDbg がインストールされている場合は、代わりにクラッシュのデバッグを選択するオプションが、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 拡張子を使用できます。
NullReferenceException は通常、以下のように表示されます。
1b45558c()
> 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()
> 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) 用 (デスクトップで実行している場合) です。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting に移動します。LocalDumps フォルダーがない場合は作成します。“DumpFolder”=<FolderPath goes here> , e.g., C:\Temp“DumpCount”=dword:00000010“DumpType”=dword:00000002