MiniDump (오류덤프시스템)
MiniDump (오류덤프시스템) 은 ProudNet에서 제공하는 기능으로 온라인 게임 서비스를 하는 중에 게임 클라이언트 또는 게임 서버가 충돌했을 때 원인을 추적하고 신속하게 조치하기 위해 오류 정보를 개발사에서 바로 수집할 수 있습니다.
오류 정보는 *.DMP 파일로 수집 되며, 개발자는 수집된 덤프 파일을 개발 도구(예: Visual Studio 등)에서 열어 소스 파일 어느 라인에서 충돌이 발생했는지 체크할 수 있게 됩니다.
오류 덤프 시스템 구축하기 튜토리얼
오류 덤프 시스템 구축하기 튜토리얼은 게임 서버 및 클라이언트를 포함하였습니다.
(1) DbgHelp 라이브러리 설치
OS가 설치된 폴더 (C:\Windows\system32) 또는 프로그램 현재 폴더에 dbghelp.dll 을 복사해 넣습니다. dbghelp.dll 은 (ProudNet 설치경로)\ProudNet\Sample\Bin 에 있습니다.
(2) Visual Studio 컴파일 옵션 설정
MiniDump (오류덤프시스템) 을 위해서는 아래와 같이 C++ 컴파일 설정을 해주셔야 합니다.

Visual Studio 2003의 경우 위와 같이 설정할 수 없으므로 'No'를 선택 후 Configuration Properties -> C/C++ -> Command Line -> Additional Options에서 /EHa 를 추가해야 합니다.
(3) 덤프 서버 제작 예제
덤프 클라이언트에서 보내온 오류 정보 덤프 파일을 수집하는 역할을 수행합니다.
(4) 덤프 클라이언트 제작 예제
덤프 클라이언트는 오류 정보를 담은 덤프 파일을 덤프 서버에 전송하는 역할을 합니다.
프로세스에서 충돌이 발생하면 자동으로 임시 *.DMP 덤프파일이 만들어지고, 다시 프로세스가 실행되면서 명령인자(Command Argument)에 오류레벨정보가 첨부됩니다.
이렇게 명령인자로 들어온 오류레벨정보는 심각성에 따라 분기 처리해야 하며, MiniDumpAction_AlarmCrash의 경우 심각한 오류에 해당하므로 반드시 덤프 파일을 덤프 서버에 전송해주는 코드를 작성해야 합니다.
(5) 게임 서버를 위한 덤프 클라이언트 제작하기
게임 서버는 일반적으로 사용자 UI를 제공하지 않기 때문에 오류 보고 대화 상자를 띄우지 않고 *.DMP 덤프파일을 곧바로 덤프 서버에 전송하도록 코드를 작성해야 합니다.
(6) 게임 클라이언트를 위한 덤프 클라이언트 제작하기
게임 클라이언트는 일반적으로 사용자 UI가 제공되므로 오류 보고를 띄워서 생성된 *.DMP 덤프파일을 덤프 서버에 전송할 것인지 아니면 생략할 것인지 여부를 게임 사용자에게 확인 후 진행하도록 코드를 작성해야 합니다.
주의
모든 모바일 환경에서의 덤프 클라이언트는 지원하지 않습니다.
Proud.CMiniDumpParameter 를 사용하여 반드시 덤프 시스템을 초기화해야 합니다.
유니코드 프로그래밍 모델의 경우 main 함수의 와이드 문자 버전을 정의할 수 있는데, wmain 함수에 대한 argv 및 envp 매개 변수는 wchar_t* 형식을 사용해야 합니다.
MiniDumpAction_AlarmCrash, MiniDumpAction_DoNothing 의 경우 분기처리 이후 반드시 return을 호출하여 무한 루프에 빠질 수 있으므로 프로그램을 종료해야 합니다.
오류 덤프 시스템 활용
- C 런타임 오류를 오류 덤프 시스템에서 가로채기
STL에서 out-of-the-range 오류나 pure virtual function이 런타임에서 호출되는 오류는 기본적으로 오류 덤프 시스템에서 감지하지 못합니다.
오류 덤프 시스템은 Structured Exception 만을 처리하는데, 상기 오류는 C runtime library에서 소화되기 때문입니다. 따라서 이들 오류가 C runtime library에서 소화되기 전에 Structured Exception으로 우회시켜야 오류 덤프를 남길 수 있습니다.
아래는 오류 덤프를 남기는 방법입니다.
- 중단없는 오류 덤프 시스템(Exception Logger)
ProudNet에서는 프로그램에서 오류가 발생할 경우 프로그램을 종료하지 않고 오류 위치를 계속해서 남기는 기능을 제공합니다. 이를 중단없는 오류 덤프 시스템(Exception Logger)이라고 부릅니다.
일반적인 게임 서버는 충돌이 발생되면 즉시 상황을 덤프로 남기고 프로그램을 재시작 하지만 부득이한 경우, 프로그램을 재시작하지 않은 채로 오류가 나는 상황을 유지하며 억지로 게임 서버의 실행 유지를 강행해야 하는 경우도 있습니다.
그러나 이미 메모리 상태가 망가진 서버 프로그램이 계속 실행되면 위험하니 주의해야 합니다.
중단없는 오류 덤프 시스템 제작 전 체크사항
DbgHelp 라이브러리(dbghelp.dll)를 설치해야 합니다.
Visual Studio 의 C++ Exception 컴파일 옵션을 설정해야 합니다.
Include : DumpCommon.h, MiniDumper.h
Link : ProudNetCommon.lib
제작 예제
프로그램의 시작점(Main Entry Point)에서 CExceptionLogger::Instance().Init() 함수를 호출하여, CExceptionLogger 인스턴스를 반드시 초기화합니다. IExceptionLoggerDelegate 추상클래스를 상속하고 GetDumpDirectory() 멤버를 오버라이딩하여 덤프파일 경로를 정의해 줍니다. 공백("")을 리턴할 경우 현재 폴더에 덤프파일이 저장됩니다.
Windows XP와 Windows 2003 Server 또는 그 이후의 버전의 운영체제에서 동작합니다. CExceptionLogger 클래스와 ATLTRACE() 또는 OutputDebugString() 를 혼용하여 사용한다면 로그 기록의 부하로 프로그램 성능이 저하될 수 있습니다.
본 예제 소스 파일은 <설치 폴더>\Sample\SimpleExceptionLogger 에 있습니다.
SimpleExceptionLogger 예제는 1.7.33863버전 이후로 지원되지 않습니다.
- 프로세스의 현재 상태를 덤프 파일로 남기기
오류 상황이 아니더라도 프로세스의 현재 상태를 덤프 파일로 남기는 기능이 있는데, 이는 저장된 덤프 파일은 해당 덤프가 된 프로그램을 빌드 할 때 같이 생성된 디버그 정보 파일(.pdb)과 함께 열면 프로세스의 실행 중이던 상황을 소스 수준에서 볼 수 있습니다.

이 기능으로 디버깅이 어려운 환경에서도 프로세스의 현재 상태를 덤프로 남길 수 있습니다. Proud.CMiniDumper.WriteDumpFromHere 를 호출하면 호출한 시점에서의 프로세스 내 모든 스레드의 호출 스택을 덤프 파일로 저장합니다.
Last updated
Was this helpful?