This shows you the differences between two versions of the page.
programare:debugging [2016/10/31 08:45] laura.vasilescu [Pun printf dar nu apare, iar apoi crapă programul] |
programare:debugging [2016/10/31 08:57] (current) laura.vasilescu [Warning-uri de compilare] |
||
---|---|---|---|
Line 30: | Line 30: | ||
Warning-urile pot duce la rezultate eronate. Exemplu de posibile warning-uri: | Warning-urile pot duce la rezultate eronate. Exemplu de posibile warning-uri: | ||
+ | * folosirea unei variabile neinițializate | ||
* atribuirea de număr cu semn unui întreg fără semn | * atribuirea de număr cu semn unui întreg fără semn | ||
* cast-uri de la int la char (deci cu diminuare de spațiu) | * cast-uri de la int la char (deci cu diminuare de spațiu) | ||
Line 41: | Line 42: | ||
==== Segmentation fault / stack smashing detected ==== | ==== Segmentation fault / stack smashing detected ==== | ||
+ | Erorile de genul aceasta înseamnă, pe scurt, că undeva faceți un acces nevalid de memorie. Cel mai frecvent, cauza poate să fie una din următoarele: | ||
+ | * accesați printr-un indice un element într-un vector nealocat (exemplu: dacă vectorul a fost declarat //int v[100]//, iar voi accesați //v[100]// sau chiar cu un indice mai mare sau cu unul negativ) | ||
+ | * folosiți o funcție recursivă care nu are condiție de oprire, sau condiția acesteia nu funcționează corect sau nu acoperă cazul din testul rulat | ||
+ | * apelați funcția //free// pe o zonă de memorie nealocată sau pe una care a fost eliberată anterior | ||
+ | * etc. | ||
+ | |||
+ | Pentru a identifica problemele în cazul acesta puteți să folosiți [[http://ocw.cs.pub.ro/courses/programare/debugging?&#other|printf stylel debugging]], cu mențiunea de [[http://ocw.cs.pub.ro/courses/programare/debugging?&#pun_printf_dar_nu_apare_iar_apoi_crapa_programul|a fi atenți cum folosiți afișarea]]. | ||
+ | |||
+ | Pentru a identifica mai ușor punctul în care se întâmplă eroarea recomandăm folosirea [[https://www.cs.cmu.edu/~gilpin/tutorial/|gdb]] sau [[http://valgrind.org/docs/manual/QuickStart.html|valgrind]]. | ||
+ | |||
+ | Pentru ambele tool-uri vom avea nevoie să adăugăm la compilare flag-ul **-g** pentru a activa simbolurile de debugging. Astfel: | ||
+ | <code> | ||
+ | gcc -g -Wall ex1.c -o exe | ||
+ | </code> | ||
+ | |||
+ | Spre exemplu, o rulare simplă cu //valgrind// ar arăta așa (dacă programul are argumente le adăugați în continuare): | ||
+ | <code> | ||
+ | valgrind ./exe | ||
+ | </code> | ||
+ | |||
+ | Urmăriți output-ul generat. Ar trebui să vă spună exact linia pe care se întâmplă eroarea și cauza acesteia. Mai multe detalii în tutoriale. | ||
==== Pun printf dar nu apare, iar apoi crapă programul ==== | ==== Pun printf dar nu apare, iar apoi crapă programul ==== | ||