WinDbgでは*!handle コマンド*で、ハンドルの種類や状態を確認することができます。
0:000> !handle -?
!handle [] [] []
- Handle to get information about
0 or -1 means all handles
- Output control flags
1 - Get type information (default)
2 - Get basic information
4 - Get name information
8 - Get object specific info (where available) (space-delimited, 32-bit
max)
- Limit query to handles of the given type
Display information about open handles
事例
とあるプロセスのスレッド(118:1358.2600)が固まっていて、以下のようなコールスタックでした。
何かのハンドル(001de8)を待っている状態です。
118 Id: 1358.2600 Suspend: 0 Teb: 01b43000 Unfrozen
# ChildEBP RetAddr Args to Child
00 11ccee3c 76d84839 00001de8 00000000 00000000 ntdll!NtWaitForSingleObject+0xc (FPO: [3,0,0])
01 11cceeb0 76d84792 00001de8 ffffffff 00000000 KERNELBASE!WaitForSingleObjectEx+0x99 (FPO: [SEH])
02 11cceec4 020f313c 00001de8 ffffffff 11ccf154 KERNELBASE!WaitForSingleObject+0x12 (FPO: [Non-Fpo])
!handle コマンドで見てみると、それがスレッド(?:1358.1350)だと分かりました。
0:000> !handle 00001de8 f
Handle 00001de8
Type Thread
Attributes 0
GrantedAccess 0x1fffff:
Delete,ReadControl,WriteDac,WriteOwner,Synch
Terminate,Suspend,Alert,GetContext,SetContext,SetInfo,QueryInfo,SetToken,Impersonate,DirectImpersonate
HandleCount 3
PointerCount 131067
Name
Object specific information
Thread Id 1358.1350
Priority 10
Base Priority 0
次に「~」コマンド(スレッド一覧を表示するコマンド)から、そのスレッド(189:1358.1350)がサスペンド状態(Suspend: 1)、ということが分かりました。
※このケースでは、コールスタックが1つだけで、スレッドを開始してから全く動いていない状態でした。
0:000> ~
. 0 Id: 1358.135c Suspend: 0 Teb: 01bce000 Unfrozen
1 Id: 1358.14e8 Suspend: 0 Teb: 01bda000 Unfrozen
・・・
189 Id: 1358.1350 Suspend: 1 Teb: 15eef000 Unfrozen
0:000> ~189kv
# ChildEBP RetAddr Args to Child
00 022dfe28 00000000 00000000 00000000 00000000 ntdll!RtlUserThreadStart (FPO: [0,2,0])
!handle コマンドを活用することで、最初のスレッド(118:1358.2600)は、サスペンド状態のスレッド(189:1358.1350)が終了するのを待っている状態だった、というところまで分かります。
使い方
詳しくはWinDbgのヘルプに記載されていますが、以下のような使い方ができます。
!handle
全てのハンドル情報&全件数&種別毎の件数を表示
0:000> !handle
Handle 00000004
Type Event
Handle 00000008
Type WaitCompletionPacket
・・・
Handle 0000261c
Type File
Handle 00002620
Type File
2425 Handles
Type Count
None 108
Event 1533
Section 8
File 117
Directory 4
Mutant 7
WindowStation 2
Semaphore 59
Key 21
Process 1
Thread 507
Desktop 1
IoCompletion 5
Timer 24
TpWorkerFactory 4
ALPC Port 11
WaitCompletionPacket 13
!handle 0 0
全件数&種別毎の件数だけ表示
0:000> !handle 0 0
2425 Handles
Type Count
None 108
Event 1533
Section 8
File 117
Directory 4
Mutant 7
WindowStation 2
Semaphore 59
Key 21
Process 1
Thread 507
Desktop 1
IoCompletion 5
Timer 24
TpWorkerFactory 4
ALPC Port 11
WaitCompletionPacket 13
!handle \ f
指定したハンドル()の詳細情報を表示
0:000> !handle 00001de8 f
Handle 00001de8
Type Thread
Attributes 0
GrantedAccess 0x1fffff:
Delete,ReadControl,WriteDac,WriteOwner,Synch
Terminate,Suspend,Alert,GetContext,SetContext,SetInfo,QueryInfo,SetToken,Impersonate,DirectImpersonate
HandleCount 3
PointerCount 131067
Name
Object specific information
Thread Id 1358.1350
Priority 10
Base Priority 0
!handle 0 f \
指定した種別()の一覧を表示
0:000> !handle 0 f Mutant
Handle 00000094
Type Mutant
Attributes 0
GrantedAccess 0x1f0001:
Delete,ReadControl,WriteDac,WriteOwner,Synch
QueryState
HandleCount 2
PointerCount 32770
Name
Object specific information
Mutex is Free
Mutant Owner 0.0
Handle 000000b0
・・・
Handle 00001cd4
Type Mutant
Attributes 0
GrantedAccess 0x1f0001:
Delete,ReadControl,WriteDac,WriteOwner,Synch
QueryState
HandleCount 3
PointerCount 98298
Name \BaseNamedObjects\ConfigurationSyncDataMutex
Object specific information
Mutex is Free
Mutant Owner 0.0
7 handles of type Mutant
※\には以下の値を指定できます。
- Event
- Section
- File
- Port
- Directory
- SymbolicLink
- Mutant
- WindowStation
- Semaphore
- Key
- Token
- Process
- Thread
- Desktop
- IoCompletion
- Timer
- Job
- WaitablePort

