This shows you the differences between two versions of the page.
|
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 | ||
| - | $3 = 1073792080 | + | $4 = 1073792080 |
| (gdb) next | (gdb) next | ||
| 7 return c; | 7 return c; | ||
| (gdb) print c | (gdb) print c | ||
| - | $4 = 3 | + | $5 = 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 ]] | ||