Errore di segmentazione
Ragazzi , quando un programma mi "sputa" fuori un errore di segmentazione l'errore è collegato alla sola esecuzione ?? Io sarei propenso a rispondere in modo affermativo dal momento che durante la compilazione non venga segnalato alcun tipo di problema/anomalia , ma è durante la fase di esecuzione che mi si "alluppa" il programma . Igitur la domanda è : come posso capire quale parte del programma mi da un tale errore ? Ringraziamenti


Risposte
Usa un debugger come GDB oppure usa Valgrind.
Probabilmente hai un puntatore settato male o uguale a NULL (o 0) che non hai controllato. Per trovarlo il modo migliore è comunque quello di usare un debugger. Su che piattaforma (sistema operativo) stai lavorando? Che compilatore e quale editor usi per sviluppare il tuo programma?
Dev C++ ! Potreste consigliarmene uno migliore ? Su Ubuntu utilizzo Eclipse . Replico la precedente domanda anche per Ubuntu !
Puoi usare Code::Blocks o Visual C++ Express* su Windows. Su Ubuntu non ti saprei dire, Ma ci sono diversi programmatori su linux in questa sessione e sicuramente ti sapranno rispondere (anche se ho l'impressione che molti facciano uso di gedit/vim/emacs + gcc/gdc/gprof...).
* Come studente puoi anche scaricarti gratuitamente la versione Professional dell'IDE della Microsoft su questo sito. Devi semplicemente avere un account Live e un'email accademica.
* Come studente puoi anche scaricarti gratuitamente la versione Professional dell'IDE della Microsoft su questo sito. Devi semplicemente avere un account Live e un'email accademica.
Su Ubuntu io usavo GDB direttamente da linea di comando. Basta chiamare gdb, usi il comando "file " per dirgli l'eseguibile da debuggare, "run" fa partire il programma, e quando crasha "backtrace" ti fa vedere la linea di codice in cui è crashato e "print " ti stampa il contenuto di quella variabile in quel momento. Ovviamente ci sono moltissimi altri comandi come spiegato nella guida. Come IDE ti consiglio Code::Blocks, che tra l'altro "gira" anche su windows ed è in grado di esportare i progetti in formato visual c++ (e anche altri IDE).
Se vuoi una GUI per gdb c'è Insight. Personalmente non l'ho mai usato, quindi non so dirti com'è. Valgrind è utile per rilevare memory leak e cose di questo tipo, quindi andrebbe usato quando il programma funziona correttamente. Ovviamente se non allochi la memoria dinamicamente non ne hai bisogno. Almeno da quello che so io e dall'uso che ne facevo io, non so se Valgrind sia anche un debugger, ma sicuramente gdb è più "famoso" in questo senso.
EDIT: Ovviamente per usare gdb devi compilare il tuo programma con le informazioni di debug. Ci sono apposite opzioni su tutti gli IDE per fare questo (in particolare la configurazione "Debug"). Se invece usi gcc da linea di comando devi aggiungere -gdb.
Se vuoi una GUI per gdb c'è Insight. Personalmente non l'ho mai usato, quindi non so dirti com'è. Valgrind è utile per rilevare memory leak e cose di questo tipo, quindi andrebbe usato quando il programma funziona correttamente. Ovviamente se non allochi la memoria dinamicamente non ne hai bisogno. Almeno da quello che so io e dall'uso che ne facevo io, non so se Valgrind sia anche un debugger, ma sicuramente gdb è più "famoso" in questo senso.
EDIT: Ovviamente per usare gdb devi compilare il tuo programma con le informazioni di debug. Ci sono apposite opzioni su tutti gli IDE per fare questo (in particolare la configurazione "Debug"). Se invece usi gcc da linea di comando devi aggiungere -gdb.
"raffamaiden":
Valgrind è utile per rilevare memory leak e cose di questo tipo, quindi andrebbe usato quando il programma funziona correttamente. Ovviamente se non allochi la memoria dinamicamente non ne hai bisogno. Almeno da quello che so io e dall'uso che ne facevo io, non so se Valgrind sia anche un debugger, ma sicuramente gdb è più "famoso" in questo senso.
Non è un debugger, ma comunque ti segnala l'istruzione che ha provocato la seg fault ed eventuali istruzioni che hanno acceduto a zone di memoria non allocate per il programma senza comunque causare seg fault.
Gentilissimi !

