Mengontrol Pengecualian dan Peristiwa

Anda dapat menangkap dan menangani pengecualian dalam aplikasi mode pengguna dan mode kernel dengan berbagai metode. Debugger aktif, debugger postmortem, atau rutinitas penanganan kesalahan internal adalah semua cara umum untuk menangani pengecualian.

Untuk informasi selengkapnya tentang urutan prioritas dari berbagai penangan pengecualian ini, lihat Mengaktifkan Debugging Postmortem.

Ketika sistem operasi Microsoft Windows memungkinkan debugger untuk menangani pengecualian, aplikasi yang menghasilkan pengecualian menerobos ke debugger. Artinya, aplikasi berhenti dan debugger menjadi aktif. Debugger kemudian dapat menangani pengecualian dalam beberapa cara atau menganalisis situasi. Debugger kemudian dapat mengakhiri proses atau membiarkannya terus berjalan.

Jika debugger mengabaikan pengecualian dan memungkinkan aplikasi terus berjalan, sistem operasi mencari penangan pengecualian lain seolah-olah tidak ada debugger yang ada. Jika pengecualian ditangani, aplikasi terus berjalan. Namun, jika pengecualian tetap tidak tertangani, debugger kemudian diberi kesempatan kedua untuk menangani situasi.

Menggunakan Debugger untuk Menganalisis Pengecualian

Ketika pengecualian atau peristiwa masuk ke debugger, Anda dapat menggunakan debugger untuk memeriksa kode yang sedang dijalankan dan memori yang digunakan aplikasi. Dengan mengubah jumlah tertentu atau melompat ke titik yang berbeda dalam aplikasi, Anda mungkin dapat menghapus penyebab pengecualian.

Anda dapat melanjutkan eksekusi dengan mengeluarkan perintah gh (Go with Exception Handled) atau gn (Go with Exception Not Handled ).

Jika Anda mengeluarkan perintah gn dalam kesempatan kedua debugger untuk menangani pengecualian, aplikasi berakhir.

Pengecualian Mode Kernel

Pengecualian yang terjadi dalam kode mode kernel lebih serius daripada pengecualian mode pengguna. Jika pengecualian mode kernel tidak ditangani, pemeriksaan bug dikeluarkan dan sistem berhenti.

Seperti halnya pengecualian mode pengguna, jika debugger mode kernel dilampirkan ke sistem, debugger akan diberi tahu sebelum layar pemeriksaan bug (juga dikenal sebagai layar biru) muncul. Jika tidak ada debugger yang terpasang, layar pemeriksaan bug akan muncul. Dalam hal ini, sistem operasi mungkin membuat file crash dump.

Mengontrol Pengecualian dan Peristiwa dari Debugger

Anda dapat mengonfigurasi debugger untuk bereaksi terhadap pengecualian dan peristiwa tertentu dengan cara tertentu.

Debugger dapat mengatur status jeda untuk setiap pengecualian atau peristiwa:

  • Peristiwa ini dapat menyebabkan pembobolan debugger segera setelah terjadi ("kesempatan pertama").

  • Peristiwa dapat dihentikan setelah penangan kesalahan lainnya diberi kesempatan untuk merespons ("kesempatan kedua").

  • Peristiwa ini juga dapat mengirim pesan debugger tetapi terus mengeksekusi.

  • Debugger dapat mengabaikan peristiwa.

Debugger juga dapat mengatur status penanganan untuk setiap pengecualian dan peristiwa. Debugger dapat memperlakukan peristiwa seperti pengecualian yang ditangani atau pengecualian yang tidak tertangani. (Tentu saja, peristiwa yang sebenarnya bukan kesalahan tidak memerlukan penanganan apa pun.)

Anda dapat mengontrol status pemutusan dan status penanganan dengan melakukan salah satu hal berikut ini:

  • Gunakan perintah SXE, SXD, SXN, atau SXI di jendela Perintah Debugger.

  • (CDB dan NTSD) Gunakan opsi -x, -xe, -xd, -xn, atau -xi pada baris perintah.

  • (CDB, NTSD, dan KD) Gunakan kata kunci sxe atau sxd dalam file Tools.ini .

  • (Hanya WinDbg) Pilih Filter Peristiwa pada menu Debug untuk membuka kotak dialog Filter Peristiwa , lalu pilih opsi yang Anda inginkan.

Perintah SX\*, opsi baris perintah -x\*, dan kata kunci Tools.ini sx\* biasanya mengatur status pemutusan dari peristiwa yang ditentukan. Anda dapat menambahkan opsi -h untuk menyebabkan status penanganan diatur sebagai gantinya.

Ada empat kode peristiwa khusus (cc, hc, bpec, dan ssec) yang selalu menentukan status penanganan alih-alih status putus.

Anda dapat menampilkan pengecualian atau peristiwa terbaru dengan menggunakan perintah .lastevent (Tampilkan Peristiwa Terakhir).

Mengontrol Status Pemutusan

Saat Anda mengatur status hentian pengecualian atau peristiwa, Anda bisa menggunakan opsi berikut.

Perintah Nama status Deskripsi

SXE atau -xe

Istirahat

(Diaktifkan)

Ketika pengecualian ini terjadi, target segera masuk ke debugger. Jeda ini terjadi sebelum penangan kesalahan lainnya diaktifkan. Metode ini disebut penanganan kesempatan pertama.

SXD atau -xd

Kesempatan kedua istirahat

(Dinonaktifkan)

Debugger tidak masuk untuk pengecualian kesempatan pertama semacam ini (meskipun pesan ditampilkan). Jika penangan kesalahan lain tidak dapat mengatasi pengecualian ini, eksekusi berhenti dan target masuk ke debugger. Metode ini disebut penanganan kesempatan kedua.

SXN atau -xn

Output

(Beri tahu)

Ketika pengecualian ini terjadi, aplikasi target tidak masuk ke debugger sama sekali. Namun, pesan ditampilkan yang memberi tahu pengguna tentang pengecualian ini.

SXI atau -xi

Abaikan

Ketika pengecualian ini terjadi, aplikasi target tidak masuk ke debugger, dan tidak ada pesan yang ditampilkan.

Jika pengecualian tidak diantisipasi oleh pengaturan SX*, aplikasi target akan masuk ke debugger pada kesempatan kedua. Status default untuk peristiwa tercantum di bagian "Definisi Peristiwa dan Default" berikut dari topik ini.

Untuk mengatur status pemutusan dengan menggunakan antarmuka grafis WinDbg, Filter Peristiwa pada menu Debug pilih peristiwa yang Anda inginkan dari daftar dalam kotak dialog Filter Peristiwa, lalu pilih Diaktifkan, Dinonaktifkan, Output, atau Abaikan.

Mengontrol Status Penanganan

Semua peristiwa dianggap tidak tertangani, kecuali Anda menggunakan perintah gh (Go with Exception Handled).

Semua pengecualian dianggap tidak tertangani, kecuali Anda menggunakan perintah sx\* bersama dengan opsi -h .

Selain itu, opsi SX* dapat mengonfigurasi status penanganan untuk handel yang tidak valid, STATUS_BREAKPOINT instruksi pemutusan, dan pengecualian satu langkah. (Konfigurasi ini terpisah dari konfigurasi jedanya.) Saat Anda mengonfigurasi status jedanya, peristiwa ini masing-masing diberi nama ch, bpe, dan sse. Saat Anda mengonfigurasi status penanganannya, peristiwa ini masing-masing diberi nama hc, bpec, dan ssec. (Untuk daftar lengkap peristiwa, lihat bagian "Definisi Peristiwa dan Default" berikut ini.)

Anda dapat mengonfigurasi status penanganan untuk peristiwa CTRL+C (cc), tetapi bukan status jedanya. Jika aplikasi menerima peristiwa CTRL+C, aplikasi selalu masuk ke debugger.

Saat Anda menggunakan perintah SX* pada peristiwa cc, hc, bpec, dan ssec , atau saat Anda menggunakan perintah SX* bersama dengan opsi -h pada pengecualian, tindakan berikut terjadi.

Perintah Nama status Deskripsi

SXE

Ditangani

Peristiwa dianggap ditangani saat eksekusi dilanjutkan.

SXD,SXN,SXI

Tidak Ditangani

Kejadian ini dianggap tidak ditangani saat eksekusi dilanjutkan.

Untuk mengatur status penanganan dengan menggunakan antarmuka grafis WinDbg, pilih Filter Peristiwa pada menu Debug , pilih peristiwa yang Anda inginkan dari daftar dalam kotak dialog Filter Peristiwa , lalu pilih Ditangani atau Tidak Ditangani.

Perintah Otomatis

Debugger juga memungkinkan Anda mengatur perintah yang secara otomatis dijalankan jika peristiwa atau pengecualian menyebabkan pemecahan masalah ke debugger. Anda dapat mengatur string perintah untuk jeda kesempatan pertama dan string perintah untuk jeda kesempatan kedua. Anda dapat mengatur string ini dengan perintah SX\* atau Debug | Perintah Filter Peristiwa . Setiap string perintah dapat berisi beberapa perintah yang dipisahkan dengan titik koma.

Perintah ini dijalankan terlepas dari status jeda. Artinya, jika status jeda adalah "Abaikan," perintah masih dijalankan. Jika status jeda adalah "Pemutusan kesempatan kedua", perintah kesempatan pertama dijalankan ketika pengecualian pertama kali terjadi, sebelum penangan pengecualian lainnya terlibat. String perintah dapat diakhir dengan perintah eksekusi seperti g (Go), gh (Go dengan Pengecualian Ditangani), atau gn (Go dengan Pengecualian Tidak Ditangani).

Definisi Peristiwa dan Default

Anda dapat mengubah status pemutusan atau status penanganan pengecualian berikut. Status jeda default mereka ditunjukkan.

Status penanganan default pengecualian berikut selalu "Tidak Ditangani". Berhati-hatilah untuk mengubah status ini. Jika Anda mengubah status ini menjadi "Ditangani", semua pengecualian kesempatan pertama dan kesempatan kedua dari jenis ini dianggap ditangani, dan konfigurasi ini melewati semua rutinitas penanganan pengecualian.

Kode peristiwa Makna Status jeda default

asrt

Kegagalan pernyataan

Istirahat

Av

Pelanggaran akses

Istirahat

Dm

Data tidak sejajar

Istirahat

Dz

Pembagian bilangan bulat dengan nol

Istirahat

c000008e

Pembagian titik mengambang dengan nol

Istirahat

eh

Pengecualian C++ EH

Istirahat berpeluang kedua

Gp

Pelanggaran halaman penjaga

Istirahat

Ii

Instruksi ilegal

Istirahat berpeluang kedua

iov

Luapan bilangan bulat

Istirahat

Ip

Kesalahan I/O dalam halaman

Istirahat

Isc

Panggilan sistem tidak valid

Istirahat

lsq

Urutan kunci tidak valid

Istirahat

sbo

Luapan penyangga tumpukan

Istirahat

Sov

Luapan tumpukan

Istirahat

wkd

Debugger bangun

Istirahat

aph

Aplikasi macet

Pengecualian ini dipicu jika sistem operasi Windows menyimpulkan bahwa proses telah berhenti merespons (yaitu, digantung).

Istirahat

3c

Penghentian aplikasi anak

Istirahat berpeluang kedua

chhc

Handel tidak valid

Istirahat

Number

Pengecualian bernomor apa pun

Istirahat berpeluang kedua

Catatan Anda dapat mengganti status pemutusan asrt untuk alamat tertentu dengan menggunakan perintah ah (Penanganan Pernyataan). Kode peristiwa ch dan hc mengacu pada pengecualian yang sama. Saat Anda mengontrol status jedanya, gunakan sx* ch. Saat Anda mengontrol status penanganannya, gunakan sx* hc.

Anda dapat mengubah status pemutusan atau status penanganan pengecualian berikut. Status jeda default mereka ditunjukkan.

Status penanganan default pengecualian berikut selalu "Ditangani". Karena pengecualian ini digunakan untuk berkomunikasi dengan debugger, Anda biasanya tidak boleh mengubah statusnya menjadi "Tidak Ditangani". Status ini menyebabkan penangan pengecualian lainnya menangkap pengecualian jika debugger mengabaikannya.

Aplikasi dapat menggunakan DBG_COMMAND_EXCEPTION (dbce) untuk berkomunikasi dengan debugger. Pengecualian ini mirip dengan titik henti, tetapi Anda dapat menggunakan perintah SX* untuk bereaksi dengan cara tertentu ketika pengecualian ini terjadi.

Kode peristiwa Makna Status jeda default

dbce

Pengecualian perintah debugger khusus

Ignore

vcpp

Pengecualian Visual C++ Khusus

Ignore

wos

Pengecualian langkah tunggal WOW64

Istirahat

wob

Pengecualian titik henti WOW64-

Istirahat

Arah tenggara
ssec

Pengecualian langkah tunggal

Istirahat

bpe
bpec

Pengecualian titik henti

Istirahat

Cce
cc

CTRL+C atau CTRL+BREAK

Pengecualian ini dipicu jika target adalah aplikasi konsol dan CTRL+C atau CTRL+BREAK diteruskan ke dalamnya.

Istirahat

Catatan Tiga pengecualian terakhir dalam tabel sebelumnya memiliki dua kode peristiwa yang berbeda. Saat Anda mengontrol status jeda mereka, gunakan sse, bpe, dan cce. Saat Anda mengontrol status penanganannya, gunakan ssec, bpec, dan cc.

Pengecualian berikut berguna saat Anda men-debug kode terkelola.

Kode peristiwa Makna Status default

Clr

Pengecualian Runtime Bahasa Umum

Jeda kesempatan kedua

Tidak ditangani

clrn

Pengecualian pemberitahuan Runtime Bahasa Umum

Jeda kesempatan kedua

Ditangani

Anda dapat mengubah status jeda peristiwa berikut. Karena peristiwa ini tidak terkecuali, status penanganannya tidak relevan.

Kode peristiwa Makna Status jeda default

Ser

Kesalahan sistem

Ignore

cpr[:Process]

Pembuatan proses

Mengatur status pemutusan peristiwa ini hanya berlaku untuk penelusuran kesalahan mode pengguna. Kejadian ini tidak terjadi dalam mode kernel.

Anda dapat mengontrol peristiwa ini hanya jika Anda telah mengaktifkan penelusuran kesalahan proses anak di CDB atau WinDbg, baik melaluiopsi baris perintah -o atau melalui perintah .childdbg (Proses Anak Debug).

Nama proses dapat menyertakan ekstensi nama file opsional dan tanda bintang () atau tanda tanya (?) sebagai karakter kartubebas. Debugger hanya mengingat pengaturan cpr terbaru. Pengaturan terpisah untuk proses terpisah tidak didukung. Sertakan titik dua atau spasi antara cpr dan Proses.

Jika Proses dihilangkan, pengaturan berlaku untuk pembuatan proses turunan apa pun.

Ignore

epr[:Process]

Proses keluar

Mengatur status pemutusan peristiwa ini hanya berlaku untuk penelusuran kesalahan mode pengguna. Kejadian ini tidak terjadi dalam mode kernel.

Anda dapat mengontrol peristiwa ini hanya jika Anda telah mengaktifkan penelusuran kesalahan proses anak di CDB atau WinDbg, baik melaluiopsi baris perintah -o atau melalui perintah .childdbg (Proses Anak Debug).

Nama proses dapat menyertakan ekstensi nama file opsional dan tanda bintang () atau tanda tanya (?) sebagai karakter kartubebas. Debugger hanya mengingat pengaturan epr terbaru. Pengaturan terpisah untuk proses terpisah tidak didukung. Sertakan titik dua atau spasi antara epr dan Proses.

Jika Proses dihilangkan, pengaturan berlaku untuk setiap proses turunan yang keluar.

Ignore

ct

Pembuatan utas

Ignore

Et

Keluar dari utas

Ignore

ld[:Module]

Muat modul

Jika Anda menentukan Modul, pemutusan terjadi saat modul dengan nama ini dimuat. Modul dapat menentukan nama atau alamat modul. Jika nama digunakan, Modul mungkin berisi berbagai karakter kartubebas dan penentu. (Untuk informasi selengkapnya tentang sintaks, lihat Sintaks Wildcard String.)

Debugger hanya mengingat pengaturan ld terbaru. Pengaturan terpisah untuk modul terpisah tidak didukung. Sertakan titik dua atau spasi antara ld dan Module.

Jika Modul dihilangkan, peristiwa dipicu saat modul dimuat.

Output

ud[:Module]

Membongkar modul

Jika Anda menentukan Modul, pemutusan terjadi saat modul dengan nama ini, atau di alamat dasar ini, dibongkar. Modul dapat menentukan nama atau alamat modul. Jika nama digunakan, Modul dapat menjadi nama yang tepat atau menyertakan karakter kartubebas. Jika Modul adalah nama yang tepat, modul segera diselesaikan ke alamat dasar dengan menggunakan daftar modul debugger saat ini dan disimpan sebagai alamat. Jika Modul berisi karakter kartubebas, string pola disimpan untuk pencocokan nanti saat peristiwa pembongkaran terjadi.

Jarang, debugger tidak memiliki informasi nama untuk membongkar peristiwa dan hanya cocok dengan alamat dasar. Oleh karena itu, jika Modul berisi karakter kartubebas, debugger tidak dapat melakukan pencocokan nama dalam kasus bongkar khusus ini dan berhenti saat modul apa pun dibongkar.

Debugger hanya mengingat pengaturan ud terbaru. Pengaturan terpisah untuk modul terpisah tidak didukung. Sertakan titik dua atau spasi antara ud dan Module.

Jika Modul dihilangkan, peristiwa dipicu saat modul dimuat.

Output

out[:Output]

Output aplikasi target

Jika Anda menentukan Output, jeda hanya terjadi saat output yang cocok dengan pola yang ditentukan diterima. Output dapat berisi berbagai karakter kartubebas dan penentu. (Untuk informasi selengkapnya tentang sintaks, lihat Sintaks Wildcard String.) Namun, Output tidak boleh berisi titik dua atau spasi. Kecocokan tidak peka huruf besar/kecil. Sertakan titik dua atau spasi antara keluar dan Output.

Ignore

Ibp

Titik henti awal

(Peristiwa ini terjadi di awal sesi debug dan setelah Anda memulai ulang komputer target.)

Dalam mode pengguna: Istirahat. Anda dapat mengubah status ini menjadi "Abaikan" dengan menggunakan opsi baris perintah-g.

Dalam mode kernel: Mengabaikan. Anda dapat mengubah status ini menjadi "Diaktifkan" dengan berbagai metode. Untuk informasi selengkapnya tentang cara mengubah status ini, lihat Crash dan Reboot Komputer Target.

iml

Beban modul awal

(Mode kernel saja)

Mengabaikan. Anda dapat mengubah status ini menjadi "Break" dengan berbagai metode. Untuk informasi selengkapnya tentang cara mengubah status ini, lihat Crash dan Reboot Komputer Target.