Navigation

 ·   Wiki Home
 ·   Wiki Help
 ·   Categories
 ·   Title List
 ·   Uncategorized Pages
 ·   Random Page
 ·   File Upload
 ·   Uploaded Files
 ·   Recent Changes
 ·   RSS
 ·   Atom
 ·   What Links Here

Active Members:

 ·  akun2500
 ·  alexander
 ·  amenono
 ·  Andrews
 ·  balintc
 ·  bCtz123
 ·  Boneaparte
 ·  cata_sun
 ·  claudiuT
 ·  ctzbz
 ·  Dan Frăticiu
 ·  DanI2020
 ·  daniel.t
 ·  DannyG
 ·  Dariadmv
 ·  DGC
 ·  doro
 ·  DoT
 ·  Eugyca
 ·  Farfelkugel
 ·  floriano
 ·  ghibualex
 ·  haris
 ·  Hubba Bubba
 ·  huk
 ·  ibm390s
 ·  ixul
 ·  lipitoarea1996
 ·  LoveTrance
 ·  MaC®
 ·  macgabi
 ·  macuser_buc
 ·  Maz11
 ·  oldies
 ·  pitagora
 ·  smighel
 ·  toma
 ·  vicster
 ·  vladr76
 ·  _vrx_

Search:

 

Create or Find Page:

 

View Programare-C-GDB

Category:Programare -> C

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-[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ă.

(gdbx/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*(int *)($ebp 8) + 12
$3841436
(gdb*(int *)3841436
$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.

(gdbcomm
Type commands 
for when breakpoint 4 is hitone per line.
End with a line saying just "end".
>
set {int}3841436 4200
>end
(gdb

776d5f5c9c2bf72a0f416336e4957185

by: diciu

Categories: