미니덤프 확장

개발 2009/09/03 09:09 김성민
한달쯤전에 GPG 7을 받았습니다.

1.10 장에 눈에 띄는 내용이 있더군요.

스택 오버 플로 예외가 발생했을 때, 다른 스레드를 하나 생성해서 그쪽으로 스레드 핸들과 예외 포인터를 넘겨서 덤프를 기록한다는 내용이었습니다. 슈도 코드로 보자면 대충 아래와 같은 모양입니다.

typedef struct _DUMP_PARAMETER
{
  HANDLE              Thread;
  PEXCEPTION_POINTERS ExPtrs;
} DUMP_PARAMETER, *PDUMP_PARAMETER;

DWORD WINAPI WriteDump(LPVOID param)
{
  PDUMP_PARAMETER dumpParam = reinterpret_cast<PDUMP_PARAMETER>(param);
  ...
}

LONG WINAPI HandleException(PEXCEPTION_POINTERS exPtrs)
{
  if (exPtrs)
  {
      PDUMP_PARAMETER dumpParam = (PDUMP_PARAMETER)malloc(sizeof(DUMP_PARAMETER));
      dumpParam->Thread = GetCurrentThread();
      dumpParam->ExPtrs = exPtrs;
      if (exPtrs->ExceptionRecord->ExceptionCode != EXCEPTION_STACK_OVERFLOW)
      {
          WriteDump(dumpParam);
      }
      else // 스택 오버플로 발생 시에는 별도의 스레드를 생성해서 덤프를 기록한다.
      {
          HANDLE hThread = CreateThread(NULL, 102400, WriteDump, dumpParam, 0, NULL);
          WaitForSingleObject(hThread, INFINITE);
          CloseHandle(hThread);
      }
  }
  return EXCEPTION_EXECUTE_HANDLER;
}

void main()
{
  ...
  // 예외 처리 핸들러를 설정한다.
  SetUnhandledExceptionFilter(HandleException);
  ...
}


보다시피 그리 어려운 내용이 아니라 얼른 사용 중인 코드에다 저 로직을 집어넣었습니다. 하지만 실제로 스택 오버플로가 발생했을 때, 스레드 생성을 위한 스택은 남아있을까... 라는 생각에 미심쩍었는데 얼마 전에 요놈 덕분에 버그를 하나 잡았습니다. 깔깔깔~

또한 2주일쯤 전에는 Jochen Kalmbach라는 분의 블로그에서 SetUnhandledExceptionFilter 함수와 관련된 글을 읽었습니다. 자세한 내용은 여기 있는데 CRT 내부에서 뭔가 건드리기 때문에 예외가 발생해도 유저가 설치한 예외 핸들러가 호출되지 않을 수 있다는 이야기였습니다.

스택 오버플로도 그렇고, CRT 내부에서 삽질하는 것도 그렇고 그냥 프로세스가 사라지죠. 미니 덤프를 사용하시는 분이라면 저 2가지 내용을 처리해두시는 것이 도움이 될 겁니다.

다만 2번째 글의 함수는 뭔가 코드 영역에다 쓰기를 하는 함수라서 그런지 비스타에서 동작하지 않더군요. 뭐 상관없습니다. 게임 서버 비스타에서 돌릴 일 없으니까~ 음핫핫.
2009/09/03 09:09 2009/09/03 09:09
TAG
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://serious-code.net/tc/rss/response/13

댓글+트랙백 ATOM :: http://serious-code.net/tc/atom/response/13

트랙백 주소 :: http://serious-code.net/tc/trackback/13

트랙백 RSS :: http://serious-code.net/tc/rss/trackback/13

트랙백 ATOM :: http://serious-code.net/tc/atom/trackback/13

댓글을 달아 주세요

댓글 RSS 주소 : http://serious-code.net/tc/rss/comment/13
댓글 ATOM 주소 : http://serious-code.net/tc/atom/comment/13
[로그인][오픈아이디란?]