! デッドロック 拡張機能は、ドライバーの検証ツールの デッドロック検出 オプションによって収集されたデッドロックに関する情報を表示します。The !deadlock extension displays information about deadlocks collected by the Deadlock Detection option of Driver Verifier.

!deadlock 1


Windows 2000Windows 2000


Windows XP 以降Windows XP and later


追加情報Additional Information

ドライバーの検証機能の詳細については、Windows Driver Kit (WDK) のドキュメントを参照してください。For information about Driver Verifier, see the Windows Driver Kit (WDK) documentation.


この拡張機能は、ドライバー検証ツールの デッドロック検出 オプションによってロック階層違反が検出され、 バグチェック 0xc4 (ドライバー _ 検証ツールが _ 検出された違反) を検出した場合に役立つ情報を提供し _ ます。This extension will only provide useful information if Driver Verifier's Deadlock Detection option has detected a lock hierarchy violation and issued bug check 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION).

引数を指定しない場合、 ! デッドロック 拡張によって、基本的なロック階層トポロジが表示されます。Without any arguments, the !deadlock extension causes the basic lock hierarchy topology to be displayed. この問題が単純な循環デッドロックでない場合は、このコマンドによって発生した状況が記述されます。If the problem is not a simple cyclical deadlock, this command will describe the situation that has occurred.

! デッドロック 1 拡張により、スタックトレースが表示されます。The !deadlock 1 extension causes stack traces to be displayed. 表示されるスタックは、ロックが取得された時点でアクティブになっています。The stacks displayed will be the ones active at the time the locks were acquired.

たとえば次のようになります。Here is an example:

0:kd> !deadlock

Deadlock detected (2 resources in 2 threads):

Thread 0: A B
Thread 1: B A

Thread 0 = 8d3ba030
Thread 1 = 8d15c030
Lock A =   bba2af30 Type 'Spinlock'
Lock B =   dummy!GlobalLock Type 'Spinlock'

これにより、どのスレッドとどのロックが関係しているかがわかります。This tells you which threads and which locks are involved. ただし、これは概要であり、状況を適切にデバッグするのに十分な情報ではない可能性があります。However, it is intended to be a summary and may not be enough information to adequately debug the situation.

デッドロックに関与している各ロックが取得されたときに、 ! デッドロック 1 を使用して呼び出し履歴の内容を出力します。Use !deadlock 1 to print out the contents of the call stacks at the time that each lock participating in the deadlock was acquired. これらは実行時のスタックトレースであるため、チェックされたビルドが使用されている場合はより完全です。Because these are run-time stack traces, they will be more complete if a checked build is being used. チェックされたビルドは、Windows 10 バージョン1803より前の以前のバージョンの Windows で使用できました。Checked builds were available on older versions of Windows before Windows 10, version 1803. 無料のビルドでは、1行だけの後に切り捨てられる場合があります。On a free build, they may be truncated after as little as one line.

0:kd> !deadlock 1

Deadlock detected (2 resources in 2 threads):

Thread 0 (8D14F750) took locks in the following order:

    Lock A -- b7906f30 (Spinlock)
    Stack:   dummy!DummyActivateVcComplete+0x63

    Lock B -- dummy!GlobalLock (Spinlock)
    Stack:   dummy!dummyQueueRecvBuffers+0x2D

Thread 1 (8D903030) took locks in the following order:

    Lock B -- dummy!GlobalLock (Spinlock)
    Stack:   dummy!dummyRxInterruptOnCompletion+0x25D

    Lock A -- b7906f30 (Spinlock)
    Stack:   << Current stack >>

この情報を使用すると、現在のスタックを除き、必要なものがほぼすべて揃います。With this information, you have almost everything you need, except the current stack:

0: kd> k
ChildEBP RetAddr
f78aae6c 80664c58 ntkrnlpa!DbgBreakPoint
f78aae74 8066523f ntkrnlpa!ViDeadlockReportIssue+0x2f
f78aae9c 806665df ntkrnlpa!ViDeadlockAnalyze+0x253
f78aaee8 8065d944 ntkrnlpa!VfDeadlockAcquireResource+0x20b
f78aaf08 bfd6df46 ntkrnlpa!VerifierKeAcquireSpinLockAtDpcLevel+0x44
f78aafa4 b1bf2d2d dummy!dummyRxInterruptOnCompletion+0x2b5
f78aafc4 bfde9d8c dummy!DummyHandleInterrupt+0x32f
f78aafd8 804b393b NDIS!ndisMDpcX+0x3c
f78aaff4 804b922b ntkrnlpa!KiRetireDpcList+0x5d

これにより、どのロックが関係しており、どこで取得されたかを確認できます。From this you can see which locks were involved and where they were acquired. これにより、デッドロックをデバッグするための十分な情報が得られます。This should be enough information for you to debug the deadlock. ソースコードが使用可能な場合は、デバッガーを使用して、問題が発生した場所を正確に確認できます。If the source code is available, you can use the debugger to see exactly where the problem occurred:

0: kd> .lines
Line number information will be loaded

0: kd> u dummy!DummyActivateVcComplete+0x63 l1
dummy!DummyActivateVcComplete+63 [d:\nt\drivers\dummy\vc.c @ 2711]:
b1bfe6c9 837d0c00         cmp     dword ptr [ebp+0xc],0x0

0: kd> u dummy!dummyQueueRecvBuffers+0x2D l1
dummy!dummyQueueRecvBuffers+2d [d:\nt\drivers\dummy\receive.c @ 2894]:
b1bf4e39 807d0c01         cmp     byte ptr [ebp+0xc],0x1

0: kd> u dummy!dummyRxInterruptOnCompletion+0x25D l1
dummy!dummyRxInterruptOnCompletion+25d [d:\nt\drivers\dummy\receive.c @ 1424]:
b1bf5d05 85f6             test    esi,esi

0: kd> u dummy!dummyRxInterruptOnCompletion+0x2b5 l1
dummy!dummyRxInterruptOnCompletion+2b5 [d:\nt\drivers\dummy\receive.c @ 1441]:
b1bf5d5d 8b4648           mov     eax,[esi+0x48]

これで、ソースファイルの名前と、取得が行われた行番号がわかりました。Now you know the name of the source file and the line number where the acquisition took place. この場合、ソースファイルには、次のようにスレッドが動作していることが示されます。In this case, the source files will show that the threads behaved as follows:

  • スレッド 1: DummyActivateVcCompleteダミー ミニポートロックを受け取りました。Thread 1: DummyActivateVcComplete took the dummy miniport lock. その後、 dummyQueueRecvBuffers という名前が付いています。これは、 ダミー のグローバルロックを受け取りました。It then called dummyQueueRecvBuffers, which took the dummy global lock.

  • スレッド 2: dummyRxInterruptOnCompletion がグローバルロックを受け取りました。Thread 2: dummyRxInterruptOnCompletion took the global lock. その後、いくつかの行でミニポートロックがかかっていました。Then, a few lines later, it took the miniport lock.

この時点で、デッドロックは完全に明確になります。At this point, the deadlock becomes entirely clear.