SetUnhandledExceptionFilter 를 사용하여 이벤트를 후킹하여 미니덤프를 작성 하다보면 스택 오버 플로우는 덤프 사이즈가 0kb 로 남는다.
원인을 생각해 보면, stack 은 thread 별로 할당이 되고, 이미 stack overflow 상태의 thread 에서는 미니덤프를 작성할 수가 없다. 미니덤프를 남기는 함수에서도 stack 을 사용해야 하는데, 더 사용할 공간이 없기 때문이다.
그래서 해결방법은 의외로 간단하다 새로운 thread 를 생성하고 새로 생성된 thread 에서 미니덤프를 작성 하면된다.
long __stdcall CrashDump::ExceptionHandler( PEXCEPTION_POINTERS info )
{
if( info == NULL )
{
return EXCEPTION_EXECUTE_HANDLER;
}
//stack overflow 거 걸리면 스레드 스텍이 다 사용된 것이므로 해당 스레드로는
//덤프를 남길수가 없다. 그래서 새로 스레드를 생성하여 덤프를 남긴다.
if(info->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW)
{
HANDLE hThread = CreateThread(NULL, 0, WriteDump, info, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
else
{
WriteDump(info);
}
return EXCEPTION_EXECUTE_HANDLER;
}
WriteDump 는 미니덤프를 만드는 코드가 들어있는 메소드 이다.
'programming' 카테고리의 다른 글
| stack overflow 되면 mini dump 0kb 인 문제 해결 방법 (0) | 2012/04/16 |
|---|---|
| SQL 데이타 타입에 매칭 되는 C++ 변수 타입 (0) | 2012/02/01 |
| 템플릿 특화(Template specialize)를 이용한 BOOST_STATIC_ASSERT (0) | 2010/12/08 |
| 함수 포인터 (0) | 2010/11/02 |
| 인터넷 브라우져의 Navigate 수행으로 로컬 파일 실행시키기 (0) | 2009/10/05 |
| TCP 소켓에서 KEEPALIVE 옵션 사용 (4) | 2009/04/13 |