Tingkatkan kualitas kode dan cegah hasil yang tidak diharapkan dengan mempelajari cara menggunakan GNU Debugger untuk mengungkap bug yang tidak diinginkan dalam kode Anda.

Debugging adalah keterampilan yang sangat diperlukan bagi pemrogram dan peneliti keamanan. Memiliki pemahaman yang kuat tentang debugging memungkinkan Anda memahami executable pada tingkat yang lebih rendah dan menangkap kesalahan apa pun yang mengintai.

Debugger GNU atau, GDB, adalah alat debugging abadi yang telah diandalkan oleh para programmer selama bertahun-tahun. Berikut cara menggunakan GDB di Linux.

Mempersiapkan Contoh Program

Untuk menjelajahi fitur-fitur GDB, Anda memerlukan executable untuk bereksperimen. Untuk demonstrasi, Anda akan menjalankan GDB pada program pemeriksaan kunci satu kali dengan kode sumber dan simbol debug tersedia, satu kali tanpa kode sumber, dan pada program multithread sederhana yang mencetak pesan ke layar, baik ditulis dalam C dan dikompilasi dengan GCC (GNU C Penyusun).

Kamu bisa gunakan kompiler C lainnya tapi pastikan untuk tidak menghapus binernya.

instagram viewer

Kemungkinan besar Anda akan menjalankan GDB pada program Anda sendiri. Jadi pastikan untuk mengkompilasinya dengan -G tandai dengan gcc untuk mengaktifkan simbol debug.

Tanpa adanya simbol debug dan dengan biner yang sangat terkelupas, Anda harus melakukan debug dengan pembongkaran program. Ini mengharuskan Anda memiliki pemahaman yang kuat tentang bahasa assembly dan cara kerja alokasi memori di Linux untuk memahami data dalam tumpukan dan register.

Menjalankan Program di GDB

Anda menjalankan program di GDB dalam beberapa cara. Ketikkan keduanya gdb , dan setelah dimuat, ketik berlari. Atau mulai gdb lalu gunakan mengajukan perintah, muat biner ke gdb, lalu jalankan dengan berlari memerintah.

Jika program Anda memerlukan argumen baris perintah agar berfungsi dengan baik, pastikan untuk menambahkan argumen setelah nama program. Berikut sintaks untuk memuat program ke GDB dan mengeksekusinya dengan argumen:

gdb 
run

Atau:

gdb
file
run

Menetapkan Breakpoint Dengan GDB

Breakpoint dalam debugging secara manual mengatur penghentian keras dalam kode yang menghentikan aliran eksekusi ketika program mencapai breakpoint. Menetapkan breakpoint memungkinkan Anda menelusuri kode dan memeriksa bagaimana setiap tahapan eksekusi memengaruhi data dan variabel.

Di GDB, saat Anda men-debug program dengan simbol debug, Anda dapat menyetel breakpoint berdasarkan nama fungsinya atau menyetel breakpoint berdasarkan nomor baris. Berikut sintaksnya:

break main
break 47

Untuk melihat semua breakpoint di sesi debugging saat ini, ketik:

info breakpoints

Untuk menghapus breakpoint tertentu atau beberapa breakpoint, ketik:

delete 2
delete 3-5

GDB juga memungkinkan Anda menyetel breakpoint bersyarat, artinya program hanya akan berhenti jika kondisi tertentu terpenuhi selama eksekusi. Ini bisa berupa perubahan nilai variabel atau pemanggilan fungsi yang gagal atau, apa pun yang Anda inginkan. Berikut sintaks untuk menyetel breakpoint bersyarat:

break  if n == 2

Jika Anda ingin melanjutkan eksekusi program setelah mencapai breakpoint, ketikkan melanjutkan memerintah:

continue

Melangkah Melalui Kode

Menelaah kode sangat penting untuk memahami bagaimana program menangani data. Dengan menelusuri berbagai fungsi dalam program Anda dan memeriksa status data, Anda bisa mendapatkan pemahaman yang lebih baik tentang bagaimana program mengimplementasikan logika yang Anda tulis dalam kode.

Ini juga membantu Anda mendeteksi akar kerusakan dan mempelajari perilaku program dengan presisi tinggi karena Anda dapat menelusuri setiap baris kode sesuai keinginan. Anda dapat menelusuri kode dengan tiga cara utama di GDB:

  1. melangkah: Perintah ini memberitahu GDB untuk masuk ke baris berikutnya dari file sumber. Hal ini memungkinkan Anda menelusuri panjang kode sumber baris demi baris.
  2. Berikutnya: Perintah ini mengeksekusi baris kode sumber berikutnya di dalam fungsi saat ini dan kemudian berhenti. Berikutnya memperlakukan suatu fungsi sebagai satu baris jadi jika Anda menggunakan next sebelum pemanggilan fungsi, ia akan memperlakukannya sebagai satu baris dan melangkahinya, tidak seperti melangkah memerintah.
  3. menyelesaikan: Perintah finish mengeksekusi semua baris yang tersisa di dalam fungsi saat ini dan kemudian berhenti.

Memeriksa Variabel

Saat Anda menelusuri kode, Anda ingin memeriksa nilai variabel untuk melihat bagaimana logika program mengubahnya. Berikut sintaks untuk melihat nilai variabel di GDB:

print 

Jika Anda ingin mencetak perubahan nilai suatu variabel setiap kali diperbarui, Anda harus menggunakan perintah display. Ini sangat berguna ketika Anda ingin melacak dan mencetak nilai variabel dalam satu lingkaran:

display 

Menetapkan Titik Pengawasan

Watchpoint dan conditional breakpoint berkaitan erat karena keduanya merespons perubahan dalam suatu program. Watchpoint digunakan untuk melacak perubahan data dalam kode. Misalnya, Anda mungkin ingin program berhenti setiap kali nilai variabel berubah. Berikut cara melakukannya dengan GDB:

watch 

Debugging Khusus Thread Dengan GDB

GDB memungkinkan Anda melakukan debugging khusus thread saat bekerja dengan program multithread. Untuk demonstrasi, kami akan bekerja dengan Program C sederhana yang menggunakan empat thread untuk mencetak pesan pada setiap thread.

Untuk melihat thread yang sedang muncul di program Anda, gunakan info memerintah:

info threads

Untuk bekerja dengan thread tertentu, Anda dapat memilihnya dari daftar menggunakan nomor indeksnya. Misalnya:

thread 2

Setelah memilih thread, Anda dapat menelusuri alur eksekusinya menggunakan melangkah, Berikutnya, Dan menyelesaikan perintah seperti yang ditunjukkan di atas.

Debugging Jarak Jauh Dengan GDB

Anda juga dapat men-debug program yang terletak di sistem lain dari jarak jauh. Untuk melakukannya, Anda perlu menyiapkan gdbserver di mesin target. Anda dapat dengan mudah menginstalnya menggunakan manajer paket default distribusi Anda atau manajer paket lain yang telah Anda instal pada sistem Anda.

Misalnya, untuk menginstal gdbserver di sistem berbasis Ubuntu atau Debian, gunakan APT:

sudo apt install gdbserver

Setelah terinstal, pindah ke folder biner dan jalankan perintah ini untuk memulai gdbserver:

gdbserver :

gdbserver harus mengembalikan output yang aktif dan mendengarkan pada port yang Anda tentukan. Sekarang di mesin klien, mulai GDB dan kemudian sambungkan ke server jarak jauh menggunakan target memerintah:

target remote :

Menulis Skrip GDB untuk Mengotomatiskan Debugging

GDB memungkinkan pemrogram untuk menulis skrip GDB yang akan menjalankan perintah GDB secara otomatis. Ini sangat membantu ketika Anda mencoba men-debug bagian kode yang sama beberapa kali. Daripada harus menyetel breakpoint, menelusuri kode, dan mencetak nilai variabel setiap kali Anda memuat biner, Anda dapat menggunakan skrip GDB untuk mengotomatiskan seluruh proses.

Berikut ini contohnya:

set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit

Dalam skrip di atas, Anda meminta GDB untuk mengaktifkan logging dan menyimpan log ke file bernama sampel.keluar, lalu atur breakpoint di utama fungsi.

Untuk breakpoint nomor 1, dalam hal ini breakpoint pada fungsi main, jalankan perintah berikut: menelusuri kembali, mencetak, melanjutkan. Pada dasarnya, GDB pertama-tama akan menjalankan backtrace, kemudian mencetak nilai variabel "N", melanjutkan eksekusi, dan akhirnya berhenti.

Untuk menjalankan skrip ini, gunakan:

gdb -x