記事検索

検索ワードを入力してください。
Sky Tech Blog
WinDbg で​ ハンドル の​情報を​確認する

WinDbg で​ ハンドル の​情報を​確認する

WinDbgの「!handle」コマンドを使用して、ハンドルの種類や状態を確認する方法を解説します。具体的な事例として、スレッドが待機状態にある原因を特定するプロセスを、コールスタックやサスペンド状態の確認を交えて紹介します。また、全ハンドル情報や種別ごとの一覧表示など、基本的なコマンドの使い方も網羅しています。

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

\シェアをお願いします!/
  • X
  • Facebook
  • LINE
キャリア採用募集中!

入社後にスキルアップを目指す若手の方も、ご自身の経験を幅広いフィールドで生かしたいベテランの方も、お一人おひとりの経験に応じたキャリア採用を行っています。

Sky株式会社のソフトウェア開発や製品、採用に関するお問い合わせについては、下記のリンクをご確認ください。
お問い合わせ
ホーム