GDB - Program Debugging

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.