덤프 파일에 핸들/스레드 정보를 포함하는 방법
windbg에서 덤프 파일 분석시 "!handle" 명령어가 실행되지 않는 경우가 있습니다.
0:008> !handle
ERROR: !handle: extension exception 0x80004002.
"Unable to read handle information"
말 그대로, 덤프 파일에 핸들 정보가 없어서 그런 것인데요. 아래의 글에 소개한 방식으로 덤프를 뜬 경우에도 저런 오류를 발생시킵니다.
코드(C#)를 통한 풀 덤프 만드는 방법
; https://www.sysnet.pe.kr/2/0/995
오류 분석시에 핸들도 유용한 분석자료가 될 수 있는데, 이를 빼먹었군요. ^^ 그래서 다음과 같이 핸들 정보까지 포함하라고 플래그를 추가해 주면 됩니다.
Boolean res = MiniDumpWriteDump(
targetProcess.Handle,
processId,
stream.SafeFileHandle.DangerousGetHandle(),
MiniDumpType.WithFullMemory | MiniDumpType.WithHandleData,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero);
Win32 SDK에는 다음과 같이 정의되어 있습니다.
typedef enum _MINIDUMP_TYPE {
MiniDumpNormal = 0x00000000,
MiniDumpWithDataSegs = 0x00000001,
MiniDumpWithFullMemory = 0x00000002,
MiniDumpWithHandleData = 0x00000004,
MiniDumpFilterMemory = 0x00000008,
MiniDumpScanMemory = 0x00000010,
MiniDumpWithUnloadedModules = 0x00000020,
MiniDumpWithIndirectlyReferencedMemory = 0x00000040,
MiniDumpFilterModulePaths = 0x00000080,
MiniDumpWithProcessThreadData = 0x00000100,
MiniDumpWithPrivateReadWriteMemory = 0x00000200,
MiniDumpWithoutOptionalData = 0x00000400,
MiniDumpWithFullMemoryInfo = 0x00000800,
MiniDumpWithThreadInfo = 0x00001000,
MiniDumpWithCodeSegs = 0x00002000,
MiniDumpWithoutAuxiliaryState = 0x00004000,
MiniDumpWithFullAuxiliaryState = 0x00008000,
MiniDumpWithPrivateWriteCopyMemory = 0x00010000,
MiniDumpIgnoreInaccessibleMemory = 0x00020000,
MiniDumpWithTokenInformation = 0x00040000,
MiniDumpWithModuleHeaders = 0x00080000,
MiniDumpFilterTriage = 0x00100000,
MiniDumpValidTypeFlags = 0x001fffff
} MINIDUMP_TYPE;
이를 적용하면 windbg에서 핸들 관련 명령어가 잘 동작합니다. ^^
0:000> !handle
Handle 0000000000000004
Type Directory
Handle 0000000000000008
Type File
Handle 000000000000000c
Type Key
Handle 0000000000000010
Type Mutant
Handle 0000000000000014
Type ALPC Port
Handle 0000000000000018
Type Event
...[생략]...
Handle 0000000000000f68
Type Event
Handle 0000000000000f7c
Type Key
Handle 0000000000000f80
Type Key
642 Handles
Type Count
None 139
Event 204
Section 28
File 50
Directory 3
Mutant 47
WindowStation 2
Semaphore 32
Key 94
Thread 14
Desktop 1
IoCompletion 4
Timer 2
TpWorkerFactory 3
ALPC Port 11
WaitCompletionPacket 8
한가지 더 해볼까요? ^^ windbg 의 !runaway 명령어가 다음과 같이 실패하는 경우가 있습니다.
0:000> !runaway
ERROR: !runaway: extension exception 0x80004002.
"Unable to get thread times - dumps may not have time information"
이를 해결하려면 WithThreadInfo 플래그를 같이 넣어주면 됩니다.
0:000> !runaway
User Mode Time
Thread Time
0:8ec 0 days 0:00:02.859
4:6c4 0 days 0:00:00.593
7:127c 0 days 0:00:00.250
11:2218 0 days 0:00:00.031
9:2da8 0 days 0:00:00.031
5:1ab8 0 days 0:00:00.015
12:236c 0 days 0:00:00.000
10:1be0 0 days 0:00:00.000
8:1a1c 0 days 0:00:00.000
6:2a30 0 days 0:00:00.000
3:1324 0 days 0:00:00.000
2:3e6c 0 days 0:00:00.000
1:1ad8 0 days 0:00:00.000
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]