1. Windows OS 상에서 효율적인 덤프
생성 및 주의점
㈜ 제이씨엔터테인먼트
Pluto Studio
김성준
2. 이 세션의 주제는 간단히…
우리 서버가 크래쉬 날 때 덤프를 남기고 싶어요…
으아아아아아아악!!!!!!!!!!!
도대체 뭘 해야하는지ㅠ.ㅠ
3. 필요한 것을 생각해 보아요~
우리 서버가 크래쉬 날 때 덤프를 남기고 싶어요
첫번째로 알고 싶은 것은 “크래쉬 날때”
첫번째로 알고 싶은 것은 “크래쉬 날때” 와
OS 로부터 Event를 받는 방법
SEH(Structured Exception Handling)
API”
두번째로 알고 싶은 것은 “덤프 남기는 방법”
MiniDumpWriteDump(…)
5. SEH 의 본질은…
“프로그램에서 Exception” 이 발생 했을 때
OS 로부터 Message를 받는 방법
SetUnhandledExceptionFilter(…) ???
“프로그램에서 Exception” 이 발생 했을 때
OS가 호출해 주는 Callback Function 등록방법
6. System–Level-SEH
Visual Studio 2008에서 테스트 하기 위해서는
Linker 명령줄 추가 옵션란에 아래의 옵션 추가 하세요~
/SAFESEH:NO
7. System–Level-SEH
System-Level-SEH 는 깊게 들어가게
되면 상당히 어려운 Issue인데 이를 더
어렵게 만드는 것은 MS로부터 공개된
문서가 전혀 없다는 거에요…
이는 해킹과 밀접한 관련이 있기 때문
이죠…
그래서 Visual Stuido 6.0에는 없었지
만 2005에서는 SAFESEH라는 개념이
나오기도 했어요…
8. Compiler-Level SEH
Compiler-Level-SEH란...
1. Visual Studio Compiler Keyword
__try, __finally, __except
2. 이 Keyword를 사용해서 우리들은
System-Level-SEH 를 사용할 수 있습니다.
그렇다면 C++ 예외 처리(try, catch)와는
다른 건가요…?
Microsoft Visual C++ 컴파일러는 C++ 예외처리를
Windows SEH(System-Level-SEH)이용하여 구현 즉,
Visual C++컴파일러는 try, catch 블록을 만나면
내부적으로 Compiler-Level SEH 구문으로 변경.
9. Compiler-Level SEH
여기서는 C++ Exception Handling에 대해서는 따로 다루지 않겠습니다.
__try대신에 try , __except대신에 catch 사용한다는 구문 차이가 있지만
내부적으로는 같습니다. C++ Exception Handling은 내부적으로
Compiler-Level-SEH 사용한다는 사실을 기억해주세요...
14. Compiler-Level SEH
저희들은 Compiler-Level SEH Mechanism을 사용해서 SEH Callback 함
수를 등록할 수 있습니다.
바로 __except( filterCallbackFunction(GetExceptionInformation() ) )
구문이 filterCallbackFunction(…) 함수를 SEH Callback 함수로 등록하는
부분입니다.
얼핏 보면 FS:[0]에 Exception Handler 함수를 등록하는 System-Level SEH
와 비슷해 보이지만 다릅니다.
Compiler-Level-SEH 에서는 Visual C++ 컴파일러마다 다르지만 컴파일러가
우리 몰래 만든 6.0에서는 __except_handler3함수를 2008에서는
_except_handler4 함수를 FS:[0]에 등록을 하고 이 함수가 호출해 주는
Callback 함수를 __except 구문을 통해서 등록을 합니다.(이후 이 함수를
Callback함수라 하지 않고 Filter Function이라고 칭하겠습니다.)
그러나. 여기서는 더 이상 자세히 다루지는 않겠습니다.
15. 이제 어떻게….
__except(…) 구문을 통해서 Exception Filter 함수를
등록하지 마세요...
그러면 어쩌라고...
현재 실행 중인 Process에서 Exception 발생했을 때 이
Exception을 Handling 하는 어떤 Filter 함수도 없다면 Visual
C++ Compiler가 만들어서 등록한 SEH Callback 함수(Visual
Studio 2008 에서는 __except_handler3)는
SetUnhandledExceptionFilter (…) API를 통해서 등록된
Filter 함수를 호출합니다.
16. 지금까지 한 것은…
Exception이 발생 했을 때 윈도우 SEH서비스가
호출 해 주는 Callback 함수를 등록했습니다.
이것이 다입니다.
그리고 저희들은 Compiler-Level-SEH를 사용해야 하는 데
이 때 Callback되는 Filter 함수를 등록하기 위해서는 __except()
구문을 사용해야 하는 것을 배웠습니다.
그러나 사용하지 말라는 것도... 대신...
Exception이 발생했을 때 호출해 달라는 Filter 함수를
SetUnhandledExceptionFilter (…) API 함수를 통해서 등록해야
한다는 것을... 배웠습니다.
17. 덤프란 무엇이며 필요한 이유는…?
Dump란 :
Exception 발생 시 해당 프로그램의 메모리 내용을
파일로 저장한 파일
(Snapshot of the Application State of the exact moment of Failure).
무엇을 할 수 있을까요...?
Symbol File 즉 Exception이 발생한 실행파일 빌드시 생성된 pdb 파일이 있
다면 Exception 발생 시의 메모리의 값을 Symbol 로 Resolution 해서 볼 수
있습니다.
쉽게 말하면 즉 덤프 파일을 갖고 Exception 상황을 재현해서 디버깅을 할
수 있습니다.
18. MiniDumpWriteDump
필요한 것들
1) 헤더 파일 : dbghelp.h
2) Library 파일 : dbghelp.lib
3) dll 파일 : dbghelp.dll
구글에서 “Debugging Tools for Windows (x86)” 검색해서
Windbg를 설치하시게 되면 설치된 폴더 안에 있는 SDK 폴더 안에
들어 있어요~~~
(현재 제가 갖고 있는 버전은 6.12.2.633 입니다. )
20. 이 부분에 대해서 말할 게 많은데…
제가 요즘 바빠서 준비를 여기까지 밖에 못했습니다 ㅠㅠ
알고 있는 거랑 발표를 한다는 거랑은 차이가 참 많다는 것을
머리로는 알고 있었지만
막상 발표 준비를 하다 보니 제가 생각한 것 훨씬 더 이상으로
많다는 것을 뼈저리게 느꼈습니다...
21. 한 가지 더~~
CRT Library
3rd party components
구글에서
"SetUnhandledExceptionFilter" and VC8
키워드로 검색해보세요~~~