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.

c
/* 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;
}
bash
gcc -g -O0 -std=c11 -Wall -Wextra /tmp/test_bp1.c -o /tmp/test_bp1
/tmp/test_bp1

Output yang Dihasilkan:

text
total 1..5 = 15

Breakpoint berdasarkan Fungsi #

Cara paling cepat memasang breakpoint adalah dengan menyebut nama fungsi. gdb akan berhenti pada baris pertama fungsi tersebut setelah dipanggil.

bash
gdb --batch \
    -ex 'break hitung_total' \
    -ex 'run' \
    -ex 'info args' \
    -ex 'continue' \
    /tmp/test_bp1

Output yang Dihasilkan (format resmi gdb):

text
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:

  1. Breakpoint 1 at 0x...: file ... line 3.: gdb menetapkan nomor breakpoint 1 pada alamat instruksi pertama di hitung_total (baris 3). Nomor ini dipakai di seluruh sesi untuk referensi.
  2. hitung_total (n=5) at /tmp/test_bp1.c:3: program berhenti tepat sebelum baris int total = 0; dieksekusi. gdb menampilkan nilai argumen n=5 yang sudah diterima fungsi.
  3. n = 5: hasil perintah info args menampilkan seluruh argumen fungsi beserta nilainya pada titik berhenti. Hal ini berguna untuk memverifikasi pemanggilan fungsi dengan parameter yang benar.
  4. total 1..5 = 15: setelah continue, loop berjalan sampai selesai dan main mencetak 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).

bash
gdb --batch \
    -ex 'break /tmp/test_bp1.c:6' \
    -ex 'run' \
    -ex 'info locals' \
    -ex 'continue' \
    /tmp/test_bp1

Output yang Dihasilkan (format resmi gdb):

text
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>.

bash
gdb --batch \
    -ex 'break /tmp/test_bp1.c:5 if i == 3' \
    -ex 'run' \
    -ex 'print total' \
    -ex 'print i' \
    -ex 'continue' \
    /tmp/test_bp1

Output yang Dihasilkan (format resmi gdb):

text
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:

  1. break /tmp/test_bp1.c:5 if i == 3: gdb memasang breakpoint pada baris 5 tetapi hanya akan berhenti saat i == 3. Iterasi i == 1, i == 2 dilewati tanpa henti.
  2. $1 = 3: variabel history $1 menyimpan hasil print total (nilai 3 karena 1+2 sebelumnya). Pada iterasi berikutnya i == 3, total belum ditambah 3—breakpoint berhenti sebelum eksekusi baris total += i;.
  3. $2 = 3: variabel history $2 menyimpan hasil print i. Iterasi yang berhenti tepat adalah i == 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.

bash
gdb --batch \
    -ex 'tbreak hitung_total' \
    -ex 'run' \
    -ex 'continue' \
    /tmp/test_bp1

Output yang Dihasilkan (format resmi gdb):

text
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:

PerintahFungsi
info breakpointstampilkan semua breakpoint aktif
delete Nhapus breakpoint nomor N
deletehapus semua breakpoint
disable Nnonaktifkan breakpoint nomor N tanpa menghapus
enable Naktifkan kembali breakpoint yang didisable
enable once Naktifkan sekali, lalu disable otomatis
ignore N countlewati count kali hit sebelum berhenti