Version: 2022.1
언어: 한국어
Windows용 Visual Studio 프로젝트 생성
WindowsLowIntegrity

Windows 디버깅

Unity는 게임 및 에디터 프로세스 분석이나 라이브 디버깅 작업을 Windows에서 할 수 있도록 몇 가지 옵션을 제공합니다.

네이티브 vs. 관리 디버깅(Native vs. Managed Debugging)

Unity에서는 두 가지 타입(네이티브 C++ 디버깅, C# 관리되는 디버깅)의 디버깅을 할 수 있습니다.

네이티브 디버깅(Native Debugging)

네이티브 디버깅은 exe와 dll처럼 관련된 바이너리 파일에 대한 pdb 파일에 심볼을 저장합니다.

관리 디버깅(Debugging)

Windows에서 일반 .NET 관리 심볼은 pdb 파일에 저장됩니다.

심볼

Unity는 http://symbolserver.unity3d.com/에 심볼 스토어를 제공합니다. Microsoft의 심볼 스토어와 마찬가지로 자동 심볼 해상도와 다운로드를 위해 Windows Debugger (WinDbg) 또는 Visual Studio 2019 이상에서 Unity 서버 URL을 사용할 수 있습니다.

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 설치

  1. Tools > Options로 이동합니다.
  2. Debugging 섹션을 확장한 후 Symbols를 선택합니다.
  3. 캐시 디렉토리를 지정하지 않은 경우 지정합니다.
  4. ** 심볼 파일 (.pdb) 위치(http://symbolserver.unity3d.com/)"를 추가합니다.

라이브 디버깅(Debugging)

라이브 디버깅은 정상적으로 실행 중이거나 예외 오류가 발생한 프로세스에 디버거를 부착하는 경우입니다. 디버거가 상황을 파악할 수 있도록 심볼이 빌드에 포함되어야 하며 위의 과정을 통해 이루어집니다. 또한 게임 실행 파일은 게임 이름에 따라 명명되므로, 만일 변경된 실행 파일에 디버거가 접근할 수 없으면 디버거가 올바른 pdb 파일을 검색할 때 문제가 발생할 수 있습니다.

자동 예외 디버깅 설정

Windows에서 Microsoft는 애플리케이션 크래시가 발생하는 경우 자동으로 Dr Watson이나 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를 실행한 후 즉시 디버거가 연결되도록 할 것입니다.

사후/분석 디버깅(Debugging)

Windows는 .dmp나 .mdmp와 같은 크래시 덤프 파일을 분석할 수 있는 퍼실리테이터를 제공합니다. 크래시 덤프 타입에 따라 스택 정보나 전체 프로세스 메모리를 확인할 수 있습니다. 덤프 파일의 콘텐츠는 크래시의 원인을 결정하며 여기에는 일반적으로 분석할 최소 한 개의 스택이 있습니다(단, 스택이 유효해야 함).

덤프 파일을 분석하려면 Visual Studio나 WinDbg를 통해 파일을 로드해야 합니다. Visual Studio는 익숙해서 사용하기는 편리하지만 WinDbg에 비해 기능이 제한되어 있습니다.

디버깅(Debugging) 힌트와 요령

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는 스택 프레임의 주소를 수용한 후 정보와 함께 char*를 리턴하는 mono_pmip 빌트인 함수가 있습니다. mono_pmip를 Visual Studio에서 바로 호출하려면 아래의 행을 추가해야 합니다.

?(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 심볼이 올바르게 로드된 경우에만 작동합니다.

애플리케이션 덤프(Dumps) 강제 생성

때때로 애플리케이션이 부착된 디버거와 크래시를 유발하지 않거나, 디버거를 사용할 수 없는 원격 장치에서 애플리케이션 크래시가 발생하는 경우가 있습니다. 하지만 덤프 파일을 얻을 수 있다면 유용한 정보를 얻을 수 있습니다. 아래의 과정을 참조하십시오.

참고: 아래 과정은 데스크톱 실행 시 Windows Standalone이나 유니버설 Windows 플랫폼에 모두 적용됩니다.

  1. 레지스트리를 엽니다.
  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 Standalone 실행 파일을 통해 애플리케이션을 실행합니다.
  6. 크래시를 재현합니다. 덤프 파일은 미리 지정한 폴더에 생성됩니다. Visual Studio나 WinDbg로 덤프 파일을 열 수 있습니다.
Windows용 Visual Studio 프로젝트 생성
WindowsLowIntegrity