Breakpoint adalah penanda yang memerintahkan gdb menghentikan eksekusi program pada titik tertentu sebelum melanjutkan ke baris berikutnya. Tanpa breakpoint, kita hanya bisa menjalankan program sampai selesai atau crash—tidak ada kesempatan menginspeksi nilai variabel pada saat tertentu. Pada chapter ini kita akan mempelajari empat jenis breakpoint: breakpoint fungsi (break main), breakpoint baris (break file.c:42), breakpoint kondisional (break loop if i == 10), dan breakpoint sementara (tbreak). Kode sumber contoh dan output gdb pada chapter ini mengikuti format yang didokumentasikan di sourceware.org/gdb/current/onlinedocs/gdb/Breakpoints.html.
Program Contoh #
Kita akan memakai program sederhana berikut untuk demonstrasi berbagai jenis breakpoint. Program menghitung jumlah deret 1 sampai n dengan fungsi hitung_total yang berisi loop.
/* File: /tmp/test_bp1.c */
#include <stdio.h>
static int hitung_total(int n) {
int total = 0;
for (int i = 1; i <= n; i++) {
total += i;
}
return total;
}
int main(void) {
int nilai = 5;
int hasil = hitung_total(nilai);
printf("total 1..%d = %d\n", nilai, hasil);
return 0;
}gcc -g -O0 -std=c11 -Wall -Wextra /tmp/test_bp1.c -o /tmp/test_bp1
/tmp/test_bp1Output yang Dihasilkan:
total 1..5 = 15Breakpoint berdasarkan Fungsi #
Cara paling cepat memasang breakpoint adalah dengan menyebut nama fungsi. gdb akan berhenti pada baris pertama fungsi tersebut setelah dipanggil.
gdb --batch \
-ex 'break hitung_total' \
-ex 'run' \
-ex 'info args' \
-ex 'continue' \
/tmp/test_bp1Output yang Dihasilkan (format resmi gdb):
Breakpoint 1 at 0x...: file /tmp/test_bp1.c, line 3.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, hitung_total (n=5) at /tmp/test_bp1.c:3
3 int total = 0;
n = 5
total 1..5 = 15
[Inferior 1 (process ...) exited normally]Mari kita bedah elemen kunci pada output gdb di atas:
Breakpoint 1 at 0x...: file ... line 3.: gdb menetapkan nomor breakpoint1pada alamat instruksi pertama dihitung_total(baris 3). Nomor ini dipakai di seluruh sesi untuk referensi.hitung_total (n=5) at /tmp/test_bp1.c:3: program berhenti tepat sebelum barisint total = 0;dieksekusi. gdb menampilkan nilai argumenn=5yang sudah diterima fungsi.n = 5: hasil perintahinfo argsmenampilkan seluruh argumen fungsi beserta nilainya pada titik berhenti. Hal ini berguna untuk memverifikasi pemanggilan fungsi dengan parameter yang benar.total 1..5 = 15: setelahcontinue, loop berjalan sampai selesai danmainmencetak hasil. Program keluar normal.
Breakpoint berdasarkan Nomor Baris #
Kadang kita ingin berhenti pada baris tertentu di dalam file, bukan pada awal fungsi. Sintaks break file.c:42 memasang breakpoint pada baris ke-42 di file.c. Kita bisa memakai nomor baris saja bila file sudah dikenal gdb (file utama yang dikompilasi).
gdb --batch \
-ex 'break /tmp/test_bp1.c:6' \
-ex 'run' \
-ex 'info locals' \
-ex 'continue' \
/tmp/test_bp1Output yang Dihasilkan (format resmi gdb):
Breakpoint 1 at 0x...: file /tmp/test_bp1.c, line 6.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, hitung_total (n=5) at /tmp/test_bp1.c:6
6 return total;
total = 15
i = 5
total 1..5 = 15
[Inferior 1 (process ...) exited normally]Perintah info locals pada titik berhenti return total menampilkan total = 15 (hasil akumulasi) dan i = 5 (nilai akhir counter loop setelah increment terakhir). Breakpoint berbasis baris sangat berguna ketika kita ingin memeriksa state tepat sebelum return dieksekusi.
Breakpoint Kondisional #
Breakpoint kondisional hanya berhenti bila kondisi boolean tertentu terpenuhi. Tanpa kondisi, breakpoint di dalam loop akan berhenti pada setiap iterasi—sangat tidak praktis bila loop berjalan ribuan kali. Sintaksnya adalah break <lokasi> if <kondisi>.
gdb --batch \
-ex 'break /tmp/test_bp1.c:5 if i == 3' \
-ex 'run' \
-ex 'print total' \
-ex 'print i' \
-ex 'continue' \
/tmp/test_bp1Output yang Dihasilkan (format resmi gdb):
Breakpoint 1 at 0x...: file /tmp/test_bp1.c, line 5.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, hitung_total (n=5) at /tmp/test_bp1.c:5
5 total += i;
$1 = 3
$2 = 3
total 1..5 = 15
[Inferior 1 (process ...) exited normally]Mari kita telaah output breakpoint kondisional di atas:
break /tmp/test_bp1.c:5 if i == 3: gdb memasang breakpoint pada baris 5 tetapi hanya akan berhenti saati == 3. Iterasii == 1,i == 2dilewati tanpa henti.$1 = 3: variabel history$1menyimpan hasilprint total(nilai3karena1+2sebelumnya). Pada iterasi berikutnyai == 3,totalbelum ditambah3—breakpoint berhenti sebelum eksekusi baristotal += i;.$2 = 3: variabel history$2menyimpan hasilprint i. Iterasi yang berhenti tepat adalahi == 3, sesuai kondisi yang kita pasang.
Temporary Breakpoint dengan tbreak #
tbreak (temporary break) adalah breakpoint yang otomatis dihapus setelah berhenti sekali. Perintah ini berguna ketika kita ingin berhenti pada satu titik sekali saja—misalnya saat fungsi pertama kali dipanggil—tetapi tidak ingin setiap pemanggilan berikutnya ikut berhenti.
gdb --batch \
-ex 'tbreak hitung_total' \
-ex 'run' \
-ex 'continue' \
/tmp/test_bp1Output yang Dihasilkan (format resmi gdb):
Temporary breakpoint 1 at 0x...: file /tmp/test_bp1.c, line 3.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Temporary breakpoint 1, hitung_total (n=5) at /tmp/test_bp1.c:3
3 int total = 0;
total 1..5 = 15
[Inferior 1 (process ...) exited normally]Kata Temporary pada baris Temporary breakpoint 1 menandakan breakpoint akan hilang setelah berhenti pertama. Perintah info breakpoints setelah berhenti akan menampilkan no breakpoints bila kita memanggilnya di sesi interaktif.
Manajemen Breakpoint #
gdb menyimpan daftar breakpoint bernomor (1, 2, …) yang bisa dikelola lewat beberapa perintah. Tabel berikut merangkum perintah manajemen paling sering:
| Perintah | Fungsi |
|---|---|
info breakpoints | tampilkan semua breakpoint aktif |
delete N | hapus breakpoint nomor N |
delete | hapus semua breakpoint |
disable N | nonaktifkan breakpoint nomor N tanpa menghapus |
enable N | aktifkan kembali breakpoint yang didisable |
enable once N | aktifkan sekali, lalu disable otomatis |
ignore N count | lewati count kali hit sebelum berhenti |