커널 개체 핸들 누수 문제를 디버깅하기 위하여 !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

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

 

NOTE: 만일 svchost 프로세스에서 handle leak 이슈가 발생한다면, svchost 프로세스는 Application Verifier 적용하기 전에 실행이 것입니다. 경우는 Application Verifier svchost 추가한 , 시스템을 재시작하면됩니다. Scvhost 프로세스의 handle tracking 다음 시스템 부팅부터 적용될 것입니다.