perintah break
Membuat breakpoint pada baris, alamat atau fungsi yang ditentukan.
Sintaks
b
break [Nama Fungsi]
break [Nama Berkas]:[Nomor Baris]
break [Nomor Baris]
break *[Alamat]
break [...] if [Kondisi]
break [...] thread [Thread-id]
b [...]
Parameter
- Nama Fungsi
- Jika ditentukan, perintah break akan menetapkan breakpoint di awal fungsi yang ditentukan.
- Nama Berkas
- Jika ditentukan bersama dengan nomor baris, perintah break akan menetapkan breakpoint pada baris yang diberikan di dalam berkas. Jika baris yang ditentukan tidak mengandung kode yang dapat dieksekusi, breakpoint akan ditetapkan pada baris pertama di bawahnya yang memiliki kode yang dapat dieksekusi.
- Nomor Baris
- Jika ditentukan, perintah break akan menetapkan breakpoint pada lokasi yang diberikan di dalam berkas yang ditentukan. Jika tidak ada berkas yang ditentukan, berkas sumber saat ini akan digunakan.
- Alamat
- Jika ditentukan, perintah break akan menetapkan breakpoint pada alamat yang diberikan. Alamat tersebut harus berupa ekspresi C/C++ yang valid (misalnya angka heksadesimal yang dimulai dengan 0x).
- Kondisi
- Menentukan ekspresi C/C++ opsional yang akan dievaluasi setiap kali breakpoint terkena. Jika hasil evaluasi adalah 0, breakpoint akan dilewati.
- Thread-Id
- Menentukan ID thread tingkat GDB opsional yang akan dikaitkan dengan breakpoint ini. Jika diberikan, breakpoint hanya akan dipicu dalam thread yang diberikan. Jika tidak diberikan, breakpoint akan dipicu ketika thread mana pun mencapai lokasi yang ditentukan.
Perhatian
Jangan bingung antara bentuk [Nama Fungsi] dan [Alamat] dari perintah break. Misalnya, jika Anda mencoba menetapkan breakpoint pada alamat 0x40138c, perintah berikut akan gagal:
(gdb)break 0x40138c
Ini terjadi karena GDB akan menginterpretasikan 0x40138c sebagai nama fungsi daripada alamat. Sintaks yang benar untuk menetapkan breakpoint pada alamat 0x40138c adalah:
(gdb)break *0x40138c
Breakpoint Tertunda
Jika Anda mencoba menetapkan breakpoint dalam kode di dalam pustaka bersama (DLL) yang belum dimuat, GDB akan menampilkan peringatan berikut:
Make breakpoint pending on future shared library load? (y or [n])
Dalam kebanyakan kasus menjawab 'y' akan membuat breakpoint tertunda yang akan diselesaikan ketika pustaka bersama (DLL) yang bersangkutan dimuat di masa mendatang. Namun, ini mungkin tidak berhasil dalam salah satu kasus berikut:
- Pustaka bersama tidak mengandung simbol debugging (misalnya simbol telah dihapus dengan perintah 'strip').
- GDB tidak dapat mendeteksi saat pustaka dimuat (misalnya saat menggunakan gdb 6.x di Android)
- Anda telah membuat kesalahan dalam nama berkas atau nama fungsi. Perhatikan bahwa nama berkas di Linux bersifat case-sensitive.
Jika Anda mengalami masalah breakpoint, perintah berikut mungkin berguna untuk diagnosa lebih lanjut:
- info sharedlibrary memberikan informasi tentang pustaka bersama (DLL) yang saat ini dimuat.
- info sources memberikan informasi tentang berkas sumber yang dikenali oleh GDB.
- info breakpoints memberikan informasi terperinci tentang breakpoint yang dibuat dan statusnya.
Contoh
Menentukan lokasi
Dalam contoh ini kita akan menetapkan breakpoint di awal fungsi main() menggunakan 4 variasi sintaks yang berbeda:
Menggunakan nama fungsi:
(gdb) b main Breakpoint 1 at 0x401395: file 0.cpp, line 4. (gdb)
Menggunakan alamat fungsi:
(gdb) info address main Symbol "main(int, char**)" is a function at address 0x40138c. (gdb) break *0x40138c Breakpoint 2 at 0x40138c: file 0.cpp, line 4. (gdb)
Menggunakan nama berkas dan nomor baris:
(gdb) info line main Line 4 of "0.cpp" starts at address 0x40138cand ends at 0x401395 . (gdb) break 0.cpp:4 Breakpoint 3 at 0x401395: file 0.cpp, line 4.
Menggunakan nomor baris saja:
(gdb) info source Current source file is 0.cpp Compilation directory is C:\MinGW\bin Located in c:\mingw\bin\0.cpp Source language is c++. Compiled with DWARF 2 debugging format. Does not include preprocessor macro info. (gdb) break 4 Breakpoint 4 at 0x40138c: file 0.cpp, line 4.
Breakpoint Kondisional
Dalam contoh ini kita akan menetapkan breakpoint kondisional dalam program berikut:
#include <stdio.h> void func(int arg) { printf("Iterasi %d\n", arg); } int main(int argc, char *argv[]) { for(int i = 0; i < 5; i++) func(i); return 0; }
Breakpoint akan ditetapkan di dalam fungsi func() dan hanya akan dipicu ketika arg sama dengan 3:
(gdb) break func if arg == 3 Breakpoint 1 at 0x4013b6: file 0.cpp, line 5. (gdb) run Starting program: C:\MinGW\bin\0.exe [New Thread 7860.0x25c0] Iterasi 0 Iterasi 1 Iterasi 2 Breakpoint 1, func (arg=3) at 0.cpp:5 5 printf("Iterasi %d\n", arg);