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' 카테고리의 다른 글
GetLastError 함수 코드와 한글 메시지 (0) | 2013.08.26 |
---|---|
ODBC 관리자는 32bit 64bit 호환 되지 않는다 (2) | 2012.09.14 |
SQL 데이타 타입에 매칭 되는 C++ 변수 타입 (0) | 2012.02.01 |
템플릿 특화(Template specialize)를 이용한 BOOST_STATIC_ASSERT (0) | 2010.12.08 |
함수 포인터 (0) | 2010.11.02 |