# Windows 디버깅

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

Unity는 게임 및 에디터 프로세스 분석이나 라이브 디버깅 작업을 Windows에서 할 수 있도록 몇 가지 옵션을 제공합니다. Unity에서는 두 가지 유형(네이티브 C++ 디버깅, C# 관리되는 디버깅)의 디버깅을 할 수 있습니다.

* 네이티브 디버깅은 exe 및 dll 같은 관련 바이너리 파일에 대해 PDB(프로그램 데이터베이스)에 심볼을 저장합니다.
* Windows에서 표준 .NET 관리 심볼은 .pdb 확장자를 가진 PDB 파일에 저장됩니다.

## 심볼

Unity의 [심볼 스토어](http://symbolserver.unity3d.com/)를 사용하여 Windows 디버거(WinDbg)의 Unity 서버 URL에 액세스하거나 Visual Studio 2019 이상을 사용하여 심볼을 자동으로 확인하고 다운로드할 수 있습니다.

### Windows 디버거(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에서는 Microsoft가 애플리케이션 크래시를 Dr Watson/오류 보고를 통해 Microsoft로 전송하도록 자동으로 설정합니다. 그러나 Visual Studio 또는 WinDbg를 설치한 경우 Microsoft는 대신 [크래시 디버깅](https://msdn.microsoft.com/en-us/library/windows/desktop/bb204634\(v=vs.85\).aspx)을 선택할 수 있는 옵션을 제공합니다.

다음 레지스트리 파일 콘텐츠에 따라 설치하십시오.

```
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) 확장자를 사용하면 디버깅이 훨씬 더 쉬워집니다.

#### 네이티브 랜드의 관리 예외

`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  
```

정보가 없는 라인은 관리되는 프레임입니다. 스택 프레임의 주소를 수신하고 정보가 포함된 char\*를 반환하는 `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** 플랫폼에 모두 적용됩니다.

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 플랫폼이나 Windows 스탠드얼론 실행 파일을 통해 애플리케이션을 실행합니다.

6. 크래시를 재현합니다. 덤프 파일은 앞서 지정한 폴더에 생성됩니다. 원하는 디버깅 툴(예: Visual Studio 또는 WinDbg)을 사용하여 덤프 파일을 열 수 있습니다.
