GNU debugger to potężne narzędzie pozwalające na debugowanie kodu różnych języków programowania m.in. C, C++, Pascal, Assemblera. Pozwala na podgląd rejestrów procesora, koprocesora, flag, stosu, załadowanych bibliotek dynamicznych, ramkach stosu i wiele innych.
Poniżej przedstawiono przykład pracy w GDB.
Po instalacji należy dodać katalog w którym znajdują się kompilatory do zmiennych środowiska (katalog BIN).
C:>path c:mingwbin
Następnie za pomocą dowolnego edytora piszemy program. Poniżej program napisany w asemblerze obliczający wartość funkcji sin(60) z wykorzystaniem wzoru: sin(x*3^(k-1))=3sin(x*3^k)-4sin(x*3^-k)^3. Celem programu prócz uzyskania wyniku jest sprawdzenie ile cykli jest potrzebne na obliczenie wyniku. W rejestrze EAX znajdować się będzie liczba cykli a w rejestrze R7 jednostki FPU wynik obliczeń.
SYSEXIT =1
EXIT_SUCCESS =0
.align 32
.data
K: .float 0f+729.00E-0
arg1: .float 0f+1.0472E-0
arg3: .float 0f+3.00E-0
arg4: .float 0f-4.00E-0
mul1: .float 0f+0.00E-0
Cykle_L: .long 0
Cykle_H: .long 0
.text
.global _start
_start:
finit
.byte 0xF, 0x31
movl %EDX,Cykle_H(,1)
movl %EAX,Cykle_L(,1)
movw $6,%si
movl K(,1),%eax
flds arg1(,1)
fdivs K(,1)
fstps arg1(,1)
loop1:
flds arg1(,1)
flds arg3(,1)
fmulp flds arg1(,1)
fsts mul1(,1)
flds mul1(,1)
fmulp
flds mul1(,1)
fmulp
flds arg4(,1)
fmulp
faddp %st(1)
fstps arg1(,1)
dec %si
cmp $0,%si
jne loop1
flds arg1(,1)
.byte 0x0F, 0x31
subl Cykle_L(,1),%EAX
subl $9,%EAX
subl Cykle_H(,1),%EDX
movl $SYSEXIT, %eax
int $0x80
Program w GNU Asemblerze kompilujemy za pomocą dołączonego kompilatora AS opcja –gstabs umożliwia zapamiętanie nazw symbolicznych zmiennych
C:>as –gstabs sin.s -o sin.o
linkujemy program
C:>ld sin.o -o sin
Uruchamiamy GDB jako parametr podając nazwę programu
C:>gdb sin
Ustawiamy break na 52 linijce wpisując break 52 (skrót: b 52)
(gdb) break 52
Komendą run uruchamiamy program
(gdb) run
Starting program: C:fsin
Breakpoint 2, loop1 () at fsin.s:53
53 movl $SYSEXIT, %eax
Sprawdzamy zawartość rejestrów procesora. Po wykonaniu algorytmu eax wskazuje liczbę cyklów (czas obliczeń)
(gdb) info register eax 0x31b4 12724
ecx 0x22ffb0 2293680
edx 0x0 0
ebx 0x7ffdf000 2147348480
….. …………….. ………………
Obliczona wartość funkcji sinus po wykonaniu algorytmu znajduje się na stosie koprocesora w rejestrze st(0) (R7). Stan koprocesora sprawdzamy komendą info float (skrót: i fl)
(gdb) info float =>R7: Valid 0x3ffeddb3ef0000000000 +0.86602681875228882
R6: Empty 0xbffca3e08b3af03ea708
R5: Empty 0xc0018000000000000000
R4: Empty 0x00000000000000000000
R3: Empty 0x00000000000000000000
R2: Empty 0x00000000000000000000
R1: Empty 0x00000000000000000000
R0: Empty 0x00000000000000000000
Status Word: 0xffff3820 PE
TOP: 7
Control Word: 0xffff037f IM DM ZM OM UM PM
PC: Extended Precision (64-bits)
RC: Round to nearest
(gdb)