Post-Morden Debugging Your Application with Minidumps and Visual Studio.NET

원본 출처: http://www.codeproject.com/KB/debug/postmortemdebug_standalone1.aspx?fid=3419&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26&select=1246024

Summary: 고객쪽에서 여러분의 응용프로그램이 다운되었다고 하더라도 minidumps 와 Microsoft Visual Studio.NET 디버거를 이용하여 디버깅을 할 수 있습니다. 이 아티클은 어떻게 minidumps 가 동작하는지, 어떻게 여러분의 프로그램이 다운될 때 덤프 파일을 생성할 수 있는지, 어떻게 덤프 파일을 Visual Studio.NET 에서 읽을 수 있는지에 대해 설명하고 있습니다. Minidumps 는 윈도우 운영체제와 Visual Studio.NET 과 같은 응용프로그램들의 안정성을 향상시키기 위한 Microsoft 의 에러 리포팅 프로그램의 핵심입니다. 이 아티클은 또한 어떻게 시스템 컴포넌트 중에 자동적으로 심볼을 찾는 Microsoft 심볼 서버를 사용하는지 설명하고 있습니다. 이 아티클은 여러분이 Win32 와 C++ 프로그래밍을 사용하고 있다고 가정합니다.



Contents

Minidump?
Minidump 생성하기
빌드 이슈들
MiniDumpWriteDump 로 Minidump 쓰기
Visual Studio.NET 으로 MInidump 읽기
Microsoft 는 어떻게 Minidumps 를 사용하는가
개선 방안
결론

Minidump?

minidump 는 다운된 응용프로그램의 가장 중요한 정보를 보관하고 있는 파일입니다. 이 파일은 사용자의 컴퓨터에서 만들어진 후 사용자가 개발자에게 이 파일을 전송하게 되면 개발자는 dump 를 읽어 다운된 원인을 파악하거나 수정할 수 있는 것입니다.

Windows NT 때 부터, Dr. Watson 프로그램은 .dmp 확장자를 가진 dump 파일을 생성할 수 있었습니다. 하지만 이 파일은 그다지 유용하지 않았는데요, 여기에는 두 가지 이유가 있었습니다.

  1. 파일의 크기가 너무 컸습니다. 응용 프로그램의 dump 파일이 프로세스가 사용하고 있는 모든 공간(메모리겠죠)의 모든 바이트들을 포함하고 있었습니다. 따라서, 메모장과 같은 간단한 프로그램이 다운된 경우 몇 메가 바이트 정도의 dump 를 생성하지만 워드와 같은 프로그램이 다운된 경우 수 백 메가 바이트의 dump 를 생성했습니다. 이렇게 생성된 dump 는 이메일이나 FTP 로 전송하기에는 너무나도 컸던 것이죠.
  2. 이 파일은 유용한 정보를 담고 있지 않았습니다. Dr. Watson 는 사실, just-in-time(JIT) 디버거였고 따라서 디버러가 로드된 모듈의 전체 경로를 알아 내는데에는 어려움이 있었습니다. Visual Studio 와 같이 모든 기능을 탑제하고 있는 디버거의 경우 경로를 알아낼 수 있는 완벽한 단계를 수행할 수 있겠지만, Dr. Watson 은 그렇지 않았습니다. 즉, MOD0000 따위의 전혀 도움이 안되는 모듈의 이름을 남겨 주었다는 것입니다.

Minidumps 는 다음과 같은 방법을 사용하여 이런 문제를 해결할 수 있도록 디자인 되었습니다.

  • 전체 프로세스의 공간을 저장하는 대신에, 오직 확실한 섹션만 저장하는 것입니다. Kernel32.dll 과 같은 모듈의 사본을 저장하는 것은 의미가 없습니다. 이런 녀석들은 버전 번호만 저장된다면 윈도우 CD 에서 쉽게 복사할 수 있습니다. 실제 응용 프로그램의 힙 영역도 minidump 에 저장하지 않는 것이 기본 설정으로 되어 있습니다. 힙 영역의 정보는 놀랍게도 프로그램이 다운되는 대부분의 상황에 유용한 정보가 아닙니다. 물론 여러분이 힙 정보가 필요하다면, 설정을 바꾸어서 저장할 수 도 있습니다.
  • minidump 는 모듈, 포함된 이름, 경로, 버전 정보, 내부 타임 스템프의 모든 정보를 저장합니다.
  • minidump 는 또한 쓰레드 리스트, 문맥(레지스터 설정), 스텍 뒤에 있는 메모리를 저장합니다.
  • 파일을 압축합니다. 윈도우 XP 에서 메모장의 minidump 의 크기는 6K 입니다. 대부분의 경우 프로세스의 다운 dump 의 크기는 이전에 비해 300 배 정도 작습니다.

일러두기: 커널 모드 minidumps 는 윈도우 XP 에서 컴퓨터가 응답하지 않은 후에 생성을 시작합니다만, 이 아티클에서는 일반 사용자 모드의 minidumps 에 대해서만 다루고 있습니다.


Minidump 생성하기

minidump 를 생성하는 방법은 3가지가 있습니다.

  • 여러분의 응용프로그램이 알 수 없는 예외로 죽는다면, 코드를 추가하여 minidump 를 저장할 수 있습니다.
  • Visual Studio.NET 과 같은 통합 개발 환경(IDE) 를 사용한다면, 디버그 모드로 응용프로그램을 디버깅 하고 있는 중간에 Save Dump 를 클릭하시면 됩니다.
  • 아무것도 하지 않습니다.

첫 번째로 선택할 수 있는 방법은 다음 섹션에서 보다 자세하게 살펴보도록 하겠습니다.

두 번째 방법은 이미 설정된 디버거로 디버깅 중인 상태에서만 사용할 수 있습니다만, 내부에서 사용하기에는 매우 유용한 방법입니다.(예를 들어, 다른 개발자 혹은 테스터 사이에서) 만약 여러분이 Visual Studio.NET 에서 다운된 증상을 디버깅하고 싶다면, 디버그 메뉴에 있는 Save Dump 를 클릭하면 됩니다. Minidump 만 저장하거나, 힙을 포함하여 저장할 수 있습니다. 여러분이 어떤 심볼이나 PDB 를 dump 파일에 저장할 필요는 없습니다. 나중에 필요한 경우 다시 읽으면 되니까요.

마지막 방법은 윈도우 XP 에서만 할 수 있는 방법입니다. 만약 응용프로그램이 알수 없는 예외를 발생하여 죽었고, JIT 디버거가 설정되지 않았다면 minidump 가 자동으로 생성될 것입니다. 불행히도, minidump 는 바로 Microsoft 에 전송되기 때문에 여러분에게 왜 그런 오류가 발생했는지 알아 볼 수 있는 기회는 없습니다.(오류 보고에 대한 내용인것 같군요)


빌드 이슈들

여러분의 응용프로그램이 응답이 없는 경우 dump 를 생성하도록 설정하려면, 반듯이 전체 디버깅 정보를 생성하도록 하여 빌드를 해야 합니다. 특히 retail(release 로 빌드하는 것을 말하는 것이겠죠) 빌드인 경우에 말이죠. PDB 를 생성한 후 여러분은 또한 반듯이 PDB 파일을 보관하고 있어야 합니다. 이 PDB 파일은 고객이 dump 를 보내왔을 때 디버깅을 위해 필요합니다.

또한, 이런 행위는 여러분의 바이러니와 고객 사이의 버전 정보를 확실하게 검증하기 위한 수단이기도 합니다. 모든 컴포넌트의 모든 릴리즈들 중에 다른 버번이 있는지 minidump 와 비교해 보아야 합니다. 버전 필드는 이런 검증 과정을 도와줍니다. 디버거 스스로는 버전 정보는 사용하지 않습니다만, 이 정보는 PE 헤더에 있는 내부 타임 스템프를 기반으로 하는 바이너리와 매칭됩니다.

릴리즈 버전에서 디버그 정보를 생성하도록 하여 빌드하는 것은 작은 효과가 있습니다. PDB - 빌드하는 컴퓨터에서 약간의 공간을 차지합니다. - 가 생성되고 바이너리의 PE 파일 안에 디버그 디렉토리에 PDB 의 이름을 기록하기 위해 수백 바이트 정도를 더 사용합니다. 고객에게 PDB 를 함께 배포할 필요는 없습니다. 이런 행위는 고객이 보다 쉽게 여러분의 프로그램을 리버스 엔지니어링할 수 있도록 도와줄 것입니다:D  

MiniDumpWriteDump 로 Minidump 쓰기

minidump 를 저장하는 API 의 핵심 키는 MiniDumpWriteDump 입니다, 이 API 는 Platform SDK 의 redistributable dll 인 Dbghelp.dll 안에 들어 있습니다. 반듯이 Windows XP 버전 5.1.2600 을 사용해야만 합니다; 이전 버전과 비정식 버전에서 이 API 를 사용할 경우 문제가 발생할 수 있습니다. Windows 2000 인 버전 5.0.x 는 이 함수가 없습니다. 만약 여러분이 5.0 보다 낮은 버전을 가지고 있다면 시스템 디버거 패키지(WinDbg 가 포함되어 있는)가 포함되어 있지만 배포할 수는 없을 겁니다.

API 를 호출하면, SetUnhandledExceptionFilter API 를 사용하여 처리되지 않은 예외 처리기를 설정하여 crash(계속 다운이라는 표현을 사용했는데 여기 부터는 원문에서 사용한 crash 라는 단어를 사용하겠습니다.) 를 잡아낼 필요가 있습니다. 이 필터 함수는 응용프로그램에서 대부분의 모든 시간 동안 일어날 수 있는 처리되지 않는 예외를 처리할 수 있습니다. 더블 스택 실패와 같이 명확한 예외의 경우 운영 체제는 JIT 디버거를 호출하지 않고 즉시 응용프로그램을 종료시켜 버릴 것입니다.

여러분의 필터 함수 안을 보시면, Dbghelp.dll 을 반듯이 로드해야 한다는 것을 알 수 있습니다; Windows 2000 에서 System32 디렉토리에 접근할 수도 있지만 이 것은 올바른 배포 방법이 아닙니다. 첨부된 예제 코드는 EXE 와 같은 경로에서 dll 을 로드합니다. 즉, 정확한 버전의 Dbghelp.dll 을 EXE 와 동일한 디렉토리에 설치(복사)해 두셔야 한다는 겁니다; 만약 이 작업을 하지 않으셨다면 LoadLibrary 는 실패하게 될 것입니다. 이 작업은 오직 Windows XP 에서 실행되는 경우에만 올바르게 동작합니다.

DLL 을 로딩한 후에는 export 이름을 검사해야 합니다. 만약 검사를 성공한다면 그 후에는 temp 디렉토리 와 .dmp 확장자를 가지는 응용프로그램의 이름을 사용하는 등의 방법을 사용하여 dump 파일을 생성합니다. 이렇게 생성된 파일의 핸들은 프로세스 ID, dump 타입 등의 추가 정보와 함께 API 로 넘겨질 겁니다. 예제는 MiniDumpNormal 을 사용합니다. 만약 여러분이 원한다면 | 를 사용하여 MiniDumpWithDataSegs 값을 추가할 수 있습니다. 이 플래그는 Visual Studio 디버거에서 Minidump With Heap 옵션과 같은 역활을 해줍니다. 이 플래그가 켜져 있는 경우 dump 파일은 용량이 증가합니다.

한번 .dmp 파일이 생성되었다면, 응용프로그램은 사용자에게 dump 가 저장되었다고 알립니다. 이제 사용자가 이메일이나 FTP 를 사용하여 여러분이 dump 를 연구할 수 있도록 보내 줄 수 있습니다.

첨부된 예제 코드를 사용하는 경우 mdump.h 를 추가하고 MiniDumper 객체를 전역에 정의해 주시면 됩니다. 생성자에 들어가는 인자로 minidump 파일의 기본 이름을 설정할 수 있습니다. minidump.cpp 를 여러분의 프로젝트에 추가하시고 올바른 Dbghelp.dll 을 EXE 와 같은 폴더에 복사하시면 잘 돌아갈 겁니다.

여러분은 디버거에서 미니덤프가 저장되는 코드를 디버깅 할 수 없습니다.(예제 코드의 Minidumper::TopLevelFilter) 만약 디버거가 프로세스에 붙어 있다면 처리되지 않은 예외 필터는 절대로 호출되는 일이 없을 것입니다. 만약 문제를 만난다면 메시지 박스 디버깅을 사용해야 할 겁니다.

Visual Studio.NET 으로 MInidump 읽기

이번 섹션에서는 Windows 2000 메모장에서 수동으로 생성한 minidump Windows XP 에서 디버깅 하는 예제를 해볼 겁니다.

Visual Studio.NET 을 실행하고 파일 메뉴에서 Open Solution 을 클릭합니다. 드롭 다운 메뉴에서 Dump Files(*.dmp; *.mdmp) 를 선택합니다. minidump 를 찾아 선택하면 open 을 클릭하는 순간 기본 프로젝트가 생성될 것입니다.

디버거에서 dump 를 실행하려면 F5 를 누르면 됩니다. 이제 여러분이 디버깅을 시작할 수 있는 정보들을 확인할 수 있습니다. 디버거는 훼이크 프로세스를 하나 생성합니다. output window 에 다양한 모듈을 로드한다는 메시지가 표시될 겁니다. 디버거는 crash 된 프로세스의 상태를 생성합니다. EXE 의 디버깅 정보가 없다는 경고 메시지를 출력한 후에 디버거는 access violation 과 같이 사용자가 만난 crash 에서 정지할 것입니다. Call stack 윈도우를 살펴보시면 부족한 심볼이나 정보에 대한 노티를 해줄 겁니다.

[그림1. 심볼이 없이 초기화된 스택]

minidump 를 읽으려면 엮여 있는 바이너리를 복사할 필요가 있습니다. 올바른 바이너리를 찾아서 모듈 윈도우에서 열어줍니다.

[그림2. 바이너리 없이 초기화된 모듈]

그림2는 메모장 예제의 결과입니다. 이 결과를 통해 2가지 사실을 알 수 있습니다. 첫 째, 별 표 표시를 통해 바이너리의 경로를 알 수 있습니다. 이 경로는 사용자의 컴퓨터 환경에서 연결된 경로로써 여러분의 컴퓨터에서는 찾을 수 없다는 뜻입니다. 둘 째로, Information 필드에 "No matching binary found" 라는 메시지를 확인할 수 있습니다. 매칭이 되는 바이너리를 찾을 수 있는 핵심은 버전 필드와 파일 이름 필드 입니다. 예를 들어 예를 들어 대부분의 시스템 파일의 버전이 2195 인 것을 보고 이 환경이 windows 2000 임을 예측할 수 있습니다. 이 정보만으로 SP(service pack) 혹은 QFE(quality fix enginerring) 을 설치해야 한다고 바로 판단할 수는 없습니다. 좀 더 정보를 얻기 위해서 DLL 관련 데이터 베이스를 참조하는 것이 좋겠군요.
(http://support.microsoft.com/servicedesks/fileversion/dllinfo.asp)

이 시점에서 여러분은 윈도우 운영체제의 CD 에서 동일한 바이너리를 찾아 보거나 사용자의 컴퓨터에 설치된 같은 버전의 파일을 찾아 여러분의 경로에 복사해야 할 것입니다. 보통은 프로세스가 사용하는 모든 바이너리를 찾을 필요까지는 없습니다. 하지만 call stack 을 살펴보는 데 필요한 바이너리들을 찾는 것은 중요한 일입니다. 대부분은 운영체제의 바이너리(Kernel32.dll 과 같은) 과 여러분의 응용프로그램 바이너리(예제에서는 Notepad.exe 가 되겠죠) 가 필요할 겁니다.

로컬 디렉토리에 복사하고 디버그 메뉴에서 Stop debugging 을 클릭합니다. 솔루션 탐색기에서 프로젝트 아이콘을 오른쪽 클릭하고 단축메뉴의 Properties 를 클릭합니다. 이것이 디버깅  페이지 입니다. MODPATH 에 다음과 같이 커멘드 인자를 채워 넣어 줍니다. ';' 부호를 사용하여 바이너리 경로를 여러개 입력할 수돌 있습니다.

MODPATH=m:\sysbits

경로를 설정한 후 F5 키를 눌러 minidump 를 다시 로드합니다. MODPATH 에 넣은 경로에서 디버거가 필요한 정보를 사용할 겁니다. 다음 버전의 Visual Studio.NET 은 아마도 이 설정 방법이 좀 더 세련되 질 것 같습니다.

비록 발견된 바이너리들이 call stack 에 도움이 되지 않을 것 같다고 하더라도 모듈 윈도우에는 다음과 같이 몇 가지 변화가 생겼습니다.

[그림3. 바이너리를 포함한 모듈]
"No matching binary found" 라는 메시지가 "Cannot find or open a required DBG file" 와 "No symbols loaded" 로 바뀌었습니다. 첫 번째 메시지는 바이너리의 디버깅 정보인 DBGs 를 사용하는 시스템 DLLs 에서 발생합니다. 두 번째 메시지는 PDBs 를 사용하는 DLL 에서 발생합니다. 바이너리를 매칭하는 작업이 여러분의 call stack 을 반듯이 도움이 되는 것은 아닙니다; call stack 을 위해서는 좀 전에 언급한 바이너리의 디버그 정보도 필요할 것입니다.

방법 A: 어려운 방법

완변하게 minidump 를 분석하기 위해서 모든 바이너리의 디버그 정보를 찾을 필요가 있습니다. 하지만 시간을 절약하기 위해, 여러분에게 필요한 정보만 찾을 수도 있습니다. 예제 stack list 에는 User32.dll 과 Kernel32.dll 만 있습니다. 따라서 이 두 녀석은 매칭되는 디버그 정보가 필요합니다.

매칭할 수 있는 디버그 정보
Windows NT4        DGBs
Windows 2000        DBGs, PDBs
Windows XP          PDBs

http://www.microsoft.com/ddk/debugging 에 가시면 필요한 시스템 심볼 들을 찾을 수 있습니다. 가지고 있는 Windows NT 서버 와 Windows 2000 서버 운영체제의 지원 CD 에서도 시스템 심볼을 구할 수 있습니다. 이번 예제에서를 위해 바이너리 경로에 필요한 바이너르를 복사하였습니다. 실제 상황에서는 Microsoft 가 이닌 바이너리 리스트가 보일 겁니다. 따라서 이런 경우 각 바이너리의 PDB 가 필요합니다. 또한 이번 예제에서, 메모장을 위해 DBG 와 PDB 를 복사했습니다. 왜냐하면 예제 응용프로그램이 사용하고 있기 때문입니다.

디버그 메뉴에서 Stop Debugging 을 클릭한 후에 F5 키를 누르면 그림4 와 같이 call stack 이 리스트업 될 것입니다. 여러분이 필요한 바이너리와 디버그 정보를 잘 찾으셨다면 call stack 은 바뀌어 있을 겁니다. call stack 은 정확하게 연결된 디버그 정보가 있어야만 올바르게 동작합니다. 따라서 여러분이 좀 더 많은 정보를 추가할 수록 stack 은 좀 더 정확해 집니다. 보통은 처음에 보았던 stack 보다 더 많은 프레임이 보일 것입니다.

이번 예제에서, crash 는 없습니다만, 실전에서는 사용자의 crash 를 70 퍼센트 가까이 해결할 수 있는 충분한 정보를 얻을 수 있을 겁니다. 추가로, 이 stack 은 Microsoft 의 시스템 컴포넌트의 심볼도 열어주기 때문에 코드 라인 번호에 대한 정보는 없습니다. 여러분이 만든 바이너리의 경우는 완변한 PDBs 를 연결해준 경우 코드단위의 보다 정확한 stack 을 얻을 수 있을 것입니다.

[그림4. 심볼과 바이너리를 포함한 call stack] 

심볼 서버

만약 여러분이 여러개의 minidumps 를 다루어야 하고 일반적인 디버깅, 저장, 모든 바이너리와 PDB/DBG 를 접근해야 한다면 매우 번거로운 일이 될 것입니다. Windows NT 는 심볼 서버라고 알려진 기술이 도입되어 심볼을 저장할 수 있는 공간이 있습니다만, 지원하는 바이너리를 찾아 계속 확장해 주어야 합니다. Windows NT 디버거는 이 기능을 지원하는 첫 번째 도구이지만, Visual Studio.NET 또한 문서화 되지 않은 기능으로 이 기능을 포함하고 있습니다. 심볼 서버에 대한 자세한 정보를 얻고 싶으시다면 다음 링크를 확인해 보세요. http://www.microsoft.com/ddk/debugging/symbols.asp

방법 B: 쉬운 방법: 심볼 서버 사용하기

우선, http://www.microsoft.com/ddk/debugging 로 가셔서 디버깅 도구를 다운로드 합니다. Symsrv.dll 이 필요하고 이 것은 경로에 추가가 되어야 합니다. Visual Studio.NET 에서 접근할 수 있도록 devenv.exe 혹은 여러분의 System32 디렉토리에 복사합니다. 한번 Symsrv.dll 을 복사했다면 디버깅 도구를 언인스톨 해도 안전합니다. 또한 로컬 디렉토리를 하나 만들어야 합니다. 예를 들어, C:\localstore 라고 만들었다고 가정해 보겠습니다.

프로젝트 프로퍼티 다이얼로그 박스에 Debugging page 의 Symbol Path 를 다음과 같이 설정합니다.

SRV*c:/localstore*http://msdl.microsoft.com/download/symbols

이 문자열은 디버거에게 심볼 서버를 사용하여 심볼을 얻고 심볼이 복사될 때 필요한 로컬 심볼 서버를 생성하겠다고 말하고 있습니다. 이제, F5 를 눌러 minidump 를 실행하면, 심볼이 Microsoft 웹 사이트에서 복사되어 로컬 저장소에 복사가 되며 디버거가 사용할 수 있는 상태가 될 것입니다. 첫 번째로 이 작업을 수행하고 나면 다음부터 속도는 훨씬 빨라질 것입니다. 웹 사이트 보다 로컬 저장소를 먼저 살펴보기 때문이죠.

Microsoft 응용프로그램이 아닌 응용프로그램을 디버깅할 때에는 방법 A 와 B 를 섞어서 사용할 수 있습니다. A 를 사용하여 시스템 컴포넌트를 얻고 경로를 추가하여 여러분이 작성한 부분과 심볼을 추가할 수 있도록 ';' 구분자를 사용합니다.

c:\drop\build\myapp;SRV*c:\localstore*http://msdl.microsoft.com/download/symbols

심볼 서버는 Visual Studio.NET 에 문서화 되지 않은 기능으로, 에러 리포팅이 없기 때문에 만약 문법이 틀렸거나 Symsrv.dll 이 경로에 없다면 심볼은 "No symbols loaded" 라는 에러 메시지와 함께 로드에 실패할 것입니다. 여러분은 또한 바이너리를 저장하고 불러오기 위해 심볼 서버를 사용할 수도 있습니다만, MODPATH 문법상 SRV* 대신에 symsrv*symsrc.dll* 을 사용해야 합니다.

일러두기: Microsoft 심볼 서버는 바이너리 파일을 가지고 있지 않지만 어떤 심볼 서버는 생성할 수 있습니다.

심볼 서버는 minidump 에 국한되지 않고 "살아있는" 디버깅을 할 수 있는 기능입니다. 일반 디버깅에 사용하기 위해 디버깅 페이지에 Symbol Path 에 로컬 심볼 서버의 경로를 추가할 수 있습니다.

Microsoft 는 어떻게 Minidumps 를 사용하는가

Microsoft 는 응용프로그램의 질을 향상시키기 위해 minidump 를 사용해 왔습니다. Microsoft Internet Explorer 5.5 와 Microsoft Office XP 는 새로운 Dr. Watson(응용 프로그램의 응답이 없는 것을 감지하고 minidump 를 생성, 사용자에게 오류보고를 보낼 것이냐고 묻는 유틸이죠) 을 사용하여 배포된 첫 번째 제품입니다.

만약 사용자가 에러 리포트를 보낸다고 클릭하면 Dr. Watson 은 Microsoft 웹 사이트 서버에 minidump 를 생성하고 전송합니다. 이 도구는 사용자에게 묻는 부분과 minidump 를 저장하는 부분을 분리하고 있어 crash 로부터 안전합니다. 이런 방식은 crash 된 응용프로그램을 보낼 것인지를 적게 강요하고 있어 사용자로부터 의미있는 minidump 를 받을 확율을 높여 줍니다.

개선 방안

서버 입장에서, minidump 는 crash 가 발생된 기반 환경 및 컴포넌트에 따라 유사한 crash 끼리 분석할 수 있습니다. 생산 팀의 경우 응용 프로그램이 얼마나 자주 crash 되는지, 얼마나 자주 crash 발생되는지에 대한 통계 정보를 얻을 수 있습니다. 개발 팀의 경우는 보다 연구해 볼 수 있는 crash 상황의 실제 minidump 를 받아 볼 수 있습니다. 어떤 crash 는 이미 완벽하게 분석이 끝났을 수도 있습니다. 이런 경우 사용자는 자동으로 웹 페이지에 접속하여 관련 정보 혹은 문제를 해결한 파일을 다운로드 할 수도 있습니다. Internet Explorer 5.5 와 Office XP 가 출시된 이후, 많은 다른 제품 팀들이 유사한 기술을 사용하여 crash 정보를 수집하고 있습니다. 이 기술은 또한 Windows XP 에 한해서 표준입니다.

이번 아티클에서 다루고 있는 예제는 minidumps 를 이해할 수 있는 토대를 제공합니다. 예제는 사용자로부터 dump 파일을 회수할 것인지 묻지 않고 있습니다. 간단하게, 사용자는 이메일로 minidump 를 보내줄 수 있습니다. 또한 잠재적인 사생활 침해 이슈가 생길 수 있습니다. 왜냐하면 사용자의 데이터에 stack 과 전체 heap 을 포함한 minidump 의 경우 heap 의 모든 데이터를 볼 수 있기 때문입니다. 이런 데이터는 사용자 쪽에서 날려 버릴 수 있도록 만들어 져야 합니다. Microsoft 의 데이터 수집 정책에 의하면, minidump 가 포함하고 있는 정보에 대하여 추가적인 정보를 고객에게 알릴 수 있도록 하고 있습니다. http://watson.microsoft.com/dw/1033/dcp.asp

추가로, 처리되지 않은 예외가 일어난 Windows 서비스의 minidump 는 추가적인 과제가 있습니다. ....

by 신동호 | 2009/06/10 19:51 | dead P society | 트랙백 | 덧글(0)
트랙백 주소 : http://aronze.egloos.com/tb/1432450
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글



< 이전페이지 다음페이지 >