Share via


!htrace

!htrace 확장은 하나 이상의 핸들에 대한 스택 추적 정보를 표시합니다.

사용자 모드 구문

!htrace [Handle [Max_Traces]] 
!htrace -enable [Max_Traces]
!htrace -snapshot
!htrace -diff
!htrace -disable
!htrace -? 

커널 모드 구문

!htrace [Handle [Process [Max_Traces]]] 
!htrace -? 

매개 변수

핸들 스택 추적이 표시 될 핸들을 지정 합니다. 핸들이 0이거나 생략된 경우 프로세스의 모든 핸들에 대한 스택 추적이 표시됩니다.

프로세스 (커널 모드에만 해당) 핸들이 표시되는 프로세스를 지정합니다. Process가 0이거나 생략되면 현재 프로세스가 사용됩니다. 사용자 모드에서는 현재 프로세스가 항상 사용됩니다.

Max_Traces 표시할 최대 스택 추적 수를 지정합니다. 사용자 모드에서 이 매개 변수를 생략하면 대상 프로세스에 대한 모든 스택 추적이 표시됩니다.

-enable(사용자 모드에만 해당) 핸들 추적을 사용하도록 설정하고 -diff 옵션으로 초기 상태로 사용할 핸들 정보의 첫 번째 스냅샷 사용합니다.

-스냅샷(사용자 모드에만 해당) -diff 옵션에서 초기 상태로 사용할 현재 핸들 정보의 스냅샷 사용합니다.

-diff(사용자 모드에만 해당) 현재 핸들 정보와 수행된 핸들 정보의 마지막 스냅샷 비교합니다. 열려 있는 모든 핸들을 표시합니다.

-disable (사용자 모드에만 해당) 핸들 추적을 사용하지 않도록 설정합니다.

-?

디버거 명령 창에 이 확장에 대한 간단한 도움말 텍스트를 표시합니다.

DLL

Windows XP 이상

Kdexts.dll Ntsdexts.dll

추가 정보

특정 핸들에 대한 추가 정보를 표시하려면 !handle 확장을 사용합니다.

핸들에 대한 자세한 내용은 Mark Russinovich 및 David Solomon의 Microsoft Windows Internals를 참조하세요.

설명

!htrace를 사용하려면 먼저 핸들 추적을 사용하도록 설정해야 합니다. 핸들 추적을 사용하도록 설정하는 한 가지 방법은 !htrace -enable 명령을 입력하는 것입니다. 핸들 추적을 사용하도록 설정하면 프로세스가 핸들을 열거나 핸들을 닫거나 잘못된 핸들을 참조할 때마다 스택 추적 정보가 저장됩니다. !htrace표시하는 것은 이 스택 추적 정보입니다.

대상 프로세스에 대한 애플리케이션 검증 도구를 활성화하고 핸들 옵션을 선택하여 핸들 추적을 사용하도록 설정할 수도 있습니다 .

!htrace에서 보고한 추적 중 일부는 다른 프로세스 컨텍스트에서 온 것일 수 있습니다. 이 경우 반환 주소가 현재 프로세스 컨텍스트에서 제대로 확인되지 않거나 잘못된 기호로 확인될 수 있습니다.

다음 예제에서는 프로세스 0x81400300 모든 핸들에 대한 정보를 표시합니다.

kd> !htrace 0 81400300
Process 0x81400300
ObjectTable 0xE10CCF60
## 

Handle 0x7CC - CLOSE:
0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
0x801E1EDD: ntoskrnl!NtClose+0x19
0x010012C1: badhandle!mainCRTStartup+0xE3
## 0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D

Handle 0x7CC - OPEN:
0x8018F44A: ntoskrnl!ExCreateHandle+0x94
0x801E3390: ntoskrnl!ObpCreateUnnamedHandle+0x10C
0x801E7317: ntoskrnl!ObInsertObject+0xC3
0x77DE23B2: KERNEL32!CreateSemaphoreA+0x66
0x010011C5: badhandle!main+0x45
0x010012C1: badhandle!mainCRTStartup+0xE3
## 0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D

Handle 0x7DC - BAD REFERENCE:
0x8018F709: ntoskrnl!ExMapHandleToPointerEx+0xEA
0x801E10F2: ntoskrnl!ObReferenceObjectByHandle+0x12C
0x801902BE: ntoskrnl!NtSetEvent+0x6C
0x80154965: ntoskrnl!_KiSystemService+0xC4
0x010012C1: badhandle!mainCRTStartup+0xE3
## 0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D

Handle 0x7DC - CLOSE:
0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
0x801E1EDD: ntoskrnl!NtClose+0x19
0x010012C1: badhandle!mainCRTStartup+0xE3
## 0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D

Handle 0x7DC - OPEN:
0x8018F44A: ntoskrnl!ExCreateHandle+0x94
0x801E3390: ntoskrnl!ObpCreateUnnamedHandle+0x10C
0x801E7317: ntoskrnl!ObInsertObject+0xC3
0x77DE265C: KERNEL32!CreateEventA+0x66
0x010011A0: badhandle!main+0x20
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
## 

Parsed 0x6 stack traces.
Dumped 0x5 stack traces.