Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so:laboratoare:resurse:gdb [2013/02/19 08:58]
larisa.grigore [Depanarea unui proces]
so:laboratoare:resurse:gdb [2015/03/18 22:55] (current)
marius.ungureanu93 Explicitly mention function results, fix some diacritics
Line 60: Line 60:
  
 Câteva din comenzile de bază în ''​gdb''​ sunt: Câteva din comenzile de bază în ''​gdb''​ sunt:
-  * **breakpoint** - primeşte ca argument un nume de funcţie (ex: main), un număr de linie şi, eventual, un fişier (ex: break sursa.c:50) sau o adresă (ex: break *0x80483d3).  +  * **b[reakpoint]** - primeşte ca argument un nume de funcţie (ex: main), un număr de linie şi, eventual, un fişier (ex: break sursa.c:50), o funcţie (b sursa.c:​my_function) sau o adresă (ex: breakpoint ​*0x80483d3).  
-  * **next** - va continua execuţia programului până ce se va ajunge la următoarea linie din codul sursă. Dacă linia de executat conţine un apel de funcţie, funcţia se va executa complet.  +  * **n[ext]** - va continua execuţia programului până ce se va ajunge la următoarea linie din codul sursă. Dacă linia de executat conţine un apel de funcţie, funcţia se va executa complet.  
-  * **step** - dacă se doreşte şi inspectarea funcţiilor.+  * **s[tep]** - dacă se doreşte şi inspectarea funcţiilor
 +  * **fin[ish]** - dacă se doreşte ieşirea din funcţia curentă.
  
 Folosirea acestor comenzi este exemplificată mai jos: Folosirea acestor comenzi este exemplificată mai jos:
Line 157: Line 158:
 </​columns>​ </​columns>​
  
-  ***print** - cu ajutorul acesteia se pot afişa valorile variabilelor din funcţia curentă sau a variabilelor globale. ''​print''​ poate primi ca argument şi expresii complicate (dereferenţieri de pointeri, referenţieri ale variabilelor,​ expresii aritmetice, aproape orice expresie C validă). În plus, ''​print''​ poate afişa structuri de date precum ''​struct''​ şi ''​union''​. ​+  ***print** - cu ajutorul acesteia se pot afişa valorile variabilelor din funcţia curentă sau a variabilelor globale. ''​print''​ poate primi ca argument şi expresii complicate (dereferenţieri de pointeri, referenţieri ale variabilelor,​ expresii aritmetice, aproape orice expresie C validă). În plus, ''​print''​ poate afişa structuri de date precum ''​struct''​ şi ''​union'' ​sau evalua funcţii şi întoarcerea rezultatului lor.
  
 <columns 100% 40% -> <columns 100% 40% ->
Line 174: Line 175:
 (gdb) print b (gdb) print b
 $2 = 2 $2 = 2
 +(gdb) print f(a, b)
 +$3 = 3
 (gdb) print c (gdb) print c
-$= 1073792080+$= 1073792080
 (gdb) next (gdb) next
 7               ​return c; 7               ​return c;
 (gdb) print c (gdb) print c
-$= 3+$= 3
 (gdb) finish (gdb) finish
 Run till exit from #0  f (a=1, b=2) at add.c:7 Run till exit from #0  f (a=1, b=2) at add.c:7
Line 221: Line 224:
 </​code>​ </​code>​
 </​columns>​ </​columns>​
- 
 ===== Depanarea unui proces ===== ===== Depanarea unui proces =====
  
Line 276: Line 278:
  
 <code c forktest.c>​ <code c forktest.c>​
- ​1 ​     #include <​stdio.h>​ + 1 #include <​stdio.h>​ 
- ​2 ​     #include <​sys/​types.h>​ + 2 #include <​sys/​types.h>​ 
- ​3 ​     #include <​sys/​wait.h>​ + 3 #include <​sys/​wait.h>​ 
- ​4 ​     #include <​unistd.h>​+ 4 #include <​unistd.h>​
  5  5
  6  6
- ​7 ​     int main(int argc, char **argv) { + 7 int main(int argc, char **argv) { 
- ​8 ​         pid_t childPID = fork();+ ​8 ​    ​pid_t childPID = fork();
  9  9
-10          if (childPID < 0) { +10     ​if (childPID < 0) { 
-11              // An error occured +11         ​// An error occured 
-12              fprintf(stderr,​ "Could not fork!\n"​);​ +12         ​fprintf(stderr,​ "Could not fork!\n"​);​ 
-13              return -1; +13         ​return -1; 
-14          } else if (childPID == 0) { +14     ​} else if (childPID == 0) { 
-15                       +15 
-16              // We are in the child process +16         ​// We are in the child process 
-17              printf("​The child process is executing...\n"​);​ +17         ​printf("​The child process is executing...\n"​);​ 
-18              sleep(2); +18         ​sleep(2); 
-19                     ​ +19 
-20          } else { +20     ​} else { 
-21                       +21 
-22              // We are in the parent process +22         ​// We are in the parent process 
-23              if (wait(NULL) < 0) { +23         ​if (wait(NULL) < 0) { 
-24                  fprintf(stderr,​ "Could not wait for child!\n"​);​ +24             ​fprintf(stderr,​ "Could not wait for child!\n"​);​ 
-25                  return -1; +25             ​return -1; 
-26              +26         ​
-27              printf("​Everything is done!\n"​);​ +27         ​printf("​Everything is done!\n"​);​ 
-28                       +28 
-29          }+29     ​}
 30 30
-31          return 0; +31     ​return 0; 
-32        ​+32 }
 </​code>​ </​code>​
  
Line 365: Line 367:
 Observați că ultimele două mesaje au fost **inversate**,​ față de cazul precedent: debugger-ul încheie procesul copil, apoi procesul părinte afișează mesajul de final (''​Everything is done!''​). ​ Observați că ultimele două mesaje au fost **inversate**,​ față de cazul precedent: debugger-ul încheie procesul copil, apoi procesul părinte afișează mesajul de final (''​Everything is done!''​). ​
  
-=== Nice to read === +==== Nice to read ==== 
-  *[[http://blog.ksplice.com/2011/01/​8-gdb-tricks/ | 8 gdb tricks you should know ]] +  *[[https://blogs.oracle.com/ksplice/entry/8_gdb_tricks_you_should ​| 8 gdb tricks you should know ]] 
 +  ​*[[http://​techblog.rosedu.org/​gdb-a-basic-workflow.html | A basic workflow with GDB ]]
so/laboratoare/resurse/gdb.1361257127.txt.gz · Last modified: 2013/02/19 08:58 by larisa.grigore
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0