View Programare-C-GDB
GDB
GDB este un debugger care permite întreruperea execuției binarelor și dezasamblarea codului asamblor prin care sunt implementate.
Prin exemplul următor o să modificam valoarea returnată de una din funcțiile programului pe care îl rulăm în debugger, cu scopul de a observa valoarea schimbată în fereastra pe care o desenează.
Folosind nm am aflat de existența metodei Objective C capacityCurrent care returnează valoarea capacității curente a bateriei.
Vom seta un breakpoint in interiorul GDB.
GDB va intrerupe execuția binarului când funcția este chemată și ne va oferi posibilitatea sa executăm comenzi.
(gdb) b -[batteryDataClass capacityCurrent]
Breakpoint 4 at 0x5399
PC este registrul contor program. El pointează întotdeauna către urmatoarea instrucțiune care va fi executată.
Să afișăm patru instrucțiuni din funcția noastră.
(gdb) x/4i $pc
0x5399 <-[batteryDataClass capacityCurrent]+3>: mov eax,DWORD PTR [ebp+8]
0x539c <-[batteryDataClass capacityCurrent]+6>: mov eax,DWORD PTR [eax+12]
0x539f <-[batteryDataClass capacityCurrent]+9>: pop ebp
0x53a0 <-[batteryDataClass capacityCurrent]+10>: ret
(gdb) p *(int *)($ebp + 8) + 12
$5 = 3841436
(gdb) p *(int *)3841436
$6 = 5280
Prin convenție, pe mac rezultatele unei metode objective c sunt returnate în registrul EAX.
În codul de mai sus EAX este încărcat cu valoarea locației de memorie EBP + 8 + 12.
Afișând valoarea din locația de memorie respectivă, putem observa valoarea de 5280 (afișată de program în cadrul funcționării normale).
comm permite execuția unor comenzi la atingerea unui breakpoint.
Mai jos setăm conținutul locației de memorie care reprezintă capacitatea curentă a bateriei la 4200.
(gdb) comm
Type commands for when breakpoint 4 is hit, one per line.
End with a line saying just "end".
>set {int}3841436 = 4200
>end
(gdb) c
by: diciu