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

Python: Integral, Interpolasi dan Curve fitting

  Dalam mengolah data, python juga sangat mudah untuk digunakan mencari nilai integral dari sebuah fungsi, interpolasi dan fiting sebuah kurva.

Bahasa C: Pembahasan tentang isfinite

 Saat melakukan coding cumeric, ada kalanya kita harus mengecek apakah angka yang akan digunakan untuk menghitung berupa angka "normal" nilai nya melebihi range angka yang disetujui ataukan angkanya terlalu besar. Jika membuat fungsi sendiri, bisa jadi akan memakan waktu lama dan tidak efisien. Sehingga dalam bahasa C sudah disediakan library yang digunakan untuk mengecek bagaimana angka yang akan digunakan untuk menghitung.  Berikut adalah salah satu library yang disediakan oleh C untuk melaukan pengecekan angka yang akan digunakan untuk menghitung. Namanya adalah isfinite. Untuk lebih jelas nya dapat dilihat di link berikut .  isfinite berada dalam lingkungan <math.h>. Sehingga sebelum menggunakan nya perlu dilakukan pendefinisian header <math.h> terlebih dahulu.

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.