GDB - Panduan Cepat

Debugger adalah program yang menjalankan program lain, memungkinkan pengguna untuk mengontrol program ini, dan untuk memeriksa variabel ketika masalah muncul.

GNU Debugger, yang juga disebut gdb, adalah debugger paling populer untuk sistem UNIX untuk men-debug program C dan C ++.

GNU Debugger membantu Anda mendapatkan informasi tentang berikut ini:

  • Jika core dump terjadi, lalu pernyataan atau ekspresi apa yang menyebabkan program crash?

  • Jika kesalahan terjadi saat menjalankan suatu fungsi, baris apa dari program yang berisi panggilan ke fungsi itu, dan apa parameternya?

  • Berapa nilai variabel program pada titik tertentu selama pelaksanaan program?

  • Apa hasil dari ekspresi tertentu dalam sebuah program?

Bagaimana Debug GDB?

GDB memungkinkan Anda menjalankan program hingga titik tertentu, kemudian berhenti dan mencetak nilai variabel tertentu pada titik tersebut, atau melangkah melalui program satu baris pada satu waktu dan mencetak nilai setiap variabel setelah menjalankan setiap baris.

GDB menggunakan antarmuka baris perintah sederhana.

Poin yang Perlu Diperhatikan

  • Meskipun GDB dapat membantu Anda menemukan bug terkait kebocoran memori, namun GDB bukanlah alat untuk mendeteksi kebocoran memori.

  • GDB tidak dapat digunakan untuk program yang mengkompilasi kesalahan dan tidak membantu dalam memperbaiki kesalahan tersebut.

Sebelum Anda pergi untuk instalasi, periksa apakah Anda sudah menginstal gdb pada sistem Unix Anda dengan mengeluarkan perintah berikut:

$gdb -help

Jika GDB diinstal, maka itu akan menampilkan semua opsi yang tersedia dalam GDB Anda. Jika GDB tidak diinstal, lanjutkan untuk penginstalan baru.

Anda dapat menginstal GDB di sistem Anda dengan mengikuti langkah-langkah sederhana yang dibahas di bawah ini.

step 1: Pastikan Anda memiliki prasyarat untuk menginstal gdb:

  • Kompilator C yang memenuhi ANSI (disarankan gcc - perhatikan bahwa gdb dapat men-debug kode yang dibuat oleh kompiler lain)

  • 115 MB ruang disk kosong diperlukan pada partisi tempat Anda akan membangun gdb.

  • 20 MB ruang disk kosong diperlukan pada partisi tempat Anda akan menginstal gdb.

  • Program dekompresi GNU, gzip

  • Itu make utilitas - versi GNU diketahui berfungsi tanpa masalah, yang lain mungkin juga berfungsi.

step 2: Unduh distribusi sumber gdb dari ftp.gnu.org/gnu/gdb. (Kami dulu gdb-6.6.tar.gz untuk petunjuk ini.) Tempatkan file distribusi di direktori build Anda.

step 3:Di direktori build Anda, dekompresi gdb-6.6.tar.gz dan ekstrak file sumber dari arsip. Setelah file selesai diekstrak, ubah direktori kerja Anda ke direktori gdb-6.6 yang secara otomatis dibuat di direktori build Anda.

$ build> gzip -d gdb-6.6.tar.gz 
$ build> tar xfv gdb-6.6.tar 
$ build> cd gdb-6.6

step 4: Jalankan skrip konfigurasi untuk mengonfigurasi pohon sumber untuk platform Anda.

$ gdb-6.6> .⁄configure

step 5: Bangun gdb menggunakan make utilitas.

$ gdb-6.6> make

step 6: Login sebagai root dan instal gdb menggunakan perintah berikut.

$ gdb-6.6> make install

step 7: Jika diperlukan, ruang disk dapat diambil kembali dengan menghapus direktori build gdb dan file arsip setelah penginstalan selesai.

$ gdb-6.6> cd .. 
$ build> rm -r gdb-6.6 
$ build> rm gdb-6.6.tar

Sekarang Anda telah menginstal gdb di sistem Anda dan siap digunakan.

SEBUAH Debugging Symbol Tablememetakan instruksi dalam program biner yang dikompilasi ke variabel, fungsi, atau baris yang sesuai di kode sumber. Pemetaan ini bisa jadi seperti:

  • Instruksi program ⇒ nama item, tipe item, file asli, nomor baris ditentukan.

Tabel simbol dapat disematkan ke dalam program atau disimpan sebagai file terpisah. Jadi jika Anda berencana untuk men-debug program Anda, maka diperlukan untuk membuat tabel simbol yang akan memiliki informasi yang diperlukan untuk men-debug program.

Kita dapat menyimpulkan fakta-fakta berikut tentang tabel simbol:

  • Tabel simbol berfungsi untuk versi program tertentu - jika program berubah, tabel baru harus dibuat.

  • Build debug seringkali lebih besar dan lebih lambat daripada build retail (non-debug); debug build berisi tabel simbol dan informasi tambahan lainnya.

  • Jika Anda ingin men-debug program biner yang tidak Anda kompilasi sendiri, Anda harus mendapatkan tabel simbol dari pembuatnya.

Agar GDB dapat membaca semua informasi baris demi baris dari tabel simbol, kita perlu menyusunnya sedikit berbeda. Biasanya kami menyusun program kami sebagai:

gcc hello.cc -o hello

Alih-alih melakukan ini, kita perlu mengkompilasi dengan -g flag seperti yang ditunjukkan di bawah ini:

gcc -g hello.cc -o hello

GDB menawarkan daftar besar perintah, namun perintah berikut adalah yang paling sering digunakan:

  • b main - Menempatkan breakpoint di awal program

  • b - Menempatkan breakpoint pada baris saat ini

  • b N - Menempatkan breakpoint pada baris N

  • b +N - Menempatkan breakpoint N baris ke bawah dari baris saat ini

  • b fn - Menempatkan breakpoint di awal fungsi "fn"

  • d N - Menghapus nomor breakpoint N

  • info break - daftar breakpoints

  • r - Menjalankan program hingga breakpoint atau error

  • c - Terus menjalankan program hingga breakpoint atau error berikutnya

  • f - Berjalan hingga fungsi saat ini selesai

  • s - Menjalankan baris program berikutnya

  • s N - Menjalankan baris N berikutnya dari program

  • n - Seperti s, tetapi tidak masuk ke fungsi

  • u N - Berjalan sampai Anda mendapatkan baris N di depan baris saat ini

  • p var - Mencetak nilai saat ini dari variabel "var"

  • bt - Mencetak jejak tumpukan

  • u - Naik satu level dalam tumpukan

  • d - Turun satu tingkat dalam tumpukan

  • q - Keluar dari gdb

Memulai: Memulai dan Menghentikan

  • gcc -g myprogram.c

    • Mengompilasi myprogram.c dengan opsi debugging (-g). Anda masih mendapatkan a.out, tetapi berisi informasi debugging yang memungkinkan Anda menggunakan variabel dan nama fungsi di dalam GDB, daripada lokasi memori mentah (tidak menyenangkan).

  • gdb a.out

    • Membuka GDB dengan file a.out, tetapi tidak menjalankan program. Anda akan melihat prompt (gdb) - semua contoh berasal dari prompt ini.

  • r

  • r arg1 arg2

  • r <file1

    • Tiga cara untuk menjalankan "a.out", dimuat sebelumnya. Anda dapat menjalankannya secara langsung (r), meneruskan argumen (r arg1 arg2), atau memasukkannya ke dalam file. Anda biasanya akan menyetel breakpoint sebelum menjalankan.

  • help

  • h breakpoint

    • Buat daftar topik bantuan (bantuan) atau dapatkan bantuan tentang topik tertentu (h breakpoints). GDB terdokumentasi dengan baik.

  • q - Keluar dari GDB

Menelusuri Kode

Melangkah memungkinkan Anda melacak jalur program Anda, dan membidik kode yang rusak atau mengembalikan masukan yang tidak valid.

  • l

  • l 50

  • l fungsi saya

    • Daftar 10 baris kode sumber untuk baris saat ini (l), baris tertentu (l 50), atau untuk fungsi (l fungsi).

  • lanjut

    • Jalankan program sampai baris berikutnya, lalu jeda. Jika baris saat ini adalah sebuah fungsi, ia menjalankan seluruh fungsi, lalu berhenti.next bagus untuk menelusuri kode Anda dengan cepat.

  • langkah

    • Menjalankan instruksi berikutnya, bukan baris. Jika instruksi saat ini mengatur variabel, itu sama dengannext. Jika itu sebuah fungsi, itu akan melompat ke fungsi, mengeksekusi pernyataan pertama, lalu jeda.step bagus untuk mempelajari detail kode Anda.

  • selesai

    • Selesai menjalankan fungsi saat ini, lalu jeda (juga disebut melangkah keluar). Berguna jika Anda tidak sengaja masuk ke suatu fungsi.

Breakpoints atau Watchpoints

Breakpoint memainkan peran penting dalam debugging. Mereka menjeda (menghentikan) program ketika mencapai titik tertentu. Anda dapat memeriksa dan mengubah variabel dan melanjutkan eksekusi. Ini berguna ketika beberapa kegagalan input terjadi, atau input akan diuji.

  • istirahat 45

  • merusak fungsi saya

    • Set breakpoint pada baris 45, atau pada fungsi saya. Program akan berhenti ketika mencapai breakpoint.
  • menonton x == 3

    • Mengatur watchpoint, yang menghentikan program ketika kondisi berubah (ketika x == 3 berubah). Watchpoint sangat bagus untuk input tertentu (myPtr! = NULL) tanpa harus memutuskan setiap pemanggilan fungsi.

  • terus

    • Melanjutkan eksekusi setelah dihentikan sementara oleh breakpoint / watchpoint. Program akan berlanjut hingga mencapai breakpoint / watchpoint berikutnya.

  • hapus N

    • Menghapus breakpoint N (breakpoints diberi nomor saat dibuat).

Variabel Pengaturan

Melihat dan mengubah variabel saat runtime adalah bagian penting dari proses debug. Coba berikan input yang tidak valid ke fungsi atau jalankan kasus pengujian lain untuk menemukan akar penyebab masalah. Biasanya, Anda akan melihat / mengatur variabel saat program dihentikan sementara.

  • cetak x

    • Mencetak nilai variabel x saat ini. Mampu menggunakan nama variabel asli adalah alasan mengapa tanda (-g) dibutuhkan; program yang disusun secara teratur menghapus informasi ini.

  • set x = 3

  • set x = y

    • Set x ke nilai yang ditetapkan (3) atau ke variabel lain (y)
  • panggil fungsi saya ()

  • panggil myotherfunction (x)

  • panggil strlen (mystring)

    • Memanggil fungsi yang ditentukan pengguna atau fungsi sistem. Ini sangat berguna, tetapi berhati-hatilah dalam memanggil fungsi buggy.

  • tampilan x

    • Menampilkan nilai variabel x secara konstan, yang ditampilkan setelah setiap langkah atau jeda. Berguna jika Anda terus-menerus memeriksa nilai tertentu.

  • undisplay x

    • Menghapus tampilan konstan dari variabel yang ditampilkan oleh perintah tampilan.

Backtrace dan Mengubah Bingkai

Tumpukan adalah daftar panggilan fungsi saat ini - ini menunjukkan di mana Anda berada dalam program. Sebuah bingkai menyimpan rincian panggilan fungsi tunggal, seperti argumen.

  • bt

    • Backtracesatau mencetak tumpukan fungsi saat ini untuk menunjukkan di mana Anda berada dalam program saat ini. Jika panggilan utama berfungsi a (), yang memanggil b (), yang memanggil c (), lacak baliknya adalah

  • c <= current location 
    b 
    a 
    main
  • up

  • turun

    • Pindah ke bingkai berikutnya atas atau bawah dalam tumpukan fungsi. Jika Anda masukc, Anda bisa pindah ke b atau a untuk memeriksa variabel lokal.

  • kembali

    • Kembali dari fungsi saat ini.

Menangani Sinyal

Sinyal adalah pesan yang dilempar setelah kejadian tertentu, seperti pengatur waktu atau kesalahan. GDB mungkin berhenti jika menemukan sinyal; Anda mungkin ingin mengabaikannya.

  • menangani [nama sinyal] [tindakan]

  • menangani lubang hidung SIGUSR1

  • menangani SIGUSR1 noprint

  • menangani SIGUSR1 abaikan

    • Perintahkan GDB untuk mengabaikan sinyal tertentu (SIGUSR1) saat itu terjadi. Ada berbagai tingkat pengabaian.

Lihat contoh berikut untuk memahami prosedur debugging program dan core dumped.

  • Contoh Debugging 1

    Contoh ini menunjukkan bagaimana Anda akan menangkap kesalahan yang terjadi karena pengecualian yang dimunculkan saat membagi dengan nol.

  • Contoh Debugging 2

    Contoh ini menunjukkan program yang dapat membuang inti karena memori yang tidak diinisialisasi.

Kedua program tersebut ditulis dalam C ++ dan menghasilkan core dump karena alasan yang berbeda. Setelah melalui dua contoh ini, Anda akan berada dalam posisi untuk men-debug program C atau C ++ yang menghasilkan core dump.

Setelah melalui tutorial ini, Anda pasti sudah mendapatkan pemahaman yang baik tentang debugging program C atau C ++ menggunakan GNU Debugger. Sekarang seharusnya sangat mudah bagi Anda untuk mempelajari fungsionalitas debugger lain karena mereka sangat mirip dengan GDB. Sangat disarankan agar Anda melalui debugger lain juga untuk menjadi akrab dengan fitur mereka.

Ada beberapa debugger bagus yang tersedia di pasar:

  • DBX Debugger- Debugger ini dikirimkan bersama dengan Sun Solaris dan Anda bisa mendapatkan informasi lengkap tentang debugger ini menggunakan halaman manual dbx, yaitu man dbx .

  • DDD Debugger- Ini adalah versi grafis dari dbx dan tersedia gratis di Linux. Untuk mendapatkan detail lengkap, gunakan halaman manual ddd, yaitu man ddd .

Anda bisa mendapatkan detail lengkap tentang GNU Debugger dari tautan berikut: Debugging dengan GDB