GDB adalah alat penting bagi pemrogram untuk men-debug kode mereka.
Artikel ini menjelaskan bagaimana Anda bisa menggunakan gdb untuk men-debug program dengan file inti, cara menampilkan instruksi bahasa rakitan program Anda, dan cara memuat program pustaka bersama untuk debugging.
Debug Program dengan File Inti
File inti atau dump inti adalah file yang merekam gambar memori dari proses yang sedang berjalan dan statusnya. Ini digunakan dalam debugging post-mortem dari sebuah program yang macet saat dijalankan di luar debugger.
$ gdb executable_name core_file_name (gdb)
Perintah di atas akan memuat file inti untuk yang dapat dieksekusi dan meminta shell gdb.
Anda dapat menggunakan gdb backtrace atau perintah lain untuk memeriksa apa yang sebenarnya terjadi. Perhatikan bahwa core_file akan diabaikan, jika executable berjalan di bawah gdb.
Cetak Petunjuk Perakitan
Anda dapat menggunakan perintah disassemble untuk mencetak instruksi perakitan suatu fungsi. Anda juga dapat menentukan 2 rentang alamat, dan petunjuk di antaranya akan dibongkar dan dicetak di konsol gdb.
(gdb) disassemble main Dump of assembler code for function main: 0x00000000004004ac : push %rbp 0x00000000004004ad : mov %rsp,%rbp 0x00000000004004b0 : mov $0x0,%eax 0x00000000004004b5 : pop %rbp 0x00000000004004b6 : retq End of assembler dump.
Muat Simbol Pustaka Bersama
Sering kali, pemrogram akan menggunakan pustaka bersama dalam kode mereka. Terkadang, kita mungkin ingin melihat ke perpustakaan bersama itu sendiri untuk memahami apa yang terjadi. Di sini saya akan menunjukkan contoh menggunakan GLib Library dan cara mendapatkan informasi debugging untuk itu.
Secara default, semua distribusi akan menghapus perpustakaan sampai batas tertentu. Informasi debug lengkap akan disimpan dalam paket terpisah yang mereka beri nama seperti "paket-1.0-dbg", dan hanya jika diperlukan pengguna dapat menginstal.
Saat Anda menginstal "package-1.0-dbg", secara default gdb akan memuat semua informasi debug, tetapi untuk memahami konsepnya di sini kita akan melihat cara memuat file simbol secara manual.
#include <stdio.h> #include <glib.h> struct a { int a; int b; }; void *print( struct a *obj,int as) { printf("%d:%d\n",obj->a,obj->b); } int main() { struct a *obj; obj = (struct a*)malloc(sizeof(struct a)); obj->a=3; obj->b=4; GList *list=NULL; list = g_list_append(list,obj); g_list_foreach(list,(GFunc)print,NULL); }
$ cc -g -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/ -lglib-2.0 glib_test.c
Catatan:Anda perlu menginstal libglib2.0-0 untuk mencoba contoh ini.
Sekarang kita akan memulai debugging.
(gdb) b 1 Breakpoint 1 at 0x4007db: file a.c, line 1. (gdb) run ... (gdb) info sharedlibrary From To Syms Read Shared Object Library 0x00007ffff7dddaf0 0x00007ffff7df5c83 Yes (*) /lib64/ld-linux-x86-64.so.2 0x00007ffff7b016c0 0x00007ffff7b6e5cc Yes (*) /lib/x86_64-linux-gnu/libglib-2.0.so.0 0x00007ffff7779b80 0x00007ffff7890bcc Yes (*) /lib/x86_64-linux-gnu/libc.so.6 0x00007ffff751f9a0 0x00007ffff7546158 Yes (*) /lib/x86_64-linux-gnu/libpcre.so.3 0x00007ffff7307690 0x00007ffff7312c78 Yes (*) /lib/x86_64-linux-gnu/libpthread.so.0 0x00007ffff70fc190 0x00007ffff70ff4f8 Yes (*) /lib/x86_64-linux-gnu/librt.so.1 (*): Shared library is missing debugging information.
Dari informasi di atas, perhatikan bahwa library libglib-2.0.so.0 memiliki simbol, tetapi informasi debuuging seperti file_name, line_no dll... tidak ada.
Unduh informasi debug untuk paket dari masing-masing distribusi (libglib2.0-0-dbg di Debian – Wheezy).
(gdb) add-symbol-file /home/lakshmanan/libglib-2.0.so.0.3200.4 0x00007ffff7b016c0 add symbol table from file "/home/lakshmanan/libglib-2.0.so.0.3200.4" at .text_addr = 0x7ffff7b016c0 (y or n) y Reading symbols from /home/lakshmanan/libglib-2.0.so.0.3200.4...done.
Alamat yang diberikan dalam perintah add-symbol-file adalah, alamat "Dari" yang dicetak oleh perintah "info sharedlibrary". Sekarang informasi debug dimuat.
... ... (gdb) n g_list_foreach (list=0x0, func=0x4007cc , user_data=0x0) at /tmp/buildd/glib2.0-2.33.12+really2.32.4/./glib/glist.c:897
Terkadang perpustakaan bersama bahkan tidak memiliki simbol apa pun di dalamnya, dan dalam situasi tersebut, metode di atas akan sangat membantu.