< 프로세스 비정상 종료시 처리방법 >
- 우리팀 prince께 도움을 받았음. ^^
프로그램을 작성하다 보면, 예기치 않게 비정상 종료되는 문제가 발생하게 됩니다. 특히나 서버 프로그램을 작성하다 보면 이러한 비정상 종료는 이슈가 많이 됩니다. 이러한 비정상 종료로 서비스가 장시간 운영되지 못하는 문제를 해결하기 위하여 대체로 모든 서버 서비스는 감시 프로그램(watchdog)을 따로 두지요. 즉, 혹시 중요한 서비스 프로그램이 비정상 종료되면 얼른 다시 띄워주자는 것이지요.
특정 제품에 대한 사이트 지원을 하다보면 참으로 답답할 때가 많습니다. 아무런 정보 없이, 프로그램 죽었다고 들어오는 경우이지요. 프로그램에 대한 디버그 로그라도 상세히 심어놓은 경우는 그나마 다행입니다만, 모든 예외 처리에 열심히 로그 기록하기도 보통 어려운 일은 아닙니다. 이러한 경우를 대비하여 프로세스가 비정상 종료될 때, 해당 예외 처리를 미리 해 둔다면 참으로 유용할 것입니다.
이러한 방법은 다음과 같은 용도로 쓸 수 있을 겁니다. 저는 참고로 두번째 이유로 쓸 필요가 있었답니다.
- 비정상 종료 분석 위해서 덤프 파일 생성하고 싶을 때
- 비정상 종료를 감쪽같이 숨기고 싶을때 (기본적으로 비정상 종료시 시스템 이벤트 로그에 남아요.)
사용 방법은 다음과 같습니다.
1. UnhandledException에 대하여 다음 함수를 콜백하도록 등록하여, 필요한 작업을 수행해 준다.
LONG __stdcall HelperExceptionFilter(struct _EXCEPTION_POINTERS * pContext) { LONG lRet = EXCEPTION_EXECUTE_HANDLER; DWORD dwRet = ERROR_SUCCESS; __try { TerminateProcess(GetCurrentProcess(), 0); } __finally { if(ERROR_SUCCESS != dwRet) { lRet = EXCEPTION_CONTINUE_SEARCH; } } return lRet; }
2. 프로세스 시작 시점에 다음과 같은 함수로 UnhandledException 필터를 걸어준다.
int main(int argc, char* argv[]) { SetUnhandledExceptionFilter(HelperExceptionFilter); // do something return 0; }
3. 비정상 종료 되었던 exception 들에 대하여 HelperExceptionFilter 함수 내에서 정보 기록 및 처리해 준다.
끝.
'Programming > Code' 카테고리의 다른 글
[MFC] VS 2008에서 OnInitDialog 이벤트 함수 추가하기 (8) | 2010.05.26 |
---|---|
[C#] 모델리스(modeless) 다이얼로그 이벤트 처리하기 (0) | 2010.04.28 |
[C#] ObservableCollection을 List로 변환하여 정렬하기 (0) | 2010.03.25 |
STL을 대체할 C# 타입 (0) | 2010.03.11 |
윈도우 시스템 심벌 파일 사용하기 (0) | 2010.02.19 |
댓글