Bagikan melalui


!Kebuntuan

Ekstensi !deadlock menampilkan informasi tentang kebuntuan yang dikumpulkan oleh opsi Deteksi Kebuntuan Driver Verifier.

!deadlock 
!deadlock 1

DLL

Kdexts.dll

Informasi Tambahan

Untuk informasi tentang Driver Verifier, lihat dokumentasi Windows Driver Kit (WDK).

Keterangan

Ekstensi ini hanya akan memberikan informasi yang berguna jika opsi Deteksi Kebuntuan Driver Verifier telah mendeteksi pelanggaran hierarki kunci dan pemeriksaan bug yang dikeluarkan 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION).

Tanpa argumen apa pun, ekstensi !deadlock menyebabkan topologi hierarki kunci dasar ditampilkan. Jika masalahnya bukan kebuntuan siklus sederhana, perintah ini akan menjelaskan situasi yang telah terjadi.

Ekstensi !deadlock 1 menyebabkan jejak tumpukan ditampilkan. Tumpukan yang ditampilkan akan menjadi yang aktif pada saat kunci diperoleh.

Berikut adalah contoh:

0:kd> !deadlock

Deadlock detected (2 resources in 2 threads):

Thread 0: A B
Thread 1: B A

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

Ini memberi tahu Anda utas mana dan kunci mana yang terlibat. Namun, ini dimaksudkan untuk menjadi ringkasan dan mungkin tidak cukup informasi untuk men-debug situasi secara memadai.

Gunakan !deadlock 1 untuk mencetak isi tumpukan panggilan pada saat setiap kunci yang berpartisipasi dalam kebuntuan diperoleh. Karena ini adalah jejak tumpukan run-time, mereka akan lebih lengkap jika build yang dicentang sedang digunakan. Build yang diperiksa tersedia pada versi Windows yang lebih lama sebelum Windows 10, versi 1803. Pada build gratis, mereka dapat dipotong setelah sedikitnya satu baris.

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
             dummy!dummyOpenVcChannels+0x2E1
             dummy!DummyAllocateRecvBufferComplete+0x436
             dummy!DummyAllocateComplete+0x55
             NDIS!ndisMQueuedAllocateSharedHandler+0xC9
             NDIS!ndisWorkerThread+0xEE

    Lock B -- dummy!GlobalLock (Spinlock)
    Stack:   dummy!dummyQueueRecvBuffers+0x2D
             dummy!DummyActivateVcComplete+0x90
             dummy!dummyOpenVcChannels+0x2E1
             dummy!DummyAllocateRecvBufferComplete+0x436
             dummy!DummyAllocateComplete+0x55

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

    Lock B -- dummy!GlobalLock (Spinlock)
    Stack:   dummy!dummyRxInterruptOnCompletion+0x25D
             dummy!DummyHandleInterrupt+0x32F
             NDIS!ndisMDpcX+0x3C
             ntkrnlpa!KiRetireDpcList+0x5D

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

Dengan informasi ini, Anda memiliki hampir semua yang Anda butuhkan, kecuali tumpukan saat ini:

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

Dari sini Anda dapat melihat kunci mana yang terlibat dan di mana kunci tersebut diperoleh. Ini harus menjadi informasi yang cukup bagi Anda untuk men-debug kebuntuan. Jika kode sumber tersedia, Anda dapat menggunakan debugger untuk melihat persis di mana masalah terjadi:

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]

Sekarang Anda tahu nama file sumber dan nomor baris tempat akuisisi terjadi. Dalam hal ini, file sumber akan menunjukkan bahwa utas berperilaku sebagai berikut:

  • Thread 1: DummyActivateVcComplete mengambil kunci miniport dummy . Kemudian disebut dummyQueueRecvBuffers, yang mengambil kunci global dummy.

  • Thread 2: dummyRxInterruptOnCompletion mengambil kunci global. Kemudian, beberapa baris kemudian, mengambil kunci miniport.

Pada titik ini, kebuntuan menjadi sepenuhnya jelas.