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)