게임을 배포했습니다. 그런데 무언가 잘못되어 몇몇 유저들의 클라이언트가 비정상종료가 됩니다.
게시판이 난리가 나고 전화기에 불이 나고 머리는 노래지고.. 까진 보통 아니긴 합니다..
어쨌든!! 그런데 dmp파일이 안날아옵니다! 미니덤프를 붙였는데!!! 어째서!!!
보통 정상적인 경우에는 미니덤프 파일이 잘 남습니다. 하지만 가끔 미니덤프가 안남는 경우가 있습니다.
- 미니덤프 파일을 만들다가 에러가 난 경우
-> 가끔 있는 경우지만 정말 가끔 덤프파일을 만드는 동안 에러가 나는 경우가 존재합니다. 이 경우 0바이트짜리 dmp파일을 만나게 되지요.. - 안티 해킹 솔루션을 사용하는 경우
-> 안티 해킹 솔루션의 경우 여러가지를 해주는데 그중 제 경험상으로는 프로세스목록에서 게임 프로세스를 감추거나 프로그램이 로드 되고 난 이후에 몇가지 정보를 날리거나 하는 경우에 미니덤프가 덤프파일을 생성하지 못합니다.. - 그리고 또 다른 경우는.. 생각나지 않네요
이렇게 미니덤프를 붙였는데도 불구하고 덤프파일이 안남는 경우!! 디버깅을 포기할껀가요?!
일단 먼저 에러가 난 상황을 있는 그대로 파일로 저장해야 합니다.
저는 이것을 에러 리포트 파일이라고 부릅니다.
그리고 덤프파일과 에러 리포트 파일을 모두 남기죠..
제가 지금부터 쓰는 글은 어셈블리어를 공부할 필요도 냄비 받침으로도 부담스러운 디버깅 어쩌고 하는 책을 공부할 필요도 없습니다. 단지 짐승같은 센스와 명탐정 코난의 빙의만 하시고 그냥 따라오시면 됩니다.
보통 미니덤프 어떻게 붙이죠??
인터넷에 "미니덤프" 검색하면 나오는 코드를 그대로 복사해서 WinMain 밑에 넣으실겁니다.
그 과정에 대해 자세히 알 필요는 없습니다.
static LONG WINAPI _UnhandledExceptionFilter( PEXCEPTION_POINTERS pExceptionInfo )
{
// 여기에 미니덤프를 연결할테다!
return EXCEPTION_CONTINUE_SEARCH;
}
이런 함수를 하나 만들고
int WINAPI wWinMain( HINSTANCE instance, HINSTANCE, LPWSTR commandLine, int commandShow )
{
::SetUnhandledExceptionFilter( _UnhandledExceptionFilter );
...
}
이렇게 넣으실겁니다. 여기서!! PEXCEPTION_POINTERS 이녀석이 중요합니다!
PEXCEPTION_POINTERS 이녀석이 현재 에러가 난 정보를 가지고 있기 때문이죠.
이녀석을 통해 에러가 난 상황을 텍스트로 남길 수 있습니다.
먼저 에러가 발생한 이유를 남겨보도록 하죠. 무엇 때문에 에러가 난 것인지는 알아야 할 것 아닙니까?!
PEXCEPTION_POINTERS의 멤버에는 PEXCEPTION_RECORD 라는 녀석이 존재합니다.
먼저 PEXCEPTION_RECORD가 어떤 멤버들을 가지고 있는지 살펴봅시다
typedef struct _EXCEPTION_RECORD
{
DWORD ExceptionCode;
DWORD ExceptionFlags;
struct _EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress;
DWORD NumberParameters;
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;
이런 데이터들을 가지고 있는 구조체인데요.
이걸 하나하나 설명하려다가... 구글링을 해보니 굉장히 좋은 소스가 있어서!!!
걍 링크를 걸고 중요한것들만 설명하기로 했습니다!!!
사용방법은 간단합니다. _UnhandledExceptionFilter 함수 안에
WheatyExceptionReport::WheatyUnhandledExceptionFilter( pExceptionInfo );
이것만 넣어주면 됩니다.
오늘은 이만 저장해놓고 나중에..
반응형
'프로그래밍' 카테고리의 다른 글
도플광어의 html5 게임엔진 만들기 1편. 웹은 게임기이다. (9) | 2013.05.05 |
---|---|
비쥬얼 스튜디오 디버깅 팁 ( Visual Studio Debugging Tips ) (31) | 2013.04.10 |
std::numeric_limits 의 min, max는 왜 클래스 내부 초기화를 할 수 없는가?! (4) | 2013.04.06 |
C++에서 ID Type이 필요할때 어떻게 쓰시나요?? (0) | 2013.04.05 |
cocos2d-x 프로파일링 기능에 관한 짧은 팁 (0) | 2013.04.05 |