GNU/Linux >> Belajar Linux >  >> Linux

Beberapa Perintah GDB – Debug Core, Disassemble, Load Shared Library

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.


Linux
  1. Linux – Apakah Semua Program C Perlu Memuat Perpustakaan?

  2. Cara Debug Program C menggunakan gdb dalam 6 Langkah Sederhana

  3. Pengantar Pustaka Bersama Linux (Cara Membuat Pustaka Bersama)

  1. C++ Dynamic Shared Library di Linux

  2. Mengonversi Perpustakaan Statis menjadi Perpustakaan Bersama?

  3. Tautan statis fungsi perpustakaan bersama di gcc

  1. Cara menginisialisasi perpustakaan bersama di Linux

  2. Bagaimana cara membuat versi perpustakaan bersama di Linux?

  3. Tidak dapat menemukan kesalahan perpustakaan libcrypto