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 함수는 덤프를 저장하는 기능을 수행한다.
'Develope > MFC' 카테고리의 다른 글
[CTreeCtrl] 트리 컨트롤 Drag & Drop (0) | 2013.03.18 |
---|---|
Overlapped IO 와 IOCP 이야기 (4) (0) | 2013.03.13 |
Overlapped IO 와 IOCP 이야기 (3-2) (0) | 2013.03.13 |
Overlapped IO 와 IOCP 이야기 (3-1) (0) | 2013.03.13 |
Overlapped IO 와 IOCP 이야기 (2) (0) | 2013.03.13 |
Overlapped IO 와 IOCP 이야기 (1) (1) | 2013.03.13 |
Visual Leak Detector (Memory Leak 찾기) (0) | 2013.02.14 |
윈도우 이벤트 로그 작성하기 (0) | 2013.01.23 |
다이얼로그 트레이 동작 설정 (1) | 2013.01.14 |
컨트롤 폰트 설정 (0) | 2012.12.18 |