Bagikan melalui


Deteksi Kebuntuan

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

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

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

Penyebab Kebuntuan

Kebuntuan disebabkan ketika dua utas atau lebih bertentangan dengan beberapa sumber daya, sewaktu-waktu tidak ada eksekusi yang dimungkinkan.

Bentuk kebuntuan yang paling umum terjadi ketika dua utas atau lebih menunggu sumber daya yang dimiliki oleh utas lainnya. Ini diilustrasikan sebagai berikut:

Rangkaian 1 Rangkaian 2
Mengambil Kunci A Mengambil Kunci B
Kunci Permintaan B Kunci Permintaan 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. Paling baik ini menyebabkan utas yang terlibat berhenti, dan yang terburuk menyebabkan sistem berhenti merespons.

Kebuntuan tidak terbatas 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 "nasib buruk" tertentu karena mereka mengandalkan sejumlah hal yang terjadi secara bersamaan. Namun, semakin jauh akuisisi kunci, semakin besar kemungkinan ini menjadi.

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

Penyebut umum 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 semua terlalu umum, agar kode menyalahgunakan sumber daya ini sia-sia sehingga dua utas akan berakhir menunggu tanpa batas waktu satu sama lain untuk diselesaikan. 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 Driver Verifier mencari potensi kebuntuan yang melibatkan kunci spin, mutex, dan mutex cepat. Ini tidak memantau penggunaan ERESOURCEs, juga tidak memantau penggunaan sumber daya yang tidak berwenang.

Efek Deteksi Kebuntuan

Rutinitas Deteksi Kebuntuan Driver Verifier menemukan pelanggaran hierarki kunci yang belum tentu dilakukan secara bersamaan. Sebagian besar waktu, pelanggaran ini mengidentifikasi jalur kode yang akan kebuntuan ketika 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 kapan saja satu kunci diperoleh sebelum yang lain, maka perulangan 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.

Catatan

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 untuk terjadi" yang dapat menyebabkan kebuntuan nyata jika kode ditulis ulang sedikit.

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

  • Dua utas atau lebih yang terlibat dalam pelanggaran hierarki kunci

  • Utas yang mencoba memperoleh sumber daya secara eksklusif yang sudah menjadi pemilik bersama (sumber daya yang dimiliki secara eksklusif dapat diperoleh bersama; sumber daya 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 utas yang 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, Pemverifikasi Driver dapat memprediksi kemungkinan kebuntuan. Misalnya, mencoba menggunakan struktur data KSPIN_LOCK yang sama baik sebagai kunci putar biasa maupun sebagai kunci spin antrean tumpukan.

Lihat 0xC4 Pemeriksaan Bug (DRIVER_VERIFIER_DETECTED_VIOLATION) untuk daftar parameter pemeriksaan bug.

Memantau Deteksi Kebuntuan

Setelah Deteksi Kebuntuan menemukan pelanggaran, ekstensi debugger kernel !deadlock dapat digunakan untuk menyelidiki dengan tepat apa yang telah terjadi. Ini dapat menampilkan topologi hierarki kunci serta tumpukan panggilan untuk setiap utas pada saat kunci awalnya 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

Catatan

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 KebunTuan 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 Kebuntuan tanpa me-reboot komputer dengan menambahkan parameter /volatil ke perintah. Contohnya:

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

    Pengaturan ini langsung 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 Driver Verifier Manager

    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 Manajer Pemverifikasi Driver, pilih Buat Pengaturan Standar.