Version: 2022.3
言語: 日本語
Visual Studio project generation for Windows
Windows 整合性制御

Windows のデバッグ

Unity は、ゲームやエディタープロセスのフォレンジックデバッグやライブデバッグのために、Windows 上でデバッグするためのいくつかのオプションを提供します。Unity では、ネイティブの C++ デバッグと C# マネージデバッグの 2 種類のデバッグが可能です。

  • ネイティブデバッグは、exe や dll などの関連するバイナリファイル用に、シンボルをプログラムデータベース (PDB) に保存します。
  • Windows では、標準 .NET マネージシンボルが PDB ファイルに保管されます。

シンボル

Windows デバッガー (WinDbg) で Unity サーバー URL にアクセスするには Unity の シンボルストア を使います。または、Visual Studio 2019 以降は、シンボルの自動解決とダウンロードに対応しています。

Windows デバッガー (WinDbg) の設定

.sympath コマンドを使用すると、簡単に WinDbg にシンボルストアを加えることができます。

.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 の シンボルストア など、シンボルファイル (.pdb) の場所 を追加します。

Live デバッギング

Live デバッギングは、すでに実行中の処理や、例外をキャッチした場所にデバッガーを接続する想定です。デバッガ―が状態を把握するために、Visual Studio の設定 セクションで説明する手順を使用して、シンボルをビルド内に加える必要があります。さらに、ゲームの実行可能ファイルの名前がゲーム名と同じである場合 (特に名前が変更された実行可能ファイルにアクセスできない場合)、デバッガーが正しい .pdb ファイルを見つけるのに問題が発生する可能性があります。

自動例外デバッグの設定

Windows では、アプリケーションクラッシュが自動的に Dr Watson/Error Reporting に送信され 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 Code 用の 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 というビルトイン関数を使用します。この関数は、スタック フレームのアドレスを受け取り、情報とともに char* を返します。 デバッグのために Visual Studio のイミディエイトウィンドウで 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 プラットフォームがデスクトップで実行されている場合に適用できます。

  1. Windows のレジストリを開きます。
  2. HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\Windows Error Reporting へ移動します。
  3. LocalDumps フォルダーがない場合は作成します。
  4. 以下のキーを加えます。
    • "DumpFolder"=<FolderPath goes here> , e.g., C:\\Temp
    • "DumpCount"=dword:00000010
    • "DumpType"=dword:00000002
  5. ユニバーサル Windows プラットフォームまたは Windows スタンドアロン実行ファイルを介してアプリケーションを起動します。
  6. クラッシュを再現します。先に指定したフォルダーにダンプファイルが作成されます。ダンプファイルは、Visual Studio や WinDbg などのデバッグツールで開くことができます。
Visual Studio project generation for Windows
Windows 整合性制御