Bagikan melalui


Menerobos Ke Debugger

Mode pengguna dan kode mode kernel menggunakan rutinitas yang berbeda untuk masuk ke debugger.

User-Mode Rutinitas Istirahat

Rutinitas istirahat menyebabkan pengecualian terjadi dalam proses saat ini, sehingga utas panggilan dapat memberi sinyal debugger yang terkait dengan proses panggilan.

Untuk memecah menjadi debugger dari program mode pengguna, gunakan fungsi DebugBreak. Prototipenya adalah sebagai berikut:

VOID DebugBreak(VOID);

Ketika program mode pengguna memanggil DebugBreak, kemungkinan tindakan berikut akan terjadi:

  1. Jika debugger mode pengguna terpasang, program akan masuk ke debugger. Ini berarti bahwa program akan dijeda dan debugger akan menjadi aktif.

  2. Jika debugger mode pengguna tidak terpasang, tetapi debugging mode kernel diaktifkan pada waktu boot, seluruh komputer akan masuk ke debugger kernel. Jika debugger kernel tidak terpasang, komputer akan membeku dan menunggu debugger kernel.

  3. Jika debugger mode pengguna tidak dilampirkan, dan debugging mode kernel tidak diaktifkan, program akan berakhir dengan pengecualian yang tidak tertangani, dan debugger post-mortem (just-in-time) akan diaktifkan. Untuk informasi selengkapnya, lihat Mengaktifkan Debugging Postmortem.

Kernel-Mode Rutinitas Istirahat

Ketika program mode kernel masuk ke debugger, seluruh sistem operasi membeku sampai debugger kernel memungkinkan eksekusi untuk dilanjutkan. Jika tidak ada debugger kernel, ini diperlakukan sebagai pemeriksaan bug.

Rutinitas DbgBreakPoint berfungsi dalam kode mode kernel, tetapi sebaliknya mirip dengan rutinitas mode pengguna DebugBreak .

Rutinitas DbgBreakPointWithStatus juga menyebabkan jeda, tetapi juga mengirim kode status 32-bit ke debugger.

Rutinitas KdBreakPoint dan KdBreakPointWithStatus identik dengan DbgBreakPoint dan DbgBreakPointWithStatus, masing-masing, saat dikompilasi di lingkungan build yang diperiksa. Ketika dikompilasi di lingkungan build gratis, mereka tidak berpengaruh.

Rutinitas Istirahat Bersyar Kernel-Mode

Dua rutinitas pemutusan kondisi tersedia untuk kode mode kernel. Rutinitas ini menguji ekspresi logis. Jika ekspresi salah, eksekusi berhenti dan debugger menjadi aktif.

  • Makro ASSERT menguji ekspresi logis. Jika ekspresi salah, eksekusi berhenti dan debugger menjadi aktif. Ekspresi yang gagal dan lokasinya dalam program ditampilkan dalam debugger.

  • Makro ASSERTMSG identik dengan ASSERT kecuali memungkinkan pesan tambahan dikirim ke debugger.

ASSERT dan ASSERTMSG hanya aktif saat dikompilasi di lingkungan build yang diperiksa. Ketika dikompilasi di lingkungan build gratis, mereka tidak berpengaruh.