Develope/MFC2013. 1. 24. 09:30

MINI DUMP 란?


프로그램의 메모리 릭 (Memory Leak) 이나 기타 Exception에 의하여 강제로 종료 될 때,


그 시점의 스택 및 메모리 정보를 dmp 파일로 저장한 후 종료되도록 처리하는 방법을 말한다.


일반적으로 닥터 왓슨 (Dr.Watson) 이나 윈도우 디버거 (Windows 제공) 등으로 분석이 가능하며,


Visual Studio 에서도 분석이 가능하다.


컴파일 시 생성 된 프로그램 데이터베이스 파일 (PDB) 과 심볼 (Symbol - 컴파일 시 사용된 소스 파일들)이 있다면,


문제가 발생 한 위치를 소스 위치까지 파악 할 수 있다.


자세한 분석 방법이나 덤프파일을 생성하는 방법은 추후에 다시 기록하고...


오늘은 일단 내가 경험 했던 미니덤프를 사용할 때 발생하는 문제점을 해결하는 방법을 써보려 한다.


일전에 경험에 의하면,


사이트에서 운영되던 서버 프로그램이 자꾸 죽어서 분석을 위해 확인 해보았을때,


덤프파일이 모두 0KB로 저장된 경우가 있었다.


좀 헤메이면서 찾아본 결과,


1. 프로시저가 진입하는 Main 루틴도 하나의 Thread로 동작 함.


2. Main 루틴에서 처리되는 MINIDUMP 루틴 또한 해당 Thread 스택에 종속 된다.


3. Main 루틴 자체의 메모리가 OverStack 될 경우, 덤핑을 제대로 할 수 없다.


원인은 위와 같이 정리 할 수 있다.


해결책은,


덤프 루틴에서 다음과 비슷한 방식으로 덤핑할 때 Thread로 수행해 주도록 하면 된다.



// in : LPEXCEPTION_POINTERS pExp
// ouot : EXCEPTION_EXECUTE_HANDER
LONG ExceptionFilter(LPEXCEPTION_POINTERS pExp)
{
	if(pExp == NULL){
		return EXCEPTION_EXECUTE_HANDLER;
	}

	// stack Overflow 가 걸리면 Thread Stack 이 Full 이므로 이 thread 에서는 덤프를 남길수 없으므로 새로 thread를 할당하여 수행하도록 함
	if(pExp->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW)
	{
		HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WriteDump, pExp, 0, NULL);
		WaitForSingleObject(hThread, INFINITE);
		CloseHandle(hThread);
	}
	else{
		WriteDump(pExp);
	}

	return EXCEPTION_EXECUTE_HANDLER;
}

여기서의 WriteDump 함수는 덤프를 저장하는 기능을 수행한다.



Posted by AsCarion