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 |
Pengecualian langkah tunggal |
Istirahat |
bpe |
Pengecualian titik henti |
Istirahat |
Cce |
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. |
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk