커널 개체 핸들 누수 문제를 디버깅하기 위하여 !htrace debug extension을 이용할 수 있습니다. 그러나 !trace를 사용하기 전에, handle tracing이 활성화되어 있어야 합니다. Handle tracing을 활성화하는 방법은 windbg 디버거에서 !htrace -enable 명령을 실행하는 것입니다. 그러나 이 방법은 문제가 발생하는 production server에 live debugging 환경을 요구합니다. Handle tracing을 활성화할 수 있는 또 다른 방법은 Microsoft Application Verifier를 사용하는 것입니다. 이 블로그는 커널 핸들 누수 문제를 디버깅하기 위하여 Microsoft Application Verifier 를 사용하는 방법을 설명합니다.
NOTE: !htrace debug extension과 Microsoft Application Verifier는 Windows XP또는 그 이후의 Windows에서 사용할 수 있습니다.
Download Application Verifier
http://www.microsoft.com/downloads/details.aspx?FamilyID=C4A25AB9-649D-4A1B-B4A7-C9D8B095DF18&displaylang=en
테스트를 위해서 커널 이벤트 개체의 누수를 일으키는 간단한 테스트 프로그램을 작성하였습니다. 이 프로그램은 100,000 개의 커널 이벤트 개체를 생성하고 핸들을 종료하지 않아 커널 개체 핸들 누수 문제를 재현할 수 있습니다.
아래 절차를 따라 커널 개체 핸들 누수 문제를 Troubleshooting할 수 있습니다.
1. 문제 증상이 발생하는 머신에 Application Verifier를 먼저 설치합니다.
2. Application Verifier(appverif.exe)를 실행합니다.
3. File/Add Application을 통하여 문제의 프로그램을 추가하고, handle tracing을 체크합니다.
4. Save 버튼을 클릭하고 Application Verifier를 종료합니다.
5. 문제의 프로그램을 실행하여 문제 증상을 재현합니다.
6. 문제 증상이 재현되면, 시스템 crash tool을 이용하여 시스템을 crash 시키고 메모리 덤프를 수집합니다.
7. 수집된 메모리 덤프를 windbg를 이용하여 오픈합니다. 아래는 windbg 로그의 예입니다. 해당 프로세스에서 커널 개체를 생성하는 call stack을 확인할 수 있습니다. 만일, 특정 드라이버가 커널 개체를 생성하였다면, 드라이버 함수가 call stack에서 확인될 것입니다.
kd> !process 0 0
…..
PROCESS 81d866d0 SessionId: 0 Cid: 06c0 Peb: 7ffdb000 ParentCid: 0704
DirBase: 05458000 ObjectTable: e15df658 HandleCount: 100012.
Image: SampleHandleLea
Kd>!htrace 0 81d866d0
….
Handle 0x5DDA4 - OPEN
Thread ID = 0x000006c4, Process ID = 0x000006c0
0x809afc5c: nt!ExpUpdateDebugInfo+0x16D
0x80967350: nt!ExCreateHandle+0x4A
0x8091bc16: nt!ObpCreateUnnamedHandle+0x11A
0x809074c3: nt!ObInsertObject+0xB8
0x8090bd62: nt!NtCreateEvent+0xBD
0x8082337b: nt!KiFastCallEntry+0xF8
0x77e6aefb: kernel32!CreateEventW+0x4B
0x003a2efb: vfbasics!AVrfpCreateEventW+0x96
0x0042e75e: SampleHandleLeakProgram!function1+0x2E
0x0042e6e0: SampleHandleLeakProgram!main+0x50
0x0042ee77: SampleHandleLeakProgram!__tmainCRTStartup+0x117
0x0042ed4f: SampleHandleLeakProgram!mainCRTStartup+0xF
0x77e523cd: kernel32!BaseProcessStart+0x23
--------------------------------------
Handle 0x5DDA0 - OPEN
NOTE: 만일 svchost 프로세스에서 handle leak 이슈가 발생한다면, svchost 프로세스는 Application Verifier를 적용하기 전에 실행이 될 것입니다. 이 경우는 Application Verifier에 svchost를 추가한 후, 시스템을 재시작하면됩니다. Scvhost 프로세스의 handle tracking이 다음 시스템 부팅부터 적용될 것입니다.