Bagikan melalui


Deteksi Kebuntuan

Deteksi Kebuntuan memantau penggunaan sumber daya driver yang perlu dikunci -- kunci putar, muteks, dan mutex cepat. Opsi Pemverifikasi Driver ini akan mendeteksi logika kode yang berpotensi menyebabkan kebuntuan pada beberapa titik mendatang.

Opsi Deteksi Deadlock dari Driver Verifier, bersama dengan ekstensi debugger kernel !deadlock, adalah alat yang efektif untuk memastikan kode Anda menghindari penggunaan sumber daya ini yang buruk.

Deteksi kebuntuan hanya didukung di Windows XP dan versi yang lebih baru.

Penyebab Deadlock

Kebuntuan terjadi ketika dua atau lebih thread berkonflik atas suatu sumber daya, sehingga tidak ada eksekusi yang mungkin dilakukan.

Bentuk kebuntuan yang paling umum terjadi ketika dua thread atau lebih menunggu sumber daya yang dikuasai oleh thread lain. Ini diilustrasikan sebagai berikut:

Utas 1 Rangkaian 2
Mengambil Kunci A Mengambil Kunci B
Mengunci Permintaan B Permintaan Kunci A

Jika kedua urutan terjadi pada saat yang sama, Thread 1 tidak akan pernah mendapatkan Lock B karena dimiliki oleh Thread 2, dan Thread 2 tidak akan pernah mendapatkan Lock A karena dimiliki oleh Thread 1. Dalam situasi terbaik, ini menyebabkan utas yang terlibat berhenti, dan dalam situasi terburuk, menyebabkan sistem berhenti merespons.

Kebuntuan tidak hanya terjadi pada dua utas dan dua sumber daya. Kebuntuan tiga arah antara tiga utas dan tiga kunci umum -- dan bahkan kebuntuan lima bagian atau enam bagian kadang-kadang terjadi. Kebuntuan ini membutuhkan tingkat tertentu "nasib buruk" karena kondisi ini bergantung pada sejumlah hal yang harus terjadi secara bersamaan. Namun, semakin berjauhan akuisisi kunci, semakin besar kemungkinan hal ini terjadi.

Kebuntuan utas tunggal dapat terjadi ketika utas mencoba mengambil kunci yang sudah dimilikinya.

Persamaan di antara semua kebuntuan adalah bahwa hierarki kunci tidak dihormati. Setiap kali perlu memiliki lebih dari satu kunci yang diperoleh pada satu waktu, setiap kunci harus memiliki prioritas yang jelas. Jika A diambil sebelum B pada satu titik dan B sebelum C di titik lain, hierarkinya adalah A-B-C. Ini berarti bahwa A tidak boleh diperoleh setelah B atau C, dan B tidak boleh diperoleh setelah C.

Hierarki kunci harus diikuti bahkan ketika tidak ada kemungkinan kebuntuan, karena dalam proses mempertahankan kode akan mudah bagi kebuntuan untuk diperkenalkan secara tidak sengaja.

Sumber Daya yang Dapat Menyebabkan Kebuntuan

Kebuntuan yang paling tidak ambigu adalah hasil dari sumber daya yang dimiliki. Ini termasuk kunci spin, mutex, mutex cepat, dan ERESOURCEs.

Sumber daya yang disinyalir daripada diperoleh (seperti peristiwa dan port LPC) cenderung menyebabkan kebuntuan yang jauh lebih ambigu. Tentu saja dimungkinkan, dan seringkali terjadi, bahwa kode menyalahgunakan sumber daya ini sehingga dua utas saling menunggu tanpa batas waktu agar selesai. Namun, karena sumber daya ini sebenarnya tidak dimiliki oleh satu utas, tidak mungkin untuk mengidentifikasi utas yang menunggak dengan tingkat kepastian apa pun.

Opsi Deteksi Kebuntuan dari Driver Verifier mencari potensi kebuntuan yang melibatkan spinlock, mutex, dan fast mutex. Ini tidak memantau penggunaan ERESOURCEs, juga tidak memantau penggunaan sumber daya yang tidak dimiliki.

Efek Deteksi Kebuntuan

Rutinitas Deteksi Kebuntuan Driver Verifier menemukan pelanggaran hierarki kunci yang belum tentu dilakukan secara bersamaan. Seringkali, pelanggaran ini mengidentifikasi jalur kode yang akan macet jika diberikan kesempatan.

Untuk menemukan potensi kebuntuan, Driver Verifier membangun grafik urutan akuisisi sumber daya dan memeriksa perulangan. Jika Anda membuat simpul untuk setiap sumber daya, dan menggambar panah setiap kali satu kunci diperoleh sebelum kunci lainnya, maka loop jalur akan mewakili pelanggaran hierarki kunci.

Driver Verifier akan mengeluarkan pemeriksaan bug ketika salah satu pelanggaran ini ditemukan. Ini akan terjadi sebelum kebuntuan aktual terjadi.

Nota

Bahkan jika jalur kode yang bertentangan tidak pernah dapat terjadi secara bersamaan, jalur tersebut masih harus ditulis ulang jika melibatkan pelanggaran hierarki kunci. Kode seperti itu adalah "kebuntuan menunggu terjadi" yang dapat menyebabkan kebuntuan nyata jika kode ditulis ulang sedikit.

Ketika Deteksi Kebuntuan menemukan pelanggaran, akan mengeluarkan cek bug 0xC4. Parameter pertama dari pemeriksaan bug ini akan menunjukkan pelanggaran yang tepat. Kemungkinan pelanggaran meliputi:

  • Dua utas atau lebih yang terlibat dalam pelanggaran hirarki penguncian

  • Utas yang mencoba secara eksklusif memperoleh sumber daya yang sudah dikuasai bersama (sumber daya yang dikuasai secara eksklusif dapat diperoleh bersama; sumber daya yang dikuasai bersama tidak dapat diperoleh secara eksklusif).

  • Utas yang mencoba memperoleh sumber daya yang sama dua kali (kebuntuan mandiri)

  • Sumber daya yang dirilis tanpa diperoleh terlebih dahulu

  • Sumber daya yang dirilis oleh thread berbeda dari yang memperolehnya

  • Sumber daya yang diinisialisasi lebih dari sekali, atau tidak diinisialisasi sama sekali

  • Utas yang dihapus saat masih memiliki sumber daya

  • Mulai windows 7, Driver Verifier dapat memprediksi kemungkinan kebuntuan. Misalnya, mencoba menggunakan struktur data KSPIN_LOCK yang sama baik sebagai kunci spin reguler maupun sebagai kunci spin antrean tumpukan.

Lihat Pemeriksaan Kesalahan 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) untuk melihat daftar parameter pemeriksaan kesalahan.

Pengawasan Deteksi Kebuntuan

Setelah Deteksi Kebuntuan menemukan pelanggaran, ekstensi debugger kernel !deadlock dapat digunakan untuk menyelidiki secara tepat apa yang telah terjadi. Ini dapat menampilkan topologi hierarki kunci serta tumpukan panggilan untuk setiap utas ketika kunci pertama kali diperoleh.

Ada contoh terperinci dari ekstensi !deadlock , serta informasi umum tentang ekstensi debugger, dalam dokumentasi dalam paket Alat Debugging untuk Windows. Lihat Penelusuran Kesalahan Windows untuk detailnya.

Mengaktifkan opsi ini

Nota

Opsi ini tidak kompatibel dengan fuzzing penundaan sinkronisasi kernel

Anda dapat mengaktifkan fitur Deteksi Kebuntuan untuk satu atau beberapa driver dengan menggunakan Driver Verifier Manager atau baris perintah Verifier.exe. Untuk detailnya, lihat Memilih Opsi Pemverifikasi Driver.

  • Pada baris perintah

    Pada baris perintah, opsi Deteksi Deadlock diwakili oleh Bit 5 (0x20). Untuk mengaktifkan Deteksi Kebuntuan, gunakan nilai bendera 0x20 atau tambahkan 0x20 ke nilai bendera. Contohnya:

    verifier /flags 0x20 /driver MyDriver.sys
    

    Fitur ini akan aktif setelah boot berikutnya.

    Pada Windows Vista dan versi Windows yang lebih baru, Anda juga dapat mengaktifkan dan menonaktifkan Deteksi Deadlock tanpa memulai ulang komputer dengan menambahkan parameter /volatile ke perintah. Contohnya:

    verifier /volatile /flags 0x20 /adddriver MyDriver.sys
    

    Pengaturan ini segera efektif, tetapi hilang ketika Anda mematikan atau me-reboot komputer. Untuk detailnya, lihat Menggunakan Pengaturan Volatil.

    Fitur Deteksi Kebuntuan juga disertakan dalam pengaturan standar. Contohnya:

    verifier /standard /driver MyDriver.sys
    
  • Menggunakan Pengelola Verifikasi Pengemudi

    1. Pilih Buat pengaturan kustom (untuk pengembang kode) lalu pilih Berikutnya.

    2. Pilih Pilih pengaturan individual dari daftar lengkap.

    3. Pilih (centang) Deteksi kebuntuan.

Fitur Deteksi Kebuntuan juga disertakan dalam pengaturan standar. Untuk menggunakan fitur ini, di Driver Verifier Manager, pilih Buat Pengaturan Standar.