22
Windows OS 상에서 효율적인 덤프 생성 및 주의점 ㈜ 제이씨엔터테인먼트 Pluto Studio 김 성 준

Windows os 상에서 효율적인 덤프

Embed Size (px)

Citation preview

Page 1: Windows os 상에서 효율적인 덤프

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

㈜ 제이씨엔터테인먼트

Pluto Studio

김 성 준

Page 2: Windows os 상에서 효율적인 덤프

이 세션의 주제는 간단히…

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

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

Page 3: Windows os 상에서 효율적인 덤프

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

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

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

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

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

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

SEH(Structured Exception Handling)

MiniDumpWriteDump(…)

Page 4: Windows os 상에서 효율적인 덤프

SEH(Structured Exception Handling)란…

System-Level SEH (Raw Operating System SEH)

Windows OS가 제공하는

Exception Handling Service

Windows O.S

Compiler-Level SEH

Page 5: Windows os 상에서 효율적인 덤프

SEH 의 본질은…

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

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

SetUnhandledExceptionFilter(…) ???

Page 6: Windows os 상에서 효율적인 덤프

System–Level-SEH

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

/SAFESEH:NO

Page 7: Windows os 상에서 효율적인 덤프

System–Level-SEH

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

Page 8: Windows os 상에서 효율적인 덤프

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)와는 다른 건가요…?

Page 9: Windows os 상에서 효율적인 덤프

Compiler-Level SEH

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

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

Page 10: Windows os 상에서 효율적인 덤프

Compiler-Level SEH

Page 11: Windows os 상에서 효율적인 덤프

Compiler-Level SEH

Page 12: Windows os 상에서 효율적인 덤프

Compiler-Level SEH

Page 13: Windows os 상에서 효율적인 덤프

Compiler-Level SEH

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

Page 14: Windows os 상에서 효율적인 덤프

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

Page 15: Windows os 상에서 효율적인 덤프

이제 어떻게….

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

그러면 어쩌라고...

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

Studio 2008 에서는 __except_handler3)는

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

Page 16: Windows os 상에서 효율적인 덤프

지금까지 한 것은…

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

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

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

Page 17: Windows os 상에서 효율적인 덤프

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

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

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

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

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

Page 18: Windows os 상에서 효율적인 덤프

MiniDumpWriteDump

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

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

Page 19: Windows os 상에서 효율적인 덤프

MiniDumpWriteDump

Page 20: Windows os 상에서 효율적인 덤프

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

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

Page 21: Windows os 상에서 효율적인 덤프

한 가지 더~~

구글에서 "SetUnhandledExceptionFilter" and VC8

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

CRT Library 3rd party components

Page 22: Windows os 상에서 효율적인 덤프

QnA