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

Belajar Fitting data menggunakan Wolfram Mathematicha

 Berikut adalah beberapa contoh video tutorial untuk mengani list dengan wolfram mathematica Adapun tutorial yang lebih santai adalah  Pada tulisan kali ini, saya akan berbagi tentang bagaimana cara mengolah data yang dihasilkan oleh kalkulasi C++. Data yang saya gunakan menggunakan scientific notation yang biasanya ditulis dengan 1.45E-5. Nah permasalahan yang saya temui adalah format yang digunakan oleh Mathematicha adalah 1.45x10-5, sehingga perlu dilakukan penyesuaian.  Untuk melakukan penyesuaian ada banyak cara. Salah satunya adalah menuliskan nya secara manual. Namun, bagaimana jika data kita sangat banyak? Gak mungkin kan mengubah nya satu per satu.  Ok, kita mulai dengan bagaimana cara meng-import data dari file text. Pertama kit beri nama data yang akan kita import dengan "datamentah". in[1]:= datamentah = Import["/folder location/file.txt"]; Saat data tersebut diimport ke dalam "datamentah" data tersebut basih ber format string. Kemudian kita ub

Python: mengakses data dari file text

 Pada kesempatan kali ini saya akan menulis mengenai catatan saya saat belajar Python. Saya membutuhkan Python untuk memudahkan saya dalam mengolah data yang dihasilkan oleh aplikasi yang yang dihasilkan oleh bahasa C. Data tersebut berupa matriks yang tertulis dengan model scientific notation  (1.45e-5).  Pembacaan nya menggunakan numpy sehingga perlu melakukan import numpy terlebih dahulu. import numpy as np Kemudian definisikan path file yang akan dibaca csv_path="gRslt.txt" np.set_printoptions(suppress=True) Setelah lokasi file didefinisikan, kemudian masukkan data yang akan dibaca ke dalam variabel data bacadata= np.loadtxt(csv_path) Untuk menampilkan data, print data tersebut. print(bacadata[200]) Jika data kita berupa matriks, maka untuk memunculkan nilai dari baris ke 2 kolom ke 3 adalah dengan cara print(bacadata[2,3]) Ingat, penomoran baris dan kolom pada list python dimulai dengan index 0. sehingga untuk baris pertama dan kolom pertama adalah "bacadata[0,0]&qu