Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 handler pengecualian ini, lihat Mengaktifkan Postmortem Debugging.
Ketika sistem operasi Microsoft Windows memungkinkan debugger untuk menangani pengecualian, aplikasi yang menghasilkan pengecualian masuk ke dalam 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 dilanjutkan berjalan.
Jika debugger mengabaikan pengecualian dan membiarkan aplikasi terus berjalan, sistem operasi mencari penangan pengecualian lainnya 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
Saat pengecualian atau peristiwa menginterupsi debugger, Anda dapat menggunakan debugger untuk memeriksa kode yang sedang dieksekusi dan memori yang digunakan oleh 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.
Kernel-Mode Pengecualian
Pengecualian yang terjadi dalam kode mode kernel lebih serius daripada pengecualian mode pengguna. Jika pengecualian mode kernel tidak ditangani, sistem akan melakukan pemeriksaan bug dan 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 yang ditentukan dengan cara tertentu.
Debugger dapat mengatur status jeda untuk setiap pengecualian atau peristiwa:
Peristiwa ini dapat menyebabkan pemecahan masalah ke debugger segera setelah terjadi ("kesempatan pertama").
Peristiwa dapat dihentikan setelah penanganan kesalahan lainnya diberi kesempatan untuk merespons ("kesempatan kedua").
Kejadian ini juga dapat mengirim pesan ke debugger dan melanjutkan eksekusi.
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 jeda 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 jeda.
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. Interupsi ini terjadi sebelum penangan kesalahan lainnya diaktifkan. Metode ini disebut penanganan kesempatan pertama. |
SXD atau -xd | Kesempatan untuk istirahat kedua (Dinonaktifkan) |
Debugger tidak melakukan interupsi untuk jenis pengecualian kesempatan pertama 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 | Hasil (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 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 kesalahan untuk handle tidak valid, instruksi penghentian STATUS_BREAKPOINT, dan pengecualian langkah-per-langkah. (Konfigurasi ini terpisah dari konfigurasi jeda mereka.) Saat Anda mengonfigurasi status istirahatnya, 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 berikut ini "Definisi Peristiwa dan Pengaturan Bawaan.")
Anda dapat mengonfigurasi status penanganan untuk peristiwa CTRL+C (cc), tetapi bukan status pemutusannya. 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 ketika eksekusi dilanjutkan. |
SXD,SXN,SXI |
Tidak Ditangani |
Peristiwa 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 terhenti ke debugger. Anda dapat mengatur string perintah untuk pemisah 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 pemutusan. 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 diakhiri 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 jeda atau status penanganan pengecualian berikut. Status jeda default mereka ditunjukkan.
Status penanganan default pengecualian berikut selalu "Tidak Ditangani". Berhati-hatilah dengan 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 bawaan |
---|---|---|
asrt |
Kegagalan pernyataan |
Istirahat |
av |
Pelanggaran akses |
Istirahat |
Dm |
Data tidak selaras |
Istirahat |
Dz |
Pembagian bilangan bulat dengan nol |
Istirahat |
c000008e |
Pembagian titik mengambang dengan nol |
Istirahat |
Eh |
Pengecualian C++ EH |
Jeda kesempatan kedua |
Gp |
Pelanggaran halaman penjaga |
Istirahat |
ii |
Instruksi ilegal |
Jeda kesempatan kedua |
iov |
Luapan bilangan bulat |
Istirahat |
ip |
Kesalahan I/O di halaman |
Istirahat |
Isc |
Panggilan sistem tidak valid |
Istirahat |
lsq |
Urutan kunci tidak valid |
Istirahat |
sbo |
Luapan buffer tumpukan |
Istirahat |
Sov |
Luapan tumpukan |
Istirahat |
wkd |
Aktifkan debugger |
Istirahat |
aph |
Aplikasi macet Pengecualian ini dipicu jika sistem operasi Windows menyimpulkan bahwa proses telah berhenti merespons (yaitu, digantung). |
Istirahat |
3c |
Penghentian aplikasi untuk anak |
Jeda kesempatan kedua |
chhc |
Handle tidak valid |
Istirahat |
Nomor |
Pengecualian bernomor apa pun |
Jeda kesempatan kedua |
Nota 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 jeda 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 default jeda |
---|---|---|
dbce |
Pengecualian khusus perintah debugger |
Mengabaikan |
vcpp |
Pengecualian Khusus Visual C++ |
Mengabaikan |
wos |
Pengecualian langkah tunggal WOW64 |
Istirahat |
wob |
Pengecualian titik henti WOW64- |
Istirahat |
selatan-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 |
Nota Tiga pengecualian terakhir dalam tabel sebelumnya memiliki dua kode peristiwa yang berbeda. Saat Anda mengontrol status jedanya, gunakan sse, bpe, dan cce. Saat Anda mengontrol status penanganannya, gunakan ssec, bpec, dan cc.
Pengecualian berikut berguna saat Anda melakukan debug pada kode terkelola.
Kode peristiwa | Makna | Status bawaan |
---|---|---|
Clr |
Pengecualian Common Language Runtime (CLR) |
Jeda kesempatan kedua Tidak ditangani |
clrn |
Pengecualian Notifikasi Common Language Runtime |
Jeda kesempatan kedua Ditangani |
Anda dapat mengubah status jeda dari acara-acara berikut. Karena peristiwa ini bukan pengecualian, status penanganannya tidak relevan.
Kode peristiwa | Makna | Status jeda bawaan |
---|---|---|
Ser |
Kesalahan sistem |
Mengabaikan |
cpr[:Process] |
Pembuatan proses Mengatur status penghentian acara ini hanya berlaku untuk debugging dalam mode pengguna. Kejadian ini tidak terjadi dalam mode kernel. Anda dapat mengontrol peristiwa ini hanya jika Anda telah mengaktifkan debugging proses anak di CDB atau WinDbg, baik melalui opsi baris perintah -o atau melalui perintah .childdbg (Debug Proses Anak). Nama proses dapat menyertakan ekstensi nama file opsional dan tanda bintang () atau tanda tanya (?) sebagai karakter pengganti. 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 anak apa pun. |
Mengabaikan |
epr[:Process] |
Penghentian proses Pengaturan status jeda untuk kejadian ini hanya berlaku dalam penelusuran kesalahan mode pengguna. Kejadian ini tidak terjadi dalam mode kernel. Anda dapat mengontrol peristiwa ini hanya jika Anda telah mengaktifkan penelusuran kesalahan proses turunan di CDB atau WinDbg, entah melalui opsi baris perintah -o atau melalui perintah .childdbg (Debug Proses Turunan). Nama proses dapat menyertakan ekstensi nama file opsional dan tanda bintang () atau tanda tanya (?) sebagai karakter pengganti. 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 keluar anak. |
Mengabaikan |
Ct |
Pembuatan utas |
Mengabaikan |
Et |
Mengakhiri utas |
Mengabaikan |
ld[:Module] |
Memuat modul Jika Anda menentukan Modul, penghentian terjadi saat modul dengan nama ini dimuat. Modul dapat menentukan nama atau alamat modul. Jika nama digunakan, Modul mungkin berisi berbagai karakter pengganti dan spesifikator. (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 apa pun dimuat. |
Keluaran |
ud[:Module] |
Membongkar modul Jika Anda menentukan Modul, penghentian terjadi saat modul dengan nama ini, atau pada alamat dasar ini, dibongkar. Modul dapat menentukan nama atau alamat modul. Jika nama digunakan, Modul bisa menjadi nama yang tepat atau menyertakan karakter wildcard. Jika Modul adalah nama yang tepat, modul diubah menjadi alamat dasar dengan menggunakan daftar modul debugger saat ini dan kemudian disimpan sebagai alamat. Jika Modul berisi karakter wildcard, string pola akan disimpan untuk pencocokan di kemudian hari ketika peristiwa pembongkaran terjadi. Jarang, debugger tidak memiliki informasi nama untuk memuat keluar peristiwa dan hanya mencocokkan berdasarkan alamat dasar. Oleh karena itu, jika Modul berisi karakter wildcard, debugger tidak dapat melakukan kecocokan nama dalam kasus pemuatan khusus ini dan akan berhenti ketika 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 apa pun dimuat. |
Keluaran |
out[:Keluaran] |
Output aplikasi target Jika Anda menentukan Output, pemisah hanya terjadi saat output yang cocok dengan pola yang ditentukan diterima. Output dapat berisi berbagai karakter bebas dan spesifikasi. (Untuk informasi selengkapnya tentang sintaks, lihat Sintaks Wildcard String.) Namun, Output tidak boleh berisi titik dua atau spasi. Cocokannya tidak sensitif terhadap huruf besar/kecil. Sertakan titik dua atau spasi antara keluar dan Output. |
Mengabaikan |
ibp |
Titik henti awal (Kejadian ini terjadi di awal sesi debug dan setelah Anda menghidupkan ulang komputer target.) |
Dalam mode pengguna: Hentikan. 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 Kecelakaan Sistem dan Memulai Ulang Komputer Target. |
iml |
Beban modul awal (Kernel saja) |
Abaikan. Anda dapat mengubah status ini menjadi "Break" dengan berbagai metode. Untuk informasi selengkapnya tentang cara mengubah status ini, lihat Crash dan Reboot Komputer Target. |