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.