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 ]] |