Search what you want

Wednesday, February 10, 2016

Debug Assembly Code with gdb

Sering kali dari kita, ketika kitaa menuliskan code program tidak selalu langsung berhasil pada percobaan compile pertama kali. Hasil dari program yang kita tuliskan biasanya mengeluarkan hasil output yang berbeda dari harapan kita. banyak alasan yang menyebabkan output tersebut belum benar. mungkin dikarenakan logika program yang salah, melakukan proses aritmatika yang salah, hinggapendefinisian variabel yang salah. Hal-hal tersebut haruslah kita tangani untuk mendapatkan hasil seperti yang kita harapkan. yap. Debuging merupakan langkah yang harus kita lakukan terhadap program yang kita tulis. Terdapat fasilitas yang telas disediakan untuk mellakukan debug pada program assembly yaitu GDB. Pada kesempatan ini kita akakn mencoba melakukan debug pada program. "Get started program assembly" dapat dilihat di postingan sebelumnya. langsung aja kita buat program yang akan kita debug nantinya.

1. buat progran main.asm dan letakkan pada folder orkom (Get started program assembly)
;@author : Ardhi Maarik
;@task : Debuding
section .data ;data variable
a dd 4 b dd 1 section .bss ;data reservation result resd 1 section .text global main main: mov eax, 1 mov ebx, 4 mov ecx, eax mov eax, [a] mov ebx, [b] mov dword[result], eax ;exit mov eax, 1 int 0x80
2. buka terminal dan masuk ke folder orkom
cd Desktop/orkom
3. compile file
make
text keluaran dari terminal:
yasm main.asm -f elf32 -g dwarf2 -l main.lst
ld -o main -e main -m elf_i386 main.o
4. lakukan debuging
gdb main
text keluaran dari terminal: (tidak harus sama persis seperti ini)
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main...done.
(gdb) 

5. break file, mulai dari fungsi main
break main
text keluaran dari terminal:
Breakpoint 1 at 0x8048080: file main.asm, line 17.
penjelasan: program main pertama ada di line ke 17

6. run program
run
text keluaran dari terminal:
Starting program: /home/username/Desktop/orkom/main 

Breakpoint 1, main () at main.asm:17
17  mov eax, 1
7. Melihat register yang digunakan 
info register
text keluaran dari terminal
eax            0x0 0
ecx            0x0 0
edx            0x0 0
ebx            0x0 0
esp            0xffffcc60 0xffffcc60
ebp            0x0 0x0
esi            0x0 0
edi            0x0 0
eip            0x8048080 0x8048080 <main>
eflags         0x202 [ IF ]
cs             0x23 35
ss             0x2b 43
ds             0x2b 43
es             0x2b 43
fs             0x0 0
gs             0x0 0
8. Display nilai dari suatu register untuk mendebug
display $eax
display $ebx
display $ecx
display a
display b
display result
untuk menampilkan register tertentu, karena register yang kita gunakan yaiut eax, ebx, ecx dan variabel a, b, result. untuk menampilkan register harus diawali oleh $<register>, sedangkan untuk variabel tidak.

nilai awal dari setaip register masih nol dan nilai awal dari variabel sudah ada kecuali variabel result
1: $eax = 0
2: $ebx = 0
3: $ecx = 0
4: a = 4
5: b = 1
6: result = 0
9. jalankan program ke line selanjutnya
ni
text keluaran dari terminal
18  mov ebx, 4
6: result = 0
5: b = 1
4: a = 4
3: $ecx = 0
2: $ebx = 0
1: $eax = 1
penjelasan:
pointer debug sekarang berada pada line ke 18 dengan code program "mov ebx, 4". Artinya line ke 17 telah di eksekusi dengan memasukan nilai 1 ke register eax.

10 lanjutkan proses debug ke line selanjutnya hingga akhir dengan command
ni
text keluaran terminal:
20  mov ecx, eax
6: result = 0
5: b = 1
4: a = 4
3: $ecx = 0
2: $ebx = 4
1: $eax = 1
22  mov eax, [a]
6: result = 0
5: b = 1
4: a = 4
3: $ecx = 1
2: $ebx = 4
1: $eax = 1
23  mov ebx, [b]
6: result = 0
5: b = 1
4: a = 4
3: $ecx = 1
2: $ebx = 4
1: $eax = 4
25  mov dword[result], eax
6: result = 0
5: b = 1
4: a = 4
3: $ecx = 1
2: $ebx = 1
1: $eax = 4
28  mov eax, 1
6: result = 4
5: b = 1
4: a = 4
3: $ecx = 1
2: $ebx = 1
1: $eax = 4
29  int 0x806: result = 4
5: b = 1
4: a = 4
3: $ecx = 1
2: $ebx = 1
1: $eax = 1
[Inferior 1 (process 5991) exited with code 01]


~ sekian ~




















No comments:

Post a Comment