Bagikan melalui


Peristiwa Penelusuran Kesalahan

Peristiwa penelusuran kesalahan adalah insiden dalam proses yang sedang di-debug yang menyebabkan sistem memberi tahu debugger. Peristiwa penelusuran kesalahan termasuk membuat proses, membuat utas, memuat pustaka tautan dinamis (DLL), membongkar DLL, mengirim string output, dan menghasilkan pengecualian.

Jika peristiwa debugging terjadi saat debugger menunggunya, sistem mengisi struktur DEBUG_EVENT yang ditentukan oleh WaitForDebugEvent dengan informasi yang menjelaskan peristiwa.

Ketika sistem memberi tahu debugger peristiwa debugging, sistem juga menangguhkan semua utas dalam proses yang terpengaruh. Utas tidak melanjutkan eksekusi hingga debugger melanjutkan peristiwa penelusuran kesalahan dengan menggunakan ContinueDebugEvent. Peristiwa penelusuran kesalahan berikut dapat terjadi saat proses sedang di-debug.

Kejadian penelusuran kesalahan Deskripsi
CREATE_PROCESS_DEBUG_EVENT
Dihasilkan setiap kali proses baru dibuat dalam proses yang sedang di-debug atau setiap kali debugger mulai men-debug proses yang sudah aktif. Sistem menghasilkan peristiwa penelusuran kesalahan ini sebelum proses mulai dijalankan dalam mode pengguna dan sebelum sistem menghasilkan peristiwa penelusuran kesalahan lainnya untuk proses baru.
Struktur DEBUG_EVENT berisi struktur CREATE_PROCESS_DEBUG_INFO. Struktur ini mencakup handel ke proses baru, handel ke file gambar proses, handel ke utas awal proses, dan informasi lain yang menjelaskan proses baru.
Handel ke proses memiliki akses PROCESS_VM_READ dan PROCESS_VM_WRITE. Jika debugger memiliki jenis akses ke utas ini, debugger dapat membaca dan menulis ke memori proses dengan menggunakan fungsi ReadProcessMemory dan WriteProcessMemory. Jika sistem sebelumnya melaporkan peristiwa EXIT_PROCESS_DEBUG_EVENT, sistem menutup handel ini ketika debugger memanggil fungsi ContinueDebugEvent.
Handel ke file gambar proses memiliki akses GENERIC_READ dan dibuka untuk berbagi baca. Debugger harus menutup handel ini saat memproses CREATE_PROCESS_DEBUG_EVENT.
Handel ke utas awal proses memiliki akses THREAD_GET_CONTEXT, THREAD_SET_CONTEXT, dan THREAD_SUSPEND_RESUME ke utas. Jika debugger memiliki jenis akses ke utas ini, debugger dapat membaca dari dan menulis ke register utas dengan menggunakan fungsi GetThreadContext dan SetThreadContext dan dapat menangguhkan dan melanjutkan utas dengan menggunakan fungsi SuspendThread dan ResumeThread. Jika sistem sebelumnya melaporkan peristiwa EXIT_PROCESS_DEBUG_EVENT, sistem menutup handel ini ketika debugger memanggil fungsi ContinueDebugEvent.
CREATE_THREAD_DEBUG_EVENT
Dihasilkan setiap kali utas baru dibuat dalam proses yang sedang di-debug atau setiap kali debugger mulai men-debug proses yang sudah aktif. Kejadian penelusuran kesalahan ini dihasilkan sebelum utas baru mulai dijalankan dalam mode pengguna.
Struktur DEBUG_EVENT berisi struktur CREATE_THREAD_DEBUG_INFO. Struktur ini mencakup handel ke utas baru dan alamat awal utas. Handel memiliki akses THREAD_GET_CONTEXT, THREAD_SET_CONTEXT, dan THREAD_SUSPEND_RESUME ke utas. Jika debugger memiliki jenis akses ke utas ini, debugger dapat membaca dari dan menulis ke register utas dengan menggunakan fungsi GetThreadContext dan SetThreadContext dan dapat menangguhkan dan melanjutkan utas dengan menggunakan fungsi SuspendThread dan ResumeThread.
Jika sistem sebelumnya melaporkan peristiwa EXIT_THREAD_DEBUG_EVENT, sistem menutup handel ke utas baru saat debugger memanggil fungsi ContinueDebugEvent .
EXCEPTION_DEBUG_EVENT
Dihasilkan setiap kali pengecualian terjadi dalam proses yang di-debug. Kemungkinan pengecualian termasuk mencoba mengakses memori yang tidak dapat diakses, menjalankan instruksi titik henti, mencoba membagi dengan nol, atau pengecualian lain yang dicatat dalam Penanganan Pengecualian Terstruktur.
Struktur DEBUG_EVENT berisi struktur EXCEPTION_DEBUG_INFO. Struktur ini menjelaskan pengecualian yang menyebabkan peristiwa penelusuran kesalahan.
Selain kondisi pengecualian standar, kode pengecualian tambahan dapat terjadi selama penelusuran kesalahan proses konsol. Sistem menghasilkan kode pengecualian DBG_CONTROL_C ketika CTRL+C dimasukkan ke proses konsol yang menangani sinyal CTRL+C dan sedang di-debug. Kode pengecualian ini tidak dimaksudkan untuk ditangani oleh aplikasi. Aplikasi tidak boleh menggunakan handler pengecualian untuk menanganinya. Ini dinaikkan hanya untuk keuntungan debugger dan hanya digunakan ketika debugger dilampirkan ke proses konsol.
Jika proses tidak di-debug atau jika debugger meneruskan pengecualian DBG_CONTROL_C tidak tertangani (melalui perintah gn), daftar fungsi handler aplikasi dicari, seperti yang didokumentasikan untuk fungsi SetConsoleCtrlHandler.
Jika debugger menangani pengecualian DBG_CONTROL_C (melalui perintah gh), aplikasi tidak akan melihat CTRL+C kecuali dalam kode seperti ini.
while ((inputChar = getchar()) != EOF) ...
Dengan demikian, debugger tidak dapat digunakan untuk menghentikan pembacaan tunggu dalam kode tersebut agar tidak berakhir.
EXIT_PROCESS_DEBUG_EVENT
Dihasilkan setiap kali utas terakhir dalam proses yang di-debug keluar. Peristiwa debugging ini terjadi segera setelah sistem membongkar DLL proses dan memperbarui kode keluar proses.
Struktur DEBUG_EVENT berisi struktur EXIT_PROCESS_DEBUG_INFO yang menentukan kode keluar.
Debugger membatalkan alokasi struktur internal apa pun yang terkait dengan proses penerimaan peristiwa debugging ini. Sistem menutup handel debugger ke proses keluar dan semua utas proses. Debugger tidak boleh menutup handel ini.
Bagian mode kernel dari penonaktifan proses tidak dapat diselesaikan hingga debugger yang menerima panggilan kejadian ini melanjutkanDebugEvent. Sampai saat itu, handel proses terbuka dan ruang alamat virtual tidak dirilis, sehingga debugger dapat memeriksa proses anak. Untuk menerima pemberitahuan ketika bagian mode kernel dari penonaktifan proses selesai, duplikat handel yang dikembalikan dengan CREATE_PROCESS_DEBUG_EVENT, panggil ContinueDebugEvent, lalu tunggu hingga handel proses duplikat diberi sinyal.
EXIT_THREAD_DEBUG_EVENT
Dihasilkan setiap kali utas yang merupakan bagian dari proses yang di-debug keluar. Sistem menghasilkan peristiwa penelusuran kesalahan ini segera setelah memperbarui kode keluar utas.
Struktur DEBUG_EVENT berisi struktur EXIT_THREAD_DEBUG_INFO yang menentukan kode keluar.
Kejadian penelusuran kesalahan ini tidak terjadi jika utas keluar adalah utas terakhir dari proses. Dalam hal ini, peristiwa debugging EXIT_PROCESS_DEBUG_EVENT terjadi sebagai gantinya.
Debugger membatalkan alokasi struktur internal apa pun yang terkait dengan utas pada tanda terima peristiwa debugging ini. Sistem menutup handel debugger ke utas keluar. Debugger tidak boleh menutup handel ini.
LOAD_DLL_DEBUG_EVENT
Dihasilkan setiap kali proses yang di-debug memuat DLL. Kejadian penelusuran kesalahan ini terjadi ketika pemuat sistem menyelesaikan tautan ke DLL atau ketika proses debug menggunakan fungsi LoadLibrary. Kejadian penelusuran kesalahan ini hanya terjadi pertama kali sistem melampirkan DLL ke ruang alamat virtual proses.
Struktur DEBUG_EVENT berisi struktur LOAD_DLL_DEBUG_INFO. Struktur ini mencakup handel ke DLL yang baru dimuat, alamat dasar DLL, dan informasi lain yang menjelaskan DLL. Debugger harus menutup handel ke handel DLL saat memproses LOAD_DLL_DEBUG_EVENT.
Biasanya, debugger memuat tabel simbol yang terkait dengan DLL pada tanda terima peristiwa debugging ini.
OUTPUT_DEBUG_STRING_EVENT
Dihasilkan ketika proses yang di-debug menggunakan
Fungsi OutputDebugString . Struktur DEBUG_EVENT berisi struktur OUTPUT_DEBUG_STRING_INFO. Struktur ini menentukan alamat, panjang, dan format string penelusuran kesalahan.
UNLOAD_DLL_DEBUG_EVENT
Dihasilkan setiap kali proses yang di-debug membongkar DLL dengan menggunakan fungsi FreeLibrary. Kejadian penelusuran kesalahan ini hanya terjadi terakhir kali DLL dibongkar dari ruang alamat proses (yaitu, ketika jumlah penggunaan DLL adalah nol).
Struktur DEBUG_EVENT berisi struktur UNLOAD_DLL_DEBUG_INFO. Struktur ini menentukan alamat dasar DLL di ruang alamat proses yang membongkar DLL.
Biasanya, debugger membongkar tabel simbol yang terkait dengan DLL saat menerima peristiwa penelusuran kesalahan ini.
Ketika proses keluar, sistem secara otomatis membongkar DLL proses, tetapi tidak menghasilkan peristiwa debugging UNLOAD_DLL_DEBUG_EVENT.
RIP_EVENT
Dihasilkan setiap kali proses yang di-debug mati di luar kontrol debugger sistem.
Struktur DEBUG_EVENT berisi struktur RIP_INFO. Struktur ini menentukan kesalahan dan jenis kesalahan.