꽃미남 프로그래머 김포프가 창립한 탑 프로그래머 양성 교육 기관 POCU 아카데미 오픈!
절찬리에 수강생 모집 중!
프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 끼로

게임을 배포했습니다. 그런데 무언가 잘못되어 몇몇 유저들의 클라이언트가 비정상종료가 됩니다.

게시판이 난리가 나고 전화기에 불이 나고 머리는 노래지고.. 까진 보통 아니긴 합니다..

어쨌든!! 그런데 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;

이런 데이터들을 가지고 있는 구조체인데요. 
이걸 하나하나 설명하려다가... 구글링을 해보니 굉장히 좋은 소스가 있어서!!!
걍 링크를 걸고 중요한것들만 설명하기로 했습니다!!!

WheatyExceptionReport

사용방법은 간단합니다. _UnhandledExceptionFilter 함수 안에 

WheatyExceptionReport::WheatyUnhandledExceptionFilter( pExceptionInfo );

이것만 넣어주면 됩니다.


오늘은 이만 저장해놓고 나중에..


댓글을 달아 주세요