Langsung ke konten utama

Debugging bahasa C dengan GDB


Sering kali saat kita melakukan coding, code kita dapat berjalan dengan baik, namun mengeluarkan hasil yang salah. Nah, ini lebih memusingkan dibanding dengan jika kode kita error karena tidak bisa dicompile. Disini saya akan menuliskan salah satu cara untuk melakukan debugging dengan software yang bernama GDB. Keterangan lebih jelas mengenai GDB bisa di cek di link berikut.

Artikel asli yang saya pelajari diperoleh dari link berikut. Akan saya ulas lagi berdasarkan percobaan yang telah saya lakukan. 

Buat code untuk menghitung nilai faktorial suatu angka. Untuk diingat, cara menghitung faktorial adalah n!= n*(n-1)*...*1, Misal 3! = 3*2*1 = 6. Untuk membuat code nya, kami menggunakan vim. sehingga caranya adalah 

$ vim factorial.c
# include <stdio.h>

int main()
{
	int i, num, j;
	printf ("Masukkan angka: ");
	scanf ("%d", &num );

	for (i=1; i<num; i++)
		j=j*i;    

	printf("Nilai faktorial dari %d adalah %d\n",num,j);
}

Kemudain compile program tersebut dengan cc factorial.c
$ cc factorial.c

$ ./a.out
Masukkan angka: 3
Nilai faktorial dari 3 adalah 0

Setelah itu, silakan jalankan program tersebut dengan cara tekan "./a.out", coba isikan angka 3, apakah hasilnya benar? Salah kan, seharusnya hasilnya 6, tapi yang keluar adalah angka 0. 

Biasanya kita mencari letak kesalahan dengan cara melakukan print di masing masing baris yang kita curigai dimana letak kesalahan nya. Disini, yang perlu dicurigai adalah nilai i dan j. Biasanya kita print i dan j di beberapa line kan? 

Hal yang sama akan kita lakukan, namun dengan debugger yaitu gdb. Untuk melakukan nya, kita harus membuat aplikasi kita bisa dibaca oleh gdb. Dengan cara memberikan -g pada saat melakukan kompilasi code. 

$ cc -g factorial.c

Setelah itu file a.out dapat dibaca oleh gdp. Langkah berikutnya adalah jalankan gdb untuk menganalisis a.out. 

$ gdb a.out 

GNU gdb (GDB) Red Hat Enterprise Linux (7.2-92.el6)

Copyright (C) 2010 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-redhat-linux-gnu".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>...

Reading symbols from /home/enggar/2-debugging/a.out...done.

(gdb)

 


Setelah itu anda dapat memerintahkan gdp untuk mulai bekerja. Pertama, berikan batas, kira-kira dari line berapa hingga berapa yang ingin dilihat. Misalnya sebagai batas adalah line 10, maka batas pertama adalah line 10 "break 10"

(gdb) break 10

Breakpoint 1 at 0x400577: file factorial.c, line 10.

(gdb)

Artinya, pengecekan pertama adalah dari line pertama hingga line 10. Kemudian, jalankan a.out dengan menekan "run"

(gdb) run

Starting program: /home/enggar/2-debugging/a.out 

Enter the number: 3


Breakpoint 1, main () at factorial.c:10

10 j=j*i;

Kemudian kita cek apakah nilai i, j dan num sudah benar. Caranya adalah dengan p i (untuk print i), p i, dan p num.

(gdb) p i

$1 = 3

(gdb) p j

$2 = 0

(gdb) p num

$3 = 3

(gdb)

Di sini yang terlihat aneh adalah nilai j. karena nilai nya 0. Jadi saat program jalan, hasilnya pun masih 0. Ok, mari kita tambahkan nilai j=1; sehingga nilai awal j adalah 1. Kemudian jalankan program dan kita cek lagi apakan hasil nya sudah benar.

Ternyata hasil nya masih salah, namun jika kita cek dari segi nilai p, i dan j hasilnya adalah sebagai berikut

(gdb) p i

$1 = 3

(gdb) p j

$2 = 1

(gdb) p num

$3 = 3

(gdb)

Langkah berikutnya adalah cek di line berikutnya dengan menekan:

  • c atau continue: Debuger akan melanjutkan hingga ke line break berikutnya, karena kita hanya menggunakan line break 10, maka ini tidak usah digunakan.
  • n atau next: debuger akan melanjutkan ke line dibawahnya
  • s atau step: hampir sama denagn next tapi step menganggap 1 fungsi sebagai 1 langkah, bukan dievaluasi per line.

(gdb) n

9 for (i=1; i=num; i++)

(gdb) n


Breakpoint 1, main () at factorial.c:10

10 j=j*i;    

(gdb) p i

$4 = 3

(gdb) pj

Undefined command: "pj".  Try "help".

(gdb) p j

$5 = 3

(gdb) p num

$6 = 3 

Jika dilihat, maka yang salah adalah i=num, karena di sana loopnya tidak berjalan dengan baik. Karena i seharusnya berjalan dari  i (1,2,3), namun batasnya tidak jelas. Seharusnya tanda = diubah menjadi <=.


Kesimpulan

  • Compiling agar dikenali gdb adalah "cc -g Nama_code.c"
  • Menjalankan aplikasi dengan gdb "gdb nama_aplikasi"
  • Memberi batas line "break nomor_line"
  • Menjalankan gdb dengan p: print, c: continue, n: next, s: step, l list.
  • Untuk keluar dari GDB ketik Quit kemudian enter.

   

Komentar

Postingan populer dari blog ini

Perjalanan mencari kitab elektronik

Sebagai seorang mahasiswa, saya ingin memiliki gadget yang secara khusus bisa digunakan untuk membaca dan menyimpan file buku. Awalnya saya membaca dengan HP, bisa sih tapi gak nyaman, karena layar terlalu kecil. Kemudian saya beralih ke tablet, saat itu saya menggunakan tablet merk Lenovo. Lebih nyaman dibandingkan HP, tapi lama kelamaan bosan juga karena saat itu ada tablet yang dilangkapi dengan "pena". Saat itu tablet saya gak ada pena nya. Beralih lah saya ke iPad 6 (2018) yang sudah support dengan "pen" sehingga bisa corat coret saat sedang membaca paper atau ebook.  Ipad sangat nyaman, kita bisa menginstall berbagai macam aplikasi. Baik yang gratis maupun yang berbayar. Untuk memenuhi kebutuhan saya dalam membaca, saya menggunakan 2 alpikasi andalan, yaitu GoodNotes dan LiquidText. GoodNotes yang saya gunakan adalah yang versi gratisan. Sedangkan yang LiquidText adalah yang berbayar. Membaca jurnal maupun ebook dengan software itu sangat nyaman. Bisa menurunk

Tutuorial memasak ubi/ketela dengan microwave

Di Jepang, ketela merupakan makanan yang banyak digemari masyarakat. Jika anda melihat atau penggemar komin Crayon Sinchan, anda akan tau jika Misae (Ibu nya Sinchan) memiliki hobi makan ketela.