programming2012. 4. 16. 10:31

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 는 미니덤프를 만드는 코드가 들어있는 메소드 이다.
Posted by 상현달