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); }
$ cc factorial.c $ ./a.out Masukkan angka: 3 Nilai faktorial dari 3 adalah 0
$ cc -g factorial.c
$ 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)
(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
Posting Komentar