Windows os 상에서 효율적인 덤프

Post on 16-May-2015

3.097 views 0 download

Transcript of Windows os 상에서 효율적인 덤프

Windows OS 상에서 효율적인 덤프 생성 및 주의점

㈜ 제이씨엔터테인먼트

Pluto Studio

김 성 준

이 세션의 주제는 간단히…

우리 서버가 크래쉬 날 때 덤프를 남기고 싶어요…

으아아아아아아악!!!!!!!!!!! 도대체 뭘 해야하는지ㅠ.ㅠ

필요한 것을 생각해 보아요~

우리 서버가 크래쉬 날 때 덤프를 남기고 싶어요

첫번째로 알고 싶은 것은 “크래쉬 날때” 와

두번째로 알고 싶은 것은 “덤프 남기는 방법”

첫번째로 알고 싶은 것은 “크래쉬 날때” OS 로부터 Event를 받는 방법

두번째로 알고 싶은 것은 “덤프 남기는 API”

SEH(Structured Exception Handling)

MiniDumpWriteDump(…)

SEH(Structured Exception Handling)란…

System-Level SEH (Raw Operating System SEH)

Windows OS가 제공하는

Exception Handling Service

Windows O.S

Compiler-Level SEH

SEH 의 본질은…

“프로그램에서 Exception” 이 발생 했을 때 OS 로부터 Message를 받는 방법

“프로그램에서 Exception” 이 발생 했을 때 OS가 호출해 주는 Callback Function 등록방법

SetUnhandledExceptionFilter(…) ???

System–Level-SEH

Visual Studio 2008에서 테스트 하기 위해서는 Linker 명령줄 추가 옵션란에 아래의 옵션 추가 하세요~

/SAFESEH:NO

System–Level-SEH

System-Level-SEH 는 깊게 들어가게 되면 상당히 어려운 Issue인데 이를 더 어렵게 만드는 것은 MS로부터 공개된 문서가 전혀 없다는 거에요… 이는 해킹과 밀접한 관련이 있기 때문이죠… 그래서 Visual Stuido 6.0에는 없었지만 2005에서는 SAFESEH라는 개념이 나오기도 했어요…

Compiler-Level SEH

1. Visual Studio Compiler Keyword __try, __finally, __except

2. 이 Keyword를 사용해서 우리들은 System-Level-SEH 를 사용할 수 있습니다.

Microsoft Visual C++ 컴파일러는 C++ 예외처리를 Windows SEH(System-Level-SEH)이용하여 구현 즉, Visual C++컴파일러는 try, catch 블록을 만나면 내부적으로 Compiler-Level SEH 구문으로 변경.

Compiler-Level-SEH란...

그렇다면 C++ 예외 처리(try, catch)와는 다른 건가요…?

Compiler-Level SEH

여기서는 C++ Exception Handling에 대해서는 따로 다루지 않겠습니다.

__try대신에 try , __except대신에 catch 사용한다는 구문 차이가 있지만 내부적으로는 같습니다. C++ Exception Handling은 내부적으로 Compiler-Level-SEH 사용한다는 사실을 기억해주세요...

Compiler-Level SEH

Compiler-Level SEH

Compiler-Level SEH

Compiler-Level SEH

이 부분 실행 결과는 어떻게 될까요???

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이라고 칭하겠습니다.) 그러나. 여기서는 더 이상 자세히 다루지는 않겠습니다.

이제 어떻게….

__except(…) 구문을 통해서 Exception Filter 함수를 등록하지 마세요...

그러면 어쩌라고...

현재 실행 중인 Process에서 Exception 발생했을 때 이 Exception을 Handling 하는 어떤 Filter 함수도 없다면 Visual C++ Compiler가 만들어서 등록한 SEH Callback 함수(Visual

Studio 2008 에서는 __except_handler3)는

SetUnhandledExceptionFilter (…) API를 통해서 등록된 Filter 함수를 호출합니다.

지금까지 한 것은…

Exception이 발생 했을 때 윈도우 SEH서비스가 호출 해 주는 Callback 함수를 등록했습니다. 이것이 다입니다.

그리고 저희들은 Compiler-Level-SEH를 사용해야 하는 데 이 때 Callback되는 Filter 함수를 등록하기 위해서는 __except()구문을 사용해야 하는 것을 배웠습니다. 그러나 사용하지 말라는 것도... 대신...

Exception이 발생했을 때 호출해 달라는 Filter 함수를SetUnhandledExceptionFilter (…) API 함수를 통해서 등록해야 한다는 것을... 배웠습니다.

덤프란 무엇이며 필요한 이유는…?

Dump란 : Exception 발생 시 해당 프로그램의 메모리 내용을 파일로 저장한 파일 (Snapshot of the Application State of the exact moment of Failure).

무엇을 할 수 있을까요...?

Symbol File 즉 Exception이 발생한 실행파일 빌드시 생성된 pdb 파일이 있다면 Exception 발생 시의 메모리의 값을 Symbol 로 Resolution 해서 볼 수 있습니다.

쉽게 말하면 즉 덤프 파일을 갖고 Exception 상황을 재현해서 디버깅을 할 수 있습니다.

MiniDumpWriteDump

필요한 것들 1) 헤더 파일 : dbghelp.h 2) Library 파일 : dbghelp.lib 3) dll 파일 : dbghelp.dll

구글에서 “Debugging Tools for Windows (x86)” 검색해서 Windbg를 설치하시게 되면 설치된 폴더 안에 있는 SDK 폴더 안에 들어 있어요~~~ (현재 제가 갖고 있는 버전은 6.12.2.633 입니다. )

MiniDumpWriteDump

이 부분에 대해서 말할 게 많은데…

제가 요즘 바빠서 준비를 여기까지 밖에 못했습니다 ㅠㅠ 알고 있는 거랑 발표를 한다는 거랑은 차이가 참 많다는 것을 머리로는 알고 있었지만 막상 발표 준비를 하다 보니 제가 생각한 것 훨씬 더 이상으로 많다는 것을 뼈저리게 느꼈습니다...

한 가지 더~~

구글에서 "SetUnhandledExceptionFilter" and VC8

키워드로 검색해보세요~~~

CRT Library 3rd party components

QnA