bp, bu, bm (Atur Titik Henti)

Perintah bp, bu, dan bm menetapkan satu atau beberapa titik henti perangkat lunak. Anda dapat menggabungkan lokasi, kondisi, dan opsi untuk mengatur berbagai jenis titik henti perangkat lunak.

User-Mode

[~Thread] bp[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bu[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bm [Options] SymbolPattern [Passes] ["CommandString"]

Kernel-Mode

bp[ID] [Options] [Address [Passes]] ["CommandString"] 
bu[ID] [Options] [Address [Passes]] ["CommandString"] 
bm [Options] SymbolPattern [Passes] ["CommandString"]

Parameter

Thread
Menentukan utas tempat titik henti diterapkan. Untuk informasi selengkapnya tentang sintaks, lihat Sintaks utas. Anda hanya dapat menentukan utas dalam mode pengguna. Jika Anda tidak menentukan utas, titik henti berlaku untuk semua utas.

ID
Menentukan angka desimal yang mengidentifikasi titik henti.

Debugger menetapkan ID saat membuat titik henti, tetapi Anda dapat mengubahnya dengan menggunakan perintah br (Breakpoint Renumber). Anda dapat menggunakan ID untuk merujuk ke titik henti dalam perintah debugger nanti. Untuk menampilkan ID titik henti, gunakan perintah bl (Daftar Titik Henti).

Saat Anda menggunakan ID dalam perintah, jangan ketik spasi antara perintah (bp atau bu) dan nomor ID.

Parameter ID selalu opsional. Jika Anda tidak menentukan ID, debugger menggunakan nomor titik henti pertama yang tersedia. Dalam mode kernel, Anda hanya dapat mengatur 32 titik henti. Dalam mode pengguna, Anda dapat mengatur sejumlah titik henti. Dalam kedua kasus, 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.

Pilihan Menentukan opsi titik henti. Anda dapat menentukan sejumlah opsi berikut, kecuali seperti yang ditunjukkan:

/1
Membuat titik henti "satu bidikan". Setelah titik henti ini dipicu, titik henti dihapus dari daftar titik henti.

/pEProcess
(Hanya mode kernel) Menentukan proses yang terkait dengan titik henti ini. EProcess harus menjadi alamat aktual dari struktur EPROCESS, bukan PID. Titik henti dipicu hanya jika ditemui dalam konteks proses ini.

/tEThread
(Hanya mode kernel) Menentukan utas yang terkait dengan titik henti ini. EThread harus menjadi alamat aktual dari struktur ETHREAD, bukan ID utas. Titik henti dipicu hanya jika ditemui dalam konteks utas ini. Jika Anda menggunakan /pEProcess dan /tEThread, Anda dapat memasukkannya dalam urutan apa pun.

/cMaxCallStackDepth
Mengaktifkan titik henti hanya ketika kedalaman tumpukan panggilan kurang dari MaxCallStackDepth. Anda tidak dapat menggunakan opsi ini bersama dengan /C.

/CMinCallStackDepth
Mengaktifkan titik henti hanya ketika kedalaman tumpukan panggilan lebih besar dari MinCallStackDepth. Anda tidak dapat menggunakan opsi ini bersama dengan /c.

/J
(Hanya untuk bm ) Mengatur titik henti pada semua lokasi yang ditentukan, apakah mereka berada di ruang data atau ruang kode. Karena titik henti pada data dapat menyebabkan kegagalan program, gunakan opsi ini hanya pada lokasi yang diketahui aman.

/D
(Hanya untuk bm ) Mengonversi lokasi titik henti menjadi alamat. Oleh karena itu, jika kode dipindahkan, titik henti tetap pada alamat yang sama, alih-alih diatur sesuai dengan SymbolPattern. Gunakan /d untuk menghindari mengevaluasi kembali perubahan pada titik henti saat modul dimuat atau dibongkar.

/(
(Hanya untuk bm ) Menyertakan informasi daftar parameter dalam string simbol yang ditentukan SymbolString .

Fitur ini memungkinkan Anda mengatur titik henti pada fungsi kelebihan beban yang memiliki nama yang sama tetapi daftar parameter yang berbeda. Misalnya, bm /( myFunc mengatur titik henti pada myFunc(int a) dan myFunc(char a). Tanpa "/(", titik henti yang diatur pada myFunc gagal karena tidak menunjukkan fungsi myFunc mana yang dimaksudkan untuk titik henti.

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 – putus) atau salah (tidak cocok dengan kondisi – jangan putus).

Contoh ini menetapkan titik henti kondisional berdasarkan nilai localVariable.

bp /w "localVariable == 4" mymodule!myfunction

Contoh ini menunjukkan cara mengatur titik henti menggunakan JavaScript.

bp /w "@$scriptContents.myFunc(localVariable)" @rip

Untuk informasi selengkapnya tentang objek debugger, lihat dx (Tampilkan Ekspresi Model Objek Debugger).

Untuk informasi selengkapnya tentang titik henti kondisi, lihat Mengatur Titik Henti Kondisi.

Alamat
Menentukan byte pertama dari instruksi tempat titik henti diatur. Jika Anda menghilangkan Alamat, penunjuk instruksi saat ini digunakan. Untuk informasi selengkapnya tentang sintaks, lihat Sintaks Alamat dan Rentang Alamat.

Penjual tiket
Menentukan jumlah pass eksekusi tempat titik henti diaktifkan. Debugger melompati lokasi titik henti hingga mencapai pass yang ditentukan. Nilai Pass dapat berupa nilai 16-bit atau 32-bit.

Secara default, titik henti aktif pertama kali aplikasi menjalankan kode yang berisi lokasi titik henti. Situasi default ini setara dengan nilai 1 untuk Passes. Untuk mengaktifkan titik henti hanya setelah aplikasi menjalankan kode setidaknya satu kali, masukkan nilai 2 atau lebih. Misalnya, nilai 2 mengaktifkan titik henti untuk kedua kalinya kode dijalankan.

Parameter ini membuat penghitung yang diturunkan pada setiap melewati kode. Untuk melihat nilai awal dan saat ini dari penghitung Passes , gunakan bl (Breakpoint List).

Penghitung Passes dikurangi hanya ketika aplikasi dijalankan melewati titik henti sebagai respons terhadap perintah g (Go). Penghitung tidak berkurang jika Anda melangkah melalui kode atau melacak melewatinya. Saat penghitung Pass mencapai 1, Anda hanya dapat mengatur ulang dengan menghapus dan mengatur ulang titik henti.

CommandString
Menentukan daftar perintah yang dijalankan setiap kali titik henti ditemui beberapa kali. Anda harus mengapit parameter CommandString dalam tanda kutip. Gunakan titik koma untuk memisahkan beberapa perintah.

Perintah debugger di CommandString dapat menyertakan parameter. Anda dapat menggunakan karakter kontrol C standar (seperti \n dan \"). Titik koma yang terkandung dalam tanda kutip tingkat kedua (\") ditafsirkan sebagai bagian dari string kutipan yang disematkan.

Perintah CommandString dijalankan hanya jika titik henti tercapai saat aplikasi dijalankan sebagai respons terhadap perintah g (Go). Perintah tidak dijalankan jika Anda melangkah melalui kode atau melacak melewati titik ini.

Perintah apa pun yang melanjutkan eksekusi program setelah titik henti (seperti g atau t) mengakhiri eksekusi daftar perintah.

SymbolPattern
Menentukan pola. Debugger mencoba mencocokkan pola ini dengan simbol yang ada dan mengatur titik henti pada semua kecocokan pola. SymbolPattern dapat berisi berbagai karakter kartubebas dan penentu. Untuk informasi selengkapnya tentang sintaks ini, lihat Sintaks Wildcard String. Karena karakter ini dicocokkan dengan simbol, kecocokan tidak peka huruf besar/kecil, dan satu garis bawah terkemuka (_) mewakili kuantitas garis bawah di depan.

Lingkungan

Item Deskripsi
Mode mode pengguna, mode kernel
Target penelusuran kesalahan langsung saja
Platform semua

Informasi Tambahan

Untuk informasi selengkapnya tentang dan contoh cara menggunakan titik henti, perintah titik henti lainnya dan metode mengontrol titik henti, dan cara mengatur titik henti di ruang pengguna dari debugger kernel, lihat Menggunakan Breakpoint. Untuk informasi selengkapnya tentang titik henti bersyarah, lihat Mengatur Titik Henti Bersyarah.

Keterangan

Perintah bp, bu, dan bm menetapkan titik henti baru, tetapi memiliki karakteristik yang berbeda:

  • Perintah bp (Set Breakpoint) menetapkan titik henti baru di alamat lokasi titik henti yang ditentukan dalam perintah. Jika debugger tidak dapat mengatasi ekspresi alamat lokasi titik henti saat titik henti diatur, titik henti bp secara otomatis dikonversi ke titik henti bu . Gunakan perintah bp untuk membuat titik henti yang tidak lagi aktif jika modul dibongkar.

  • Perintah bu (Set Unresolved Breakpoint) menetapkan titik henti yang ditangguhkan atau tidak terselesaikan . Titik henti bu diatur pada referensi simbolis ke lokasi titik henti yang ditentukan dalam perintah (bukan pada alamat) dan diaktifkan setiap kali modul dengan referensi diselesaikan. Untuk informasi selengkapnya tentang titik henti ini, lihat Titik Henti Tidak Terselesaikan (bu Breakpoints).

  • Perintah bm (Set Symbol Breakpoint) mengatur titik henti baru pada simbol yang cocok dengan pola yang ditentukan. Perintah ini dapat membuat lebih dari satu titik henti. Secara default, setelah pola dicocokkan, titik henti bm sama dengan titik henti bu . Artinya, titik henti bm adalah titik henti yang ditangguhkan yang diatur pada referensi simbolis. Namun, perintah bm /d membuat satu atau beberapa titik henti bp . Setiap titik henti diatur pada alamat lokasi yang cocok dan tidak melacak status modul.

Jika Anda tidak yakin perintah apa yang digunakan untuk mengatur titik henti yang ada, gunakan .bpcmds (Tampilkan Perintah Titik Henti) untuk mencantumkan semua titik henti bersama dengan perintah yang digunakan untuk membuatnya.

Ada tiga perbedaan utama antara titik henti bp dan titik henti bu :

  • Lokasi titik henti bp selalu dikonversi ke alamat. Jika perubahan modul memindahkan kode tempat titik henti bp diatur, titik henti tetap berada di alamat yang sama. Di sisi lain, titik henti bu tetap terkait dengan nilai simbolis (biasanya simbol ditambah offset) yang digunakan, dan melacak lokasi simbolis ini bahkan jika alamatnya berubah.

  • Jika alamat titik henti bp ditemukan dalam modul yang dimuat, dan jika modul tersebut nantinya dibongkar, titik henti akan dihapus dari daftar titik henti. Di sisi lain, bu titik henti bertahan setelah bongkar muat dan beban berulang.

  • Titik henti yang Anda tetapkan dengan bp tidak disimpan di ruang kerja WinDbg. Titik henti yang diatur dengan bu disimpan di ruang kerja.

Perintah bm berguna saat Anda ingin menggunakan karakter kartubebas dalam pola simbol untuk titik henti. Sintaks bmSymbolPattern setara dengan menggunakan x SymbolPattern lalu menggunakan bu pada setiap hasil. Misalnya, untuk mengatur titik henti pada semua simbol dalam modul Myprogram yang dimulai dengan string "mem," gunakan perintah berikut.

Contoh

0:000> bm myprogram!mem* 
  4: 0040d070 MyProgram!memcpy
 5: 0040c560 MyProgram!memmove
  6: 00408960 MyProgram!memset

Karena perintah bm mengatur titik henti perangkat lunak (bukan titik henti prosesor), perintah tersebut secara otomatis mengecualikan lokasi data saat mengatur titik henti untuk menghindari kerusakan data.

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. Jika titik henti perangkat lunak ditempatkan dalam data program alih-alih kode yang dapat dieksekusi, itu dapat menyebabkan kerusakan data. Oleh karena itu Anda harus menggunakan perintah ini di lokasi data hanya jika Anda yakin bahwa memori yang disimpan di lokasi tersebut akan digunakan sebagai kode yang dapat dieksekusi dan bukan sebagai data program. Jika tidak, Anda harus menggunakan perintah ba (Break on Access) sebagai gantinya. Untuk detail selengkapnya, lihat Titik Henti Prosesor (ba Breakpoints).

Untuk detail tentang cara mengatur titik henti pada lokasi yang ditentukan oleh sintaks yang lebih rumit, seperti anggota kelas publik C++, atau string teks arbitrer yang berisi karakter yang dibatasi lain, lihat Sintaks Titik Henti.

Jika satu baris sumber logis mencakup beberapa baris fisik, titik henti diatur pada baris fisik terakhir dari pernyataan atau panggilan. Jika debugger tidak dapat mengatur titik henti pada posisi yang diminta, itu menempatkan titik henti di posisi berikutnya yang diizinkan.

Jika Anda menentukan Utas, titik henti diatur pada utas yang ditentukan. Misalnya, perintah ~*bp mengatur titik henti pada semua utas, ~#bp mengatur titik henti pada utas yang menyebabkan pengecualian saat ini, dan ~123bp menetapkan titik henti pada utas 123. Perintah ~bp dan ~.bp keduanya mengatur titik henti pada utas saat ini.

Saat Anda men-debug sistem multiprosesor dalam mode kernel, titik henti yang Anda tetapkan dengan menggunakan bp atau ba (Break on Access) berlaku untuk semua prosesor. Misalnya, jika prosesor saat ini adalah 3 dan Anda mengetik bp MemoryAddress untuk meletakkan titik henti di MemoryAddress. Setiap prosesor yang dijalankan di alamat tersebut (tidak hanya prosesor 3) menyebabkan perangkap titik henti.

Perintah bp, bu, dan bm mengatur titik henti perangkat lunak dengan mengganti instruksi prosesor dengan instruksi istirahat. Untuk men-debug kode baca-saja atau kode yang tidak dapat diubah, gunakan perintah ba e, di mana e mewakili akses eksekusi-saja.

Perintah berikut mengatur titik henti 12 byte melewati awal fungsi MyTest. Titik henti ini diabaikan untuk enam pertama melewati kode, tetapi eksekusi berhenti pada pass ketujuh melalui kode.

0:000> bp MyTest+0xb 7 

Perintah berikut mengatur titik henti di RtlRaiseException, menampilkan register eax , menampilkan nilai simbol MyVar, dan melanjutkan.

kd> bp ntdll!RtlRaiseException "r eax; dt MyVar; g"

Dua perintah bm berikut menetapkan tiga titik henti. Ketika perintah dijalankan, hasil yang ditampilkan tidak membedakan antara titik henti yang dibuat dengan sakelar /d dan yang dibuat tanpanya. .bpcmds (Perintah Titik Henti Tampilan) dapat digunakan untuk membedakan antara kedua jenis ini. Jika titik henti dibuat oleh bm tanpa sakelar /d , tampilan .bpcmds menunjukkan jenis titik henti sebagai bu, diikuti dengan simbol yang dievaluasi yang diapit dalam token @!"" (yang menunjukkan bahwa itu adalah simbol harfiah dan bukan ekspresi numerik atau register). Jika titik henti dibuat oleh bm dengan sakelar /d , tampilan .bpcmds menunjukkan jenis titik henti sebagai bp.

0:000> bm myprog!openf* 
  0: 00421200 @!"myprog!openFile"
  1: 00427800 @!"myprog!openFilter"

0:000> bm /d myprog!closef* 
  2: 00421600 @!"myprog!closeFile"

0:000> .bpcmds
bu0 @!"myprog!openFile";
bu1 @!"myprog!openFilter";
bp2 0x00421600 ;