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.
Titik henti yang dikontrol oleh prosesor atas permintaan debugger dikenal sebagai titik henti prosesor atau titik henti data. Titik henti yang dikontrol langsung oleh debugger dikenal sebagai titik henti perangkat lunak.
Catatan Meskipun istilah titik henti data umumnya digunakan sebagai sinonim untuk titik henti prosesor, istilah ini dapat menyesatkan. Ada dua jenis titik henti mendasar: titik henti prosesor, yang dikontrol oleh prosesor, dan titik henti perangkat lunak, yang dikendalikan oleh debugger. Titik henti prosesor biasanya diatur pada data program -- ini adalah alasan mereka disebut "titik henti data" -- tetapi juga dapat diatur pada kode yang dapat dieksekusi. Titik henti perangkat lunak biasanya diatur pada kode yang dapat dieksekusi, tetapi juga dapat diatur pada data program. Sayangnya, umum dalam men-debug literatur untuk menyebut titik henti prosesor sebagai "titik henti data", bahkan ketika diatur pada kode yang dapat dieksekusi.
Titik Henti Prosesor
Titik henti prosesor dipicu saat lokasi memori tertentu diakses. Ada empat jenis titik henti prosesor, sesuai dengan jenis akses memori yang memicunya:
Jenis titik henti | Perbuatan |
---|---|
e (jalankan) | Dipicu saat prosesor mengambil instruksi dari alamat yang ditentukan. |
r (baca/tulis) | Dipicu ketika prosesor membaca atau menulis memori pada alamat yang ditentukan. |
w (tulis) | Dipicu ketika prosesor menulis memori pada alamat yang ditentukan. |
i (i/o) | Dipicu saat port I/O di Alamat yang ditentukan diakses. |
Setiap titik henti prosesor memiliki ukuran yang terkait dengannya. Misalnya, titik henti prosesor w (tulis) dapat diatur di alamat 0x70001008 dengan ukuran empat byte. Ini akan memantau blok alamat dari 0x70001008 ke 0x7000100B, inklusif. Jika blok memori ini ditulis, titik henti akan dipicu.
Dapat terjadi bahwa prosesor melakukan operasi pada wilayah memori yang tumpang tindih, tetapi tidak identik dengan, wilayah yang ditentukan. Dalam contoh yang diberikan dalam paragraf sebelumnya, operasi tulis tunggal yang mencakup rentang 0x70001000 ke 0x7000100F, atau operasi tulis yang hanya mencakup byte pada 0x70001009, akan menjadi operasi yang tumpang tindih. Dalam situasi seperti itu, apakah titik henti yang dipicu bergantung pada prosesor. Untuk detail tentang bagaimana situasi ini ditangani pada prosesor tertentu, lihat manual arsitektur prosesor dan cari "debug register" atau "debug control register". Untuk mengambil satu jenis prosesor tertentu sebagai contoh, pada prosesor x86, titik henti baca atau tulis dipicu setiap kali rentang yang diakses tumpang tindih dengan rentang titik henti.
Demikian pula, jika titik henti e (execute) diatur pada alamat 0x00401003, dan kemudian instruksi dua byte yang mencakup alamat 0x00401002 dan 0x00401003 dijalankan, hasilnya tergantung prosesor. Sekali lagi, lihat panduan arsitektur prosesor untuk detailnya.
Prosesor membedakan antara titik henti yang ditetapkan oleh debugger mode pengguna dan titik henti yang diatur oleh debugger mode kernel. Titik henti prosesor mode pengguna tidak memengaruhi proses mode kernel apa pun. Titik henti prosesor mode kernel mungkin atau mungkin tidak memengaruhi proses mode pengguna, tergantung pada apakah kode mode pengguna menggunakan status register debug dan apakah ada debugger mode pengguna yang terpasang.
Untuk menerapkan titik henti data proses saat ini ke konteks register yang berbeda, gunakan perintah .apply_dbp (Terapkan Titik Henti Data ke Konteks).
Pada komputer multiprosesor, setiap titik henti prosesor berlaku untuk semua prosesor. Misalnya, jika prosesor saat ini adalah 3 dan Anda menggunakan perintah ba e1 MyAddress
untuk menempatkan titik henti di MyAddress, prosesor apa pun -- tidak hanya prosesor 3 -- yang dijalankan di alamat tersebut memicu titik henti. Ini juga berlaku untuk titik henti perangkat lunak.
Titik Henti Perangkat Lunak
Titik henti perangkat lunak, tidak seperti titik henti prosesor, dikendalikan oleh debugger. Ketika debugger mengatur titik henti perangkat lunak di beberapa lokasi, debugger untuk sementara menggantikan konten lokasi memori tersebut dengan instruksi pemutusan. Debugger mengingat konten asli lokasi ini, sehingga jika memori ini ditampilkan dalam debugger, debugger akan menampilkan konten asli lokasi memori tersebut, bukan instruksi break. Ketika proses target menjalankan kode di lokasi ini, instruksi pemutusan menyebabkan proses masuk ke debugger. Setelah Anda melakukan tindakan apa pun yang Anda pilih, Anda dapat menyebabkan target melanjutkan eksekusi, dan eksekusi akan dilanjutkan dengan instruksi yang awalnya ada di lokasi tersebut.
Ketersediaan Jenis Titik Henti Prosesor
Opsi i (i/o) hanya tersedia selama penelusuran kesalahan mode kernel.
Tidak semua ukuran data dapat digunakan dengan semua jenis titik henti prosesor. Ukuran yang diizinkan tergantung pada prosesor komputer target. Untuk detailnya, lihat ba (Break on Access).
Batasan Titik Henti Perangkat Lunak dan Titik Henti Prosesor
Dimungkinkan untuk menentukan alamat data daripada alamat program saat menggunakan perintah bp atau bm /a. Namun, bahkan jika lokasi data ditentukan, perintah ini membuat titik henti perangkat lunak, bukan titik henti prosesor. Ketika debugger menempatkan titik henti perangkat lunak di beberapa lokasi, debugger untuk sementara menggantikan konten lokasi memori tersebut dengan instruksi istirahat. Ini tidak merusak gambar yang dapat dieksekusi, karena debugger mengingat konten asli lokasi ini, dan ketika proses target mencoba menjalankan kode ini, debugger dapat merespons dengan tepat. Tetapi ketika titik henti perangkat lunak diatur di lokasi data, timpa yang dihasilkan dapat menyebabkan kerusakan data. Oleh karena itu, mengatur titik henti perangkat lunak pada lokasi data aman hanya jika Anda yakin bahwa lokasi ini hanya akan digunakan sebagai kode yang dapat dieksekusi.
Perintah bp, bu, dan bm mengatur titik henti perangkat lunak dengan mengganti instruksi prosesor dengan instruksi istirahat. Oleh karena itu, ini tidak dapat digunakan dalam kode baca-saja atau kode lain yang tidak dapat ditimpa. Untuk mengatur titik henti dalam kode tersebut, Anda harus menggunakan ba (Break on Access) dengan opsi e (execute).
Anda tidak dapat membuat beberapa titik henti prosesor pada alamat yang sama yang hanya berbeda dalam perintah yang dijalankan secara otomatis saat titik henti dipicu. Namun, Anda dapat membuat beberapa titik henti pada alamat yang sama yang berbeda dalam batasan mereka yang lain (misalnya, Anda dapat membuat beberapa titik henti di alamat yang sama dengan menggunakan perintah ba dengan nilai opsi /p, /t, /c, dan /C yang berbeda).
Titik henti awal dalam proses mode pengguna (biasanya diatur pada fungsi utama atau yang setara) tidak dapat menjadi titik henti prosesor.
Jumlah titik henti prosesor yang didukung tergantung pada arsitektur prosesor target.
Mengontrol Titik Henti Perangkat Lunak dan Titik Henti Prosesor
Titik henti perangkat lunak dapat dibuat dengan perintah bp (Set Breakpoint), bm (Set Symbol Breakpoint), dan bu (Set Unresolved Breakpoint). Titik henti prosesor dapat dibuat dengan perintah ba (Break on Access). Perintah yang menonaktifkan, mengaktifkan, dan memodifikasi titik henti berlaku untuk semua jenis titik henti. Perintah yang menampilkan daftar titik henti mencakup semua titik henti, dan menunjukkan jenis masing-masing titik henti. Untuk daftar perintah ini, lihat Metode Mengontrol Titik Henti.
Kotak dialog Titik Henti WinDbg menampilkan semua titik henti, menunjukkan titik henti prosesor dengan notasi "e", "r", "w", atau "i' diikuti dengan ukuran blok. Kotak dialog ini dapat digunakan untuk mengubah titik henti apa pun. Kotak teks Perintah pada kotak dialog ini dapat digunakan untuk membuat semua jenis titik henti. Jika titik henti prosesor diinginkan, mulai input dengan "ba". Ketika Anda mengatur titik henti dengan menggunakan mouse di jendela WinDbg Disassembly atau jendela Sumber, debugger membuat titik henti perangkat lunak yang tidak terselesaikan.
Titik henti prosesor disimpan dalam daftar debug prosesor. Dimungkinkan untuk mengatur titik henti dengan mengedit nilai register debug secara manual, tetapi ini sangat tidak dianjurkan.