GDB dapat dikonfigurasi via file .gdbinit yang otomatis dimuat saat sesi dimulai. Konfigurasi yang baik mempermudah debugging—menampilkan struct dengan rapi, mengaktifkan warna, history command, dan shortcut untuk perintah yang sering dipakai. Bab ini menuntun kita membuat .gdbinit global dan per-proyek, memasang pretty printer untuk STL, dan menambahkan command kustom.
1. File .gdbinit Global #
GDB mencari file .gdbinit di beberapa lokasi saat startup:
| Lokasi | Lingkup |
|---|---|
~/.gdbinit | Global, semua sesi GDB user |
./.gdbinit | Per-proyek, hanya direktori saat ini |
~/.config/gdb/gdbinit | Modern XDG base dir (GDB 9+) |
Membuat File .gdbinit Dasar #
Buka terminal dan buat file:
cat > ~/.gdbinit <<'EOF'
# ~/.gdbinit - Konfigurasi global gdb
# Aktifkan warna output
set print pretty on
set print array on
set print array-indexes on
set print elements 200
set print object on
set print static-members on
set print vtbl on
set print sevenbit-strings off
set print union on
set print address on
# History command
set history save on
set history filename ~/.gdb_history
set history size 10000
# Pagination off
set pagination off
# Prompt dengan warna
set prompt \033[36m(gdb)\033[0m
# Saat SIGPIPE terjadi, jangan terminate program (untuk debug network)
handle SIGPIPE nostop noprint pass
# Pretty printer GCC STL (jika tersedia)
python
import sys
sys.path.insert(0, '/usr/share/gcc-14/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers(None)
end
# Shortcut untuk perintah umum
define ptype
ptype $arg0
end
define bta
bt all
end
document ptype
Print type of variable. Usage: ptype <varname>
end
document bta
Print backtrace of all threads.
end
EOFMengizinkan .gdbinit Lokal #
GDB secara default menolak memuat .gdbinit di direktori proyek demi keamanan. Untuk mengizinkannya, tambahkan ke ~/.gdbinit:
add-auto-load-safe-path /path/to/your/project/.gdbinitAtau secara global:
add-auto-load-safe-path ~/2. Verifikasi Konfigurasi #
Buat program demo sederhana dan jalankan sesi gdb:
/* File: gdbinit_demo.c */
#include <stdio.h>
#include <string.h>
typedef struct {
char nama[32];
int umur;
float nilai;
} Mahasiswa;
int main(void) {
Mahasiswa mhs[] = {
{"Budi", 20, 85.5},
{"Siti", 21, 92.0},
{"Andi", 19, 78.3},
};
int n = sizeof(mhs) / sizeof(mhs[0]);
for (int i = 0; i < n; i++) {
printf("%s: umur=%d, nilai=%.2f\n",
mhs[i].nama, mhs[i].umur, mhs[i].nilai);
}
return 0;
}Compile dengan flag -g:
gcc -std=c11 -Wall -Wextra -g -O0 -o gdbinit_demo gdbinit_demo.cJalankan GDB (tidak ada gdb di sandbox ini, jadi kita tunjukkan perintah yang akan dipakai):
gdb ./gdbinit_demoSesi interaktif yang diharapkan (dengan konfigurasi .gdbinit di atas):
(gdb) break main
Breakpoint 1 at 0x1140: file gdbinit_demo.c, line 13.
(gdb) run
Starting program: /home/budi/gdbinit_demo
Breakpoint 1, main () at gdbinit_demo.c:13
13 int n = sizeof(mhs) / sizeof(mhs[0]);
(gdb) print mhs
$1 = {{
nama = "Budi",
umur = 20,
nilai = 85.5
}, {
nama = "Siti",
umur = 21,
nilai = 92
}, {
nama = "Andi",
umur = 19,
nilai = 78.300003
}}
(gdb) print mhs[0].nama
$2 = "Budi"Tanpa set print pretty on, output print mhs akan ditampilkan dalam satu baris panjang yang sulit dibaca. Dengan konfigurasi di atas, setiap field berada di baris terpisah.
3. Pretty Printer untuk Library Standar #
Pretty printer adalah skrip Python yang mengubah cara GDB menampilkan tipe kompleks. Tanpa pretty printer, container STL (C++) terlihat sebagai struct internal yang panjang. Untuk program C murni, pretty printer paling berguna untuk:
std::string(jika memakai C++ interop)glibcinternals:struct stat,FILE *,DIR *PyObject *(jika embed Python)glibtypes:GString,GList,GHashTable
Pretty printer GCC STL biasanya tersedia di path berikut setelah memasang GCC:
| Distro | Path |
|---|---|
| Debian/Ubuntu | /usr/share/gcc-13/python/ atau /usr/share/gcc-14/python/ |
| Fedora | /usr/share/gcc/python/ |
| Arch | /usr/share/gcc/python/ |
| macOS Homebrew GCC | /opt/homebrew/Cellar/gcc/14.2.0/share/gcc-14/python/ |
Untuk memeriksa path yang benar:
find /usr/share -name "printers.py" 2>/dev/null4. Command Kustom dan Macro #
GDB memungkinkan kita mendefinisikan command kustom via define. Contoh command berguna:
# Tampilkan semua breakpoint dengan lokasi file:baris
define bl
info breakpoints
end
document bl
Daftar semua breakpoint aktif.
end
# Toggle breakpoint di baris saat ini (untuk editor integrasi)
define toggleb
if $bpnum == 0
break
else
delete
end
end
# Cetak pointer sebagai hex dengan ukuran tipe
define paddr
printf "%p (%zu bytes)\n", $arg0, sizeof(*$arg0)
end
document paddr
Cetak alamat pointer dan ukuran tipe yang ditunjuk. Penggunaan: paddr <pointer>
end
# Restart program dengan argumen baru
define restart
kill
run $arg0
end
document restart
Restart program dengan argumen baru. Penggunaan: restart <args>
end5. Layout dan TUI Mode #
GDB memiliki mode TUI (Text User Interface) yang menampilkan source code, assembly, dan register dalam panel terpisah.
(gdb) layout src # Source code di atas, command di bawah
(gdb) layout asm # Assembly
(gdb) layout regs # Source + register
(gdb) layout split # Source + assembly + command
(gdb) tui disable # Keluar TUIBila TUI macet (umum setelah terminal di-resize), tekan Ctrl+L untuk refresh.
6. Integrasi Editor #
GDB dapat dikendalikan dari editor seperti Emacs (M-x gdb) atau Vim (via term atau plugin ConqueGDB). Untuk VS Code dan CLion, integrasi sudah bawaan—lihat bab Setup VS Code dan Setup CLion.
Konfigurasi tambahan untuk VS Code: tambahkan ke .vscode/launch.json di setupCommands:
"setupCommands": [
{
"description": "Aktifkan pretty printing",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Load .gdbinit proyek",
"text": "source ${workspaceFolder}/.gdbinit",
"ignoreFailures": true
}
]7. .gdbinit Per-Proyek #
Untuk proyek tertentu yang butuh konfigurasi khusus, buat .gdbinit di root proyek:
# proyek/.gdbinit
set environment LD_LIBRARY_PATH ./build/lib
set args --config config/prod.yaml --verbose
break main
break handle_request
commands 2
print req->method
print req->url
continue
endBagian commands 2 mendefinisikan command otomatis yang dijalankan saat breakpoint 2 (handle_request) terkena: mencetak field method dan url, lalu melanjutkan eksekusi.
8. Troubleshooting #
Warning: Auto-loading safe path rejected #
.gdbinit lokal ditolak karena security. Tambahkan path proyek ke ~/.gdbinit:
add-auto-load-safe-path /home/budi/projects/myproject/.gdbinitAtau jalankan GDB dengan flag:
gdb -iex "add-auto-load-safe-path /path/to/project" ./appPretty printer gagal load: ImportError: No module named 'libstdcxx' #
Path pretty printer salah atau tidak terpasang. Cari lokasi aktual:
find /usr/share/gcc -name "printers.py" 2>/dev/nullLalu perbarui baris sys.path.insert(0, '/usr/share/gcc-14/python') di ~/.gdbinit.
History tidak tersimpan antar sesi #
Pastikan set history save on ada dan direktori ~/.gdb_history dapat ditulis:
touch ~/.gdb_history
chmod 644 ~/.gdb_historyPrompt berantakan dengan kode escape ANSI #
Beberapa terminal tidak mendukung escape sequence \033[36m. Hapus baris set prompt \033[36m(gdb)\033[0m atau ganti ke prompt sederhana:
set prompt (mygdb)