ba (Putuskan Akses)
Perintah ba menetapkan titik henti prosesor (sering disebut, kurang akurat, titik henti data). Titik henti ini dipicu ketika memori yang ditentukan diakses.
Mode Pengguna
[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
Mode Kernel
ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
Parameter
Benang
Menentukan utas tempat titik henti diterapkan. Untuk informasi selengkapnya tentang sintaksis, lihat Sintaks utas. Anda hanya dapat menentukan utas dalam mode pengguna.
ID
Menentukan angka opsional yang mengidentifikasi titik henti. Jika Anda tidak menentukan ID, nomor titik henti pertama yang tersedia akan digunakan. Anda tidak dapat menambahkan spasi antara ba dan nomor ID. Setiap prosesor hanya mendukung sejumlah titik henti prosesor terbatas, tetapi tidak ada batasan pada nilai nomor ID . Jika Anda mengapit ID dalam tanda kurung siku ([]), ID dapat menyertakan ekspresi apa pun. Untuk informasi selengkapnya tentang sintaks, lihat Sintaks Ekspresi Numerik.
Akses
Menentukan jenis akses yang memenuhi titik henti. Parameter ini bisa menjadi salah satu nilai berikut.
Opsi | Perbuatan |
---|---|
e (jalankan) |
Memecah ke debugger saat CPU mengambil instruksi dari alamat yang ditentukan. |
r (baca/tulis) |
Memecah ke debugger saat CPU membaca atau menulis di alamat yang ditentukan. |
w (tulis) |
Masuk ke debugger saat CPU menulis di alamat yang ditentukan. |
i (i/o) |
(Hanya mode kernel, hanya sistem berbasis x86) Masuk ke debugger saat port I/O di Alamat yang ditentukan diakses. |
Tingginya
Menentukan ukuran lokasi, dalam byte, untuk memantau akses. Pada prosesor berbasis x86, parameter ini bisa 1, 2, atau 4. Namun, jika Akses sama dengan e, Ukuran harus 1.
Pada prosesor berbasis x64, parameter ini bisa 1, 2, 4, atau 8. Namun, jika Akses sama dengan e, Ukuran harus 1.
Opsi Menentukan opsi titik henti. Anda dapat menggunakan sejumlah opsi berikut, kecuali seperti yang ditunjukkan:
/1
Membuat titik henti "satu bidikan". Setelah titik henti ini dipicu, titik henti dihapus secara permanen dari daftar titik henti.
/p EProcess
(Mode kernel saja) Menentukan proses yang terkait dengan titik henti ini. EProcess harus menjadi alamat aktual struktur EPROCESS, bukan PID. Titik henti dipicu hanya jika ditemui dalam konteks proses ini.
/t EThread
(Mode kernel saja) Menentukan utas yang terkait dengan titik henti ini. EThread harus menjadi alamat aktual struktur ETHREAD, bukan ID utas. Titik henti dipicu hanya jika ditemui dalam konteks utas ini. Jika Anda menggunakan /p EProcess dan /t EThread , Anda dapat memasukkannya dalam salah satu urutan.
/c MaxCallStackDepth
Menyebabkan titik henti hanya aktif ketika kedalaman tumpukan panggilan kurang dari MaxCallStackDepth. Anda tidak dapat menggabungkan opsi ini bersama dengan /C.
/C MinCallStackDepth
Menyebabkan titik henti hanya aktif ketika kedalaman tumpukan panggilan lebih besar dari MinCallStackDepth. Anda tidak dapat menggabungkan opsi ini bersama dengan /c.
Ekspresi objek /w dx Mengatur titik henti bersyarat berdasarkan nilai boolean yang dikembalikan oleh ekspresi objek dx. Argumen adalah ekspresi model data (dx) yang mengevaluasi ke true (kondisi kecocokan – jeda) atau salah (tidak cocok dengan kondisi – jangan putus).
Contoh ini menetapkan titik henti kondisional berdasarkan nilai globalVariable. Ini memungkinkan titik henti akses, misalnya, untuk memeriksa nilai yang ditulis saat menentukan apakah debugger harus masuk.
ba w 4 /w "mymodule!globalVariable == 4" mymodule!globalVariable
Contoh ini menunjukkan cara mengatur titik henti menggunakan JavaScript.
ba w 4 /w "@$scriptContents.myFunc(mymodule!globalVariable)" mymodule!globalVariable
Untuk informasi selengkapnya tentang objek debugger, lihat dx (Ekspresi Model Objek Debugger Tampilan).
Untuk informasi selengkapnya tentang titik henti bersyarah, lihat Mengatur Titik Henti Bersyar.
Alamat
Menentukan alamat yang valid. Jika aplikasi mengakses memori di alamat ini, debugger menghentikan eksekusi dan menampilkan nilai saat ini dari semua register dan bendera. Alamat ini harus berupa offset dan cocok diselaraskan agar sesuai dengan parameter Ukuran . (Misalnya, jika Ukurannya adalah 4, Alamat harus kelipatan 4.) Jika Anda menghilangkan Alamat, penunjuk instruksi saat ini digunakan. Untuk informasi selengkapnya tentang sintaks, lihat Sintaks Alamat dan Rentang Alamat.
Penjual tiket
Menentukan berapa kali titik henti diteruskan hingga titik henti diaktifkan. Angka ini dapat berupa nilai 16-bit apa pun. Berapa kali penghitung program melewati titik ini tanpa melanggar adalah satu kurang dari nilai angka ini. Oleh karena itu, menghilangkan angka ini sama dengan mengaturnya sama dengan 1. Perhatikan juga bahwa angka ini hanya menghitung waktu yang dijalankan aplikasi melewati titik ini. Langkah atau pelacakan melewati titik ini tidak dihitung. Setelah jumlah penuh tercapai, Anda hanya dapat mengatur ulang nomor ini dengan menghapus dan mengatur ulang titik henti.
CommandString
Menentukan daftar perintah yang akan dijalankan setiap kali titik henti ditemui jumlah waktu yang ditentukan. Perintah ini dijalankan hanya jika titik henti tertembak setelah Anda mengeluarkan perintah g (Go), alih-alih setelah perintah t (Trace) atau p (Step). Perintah debugger di CommandString dapat menyertakan parameter.
Anda harus mengapit string perintah ini dalam tanda kutip, dan Anda harus memisahkan beberapa perintah dengan titik koma. Anda dapat menggunakan karakter kontrol C standar (seperti \n dan \"). Titik koma yang terkandung dalam tanda kutip tingkat kedua (\") ditafsirkan sebagai bagian dari string yang dikutip yang disematkan.
Parameter ini bersifat opsional.
Lingkungan
Item | Deskripsi |
---|---|
Mode | mode pengguna, mode kernel |
Target | penelusuran kesalahan langsung saja |
Platform | all |
Informasi Tambahan
Untuk informasi selengkapnya tentang titik henti prosesor, lihat Titik Henti Prosesor (ba Breakpoints). Untuk informasi selengkapnya tentang dan contoh penggunaan titik henti, perintah titik henti dan metode lain untuk mengontrol titik henti, dan informasi tentang cara mengatur titik henti di ruang pengguna dari debugger kernel, lihat Menggunakan Titik Henti. Untuk informasi selengkapnya tentang titik henti bersyarah, lihat Mengatur Titik Henti Bersyar.
Keterangan
Debugger menggunakan nomor ID untuk merujuk ke titik henti di perintah bc (Breakpoint Clear), bd (Breakpoint Disable), dan menjadi (Breakpoint Enable).
Gunakan perintah bl (Daftar Titik Henti) untuk mencantumkan semua titik henti yang ada, nomor ID mereka, dan statusnya.
Gunakan perintah .bpcmds (Tampilkan Perintah Titik Henti) untuk mencantumkan semua titik henti yang ada, nomor ID mereka, dan perintah yang digunakan untuk membuatnya.
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 ini, operasi penulisan 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. Anda harus berkonsultasi dengan manual prosesor untuk detail tertentu. Untuk mengambil satu instans tertentu, 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.)
Anda tidak dapat membuat beberapa titik henti prosesor pada alamat yang sama yang hanya berbeda dalam nilai CommandString mereka. Namun, Anda dapat membuat beberapa titik henti di alamat yang sama yang memiliki batasan yang berbeda (misalnya, nilai yang berbeda dari opsi /p, /t, /c, dan /C ).
Untuk detail selengkapnya tentang titik henti prosesor, dan batasan tambahan yang berlaku untuk mereka, lihat Titik Henti Prosesor (ba Titik Henti).
Contoh berikut menunjukkan perintah ba . Perintah berikut mengatur titik henti untuk akses baca pada 4 byte variabel myVar.
0:000> ba r4 myVar
Perintah berikut menambahkan titik henti pada semua port serial dengan alamat dari 0x3F8 hingga 0x3FB. Titik henti ini dipicu jika ada yang dibaca atau ditulis ke port ini.
kd> ba i4 3f8