Newsgroup: it.comp.os.linux.development
Titolo: Vedere gli errori che terminano un programma

Sono nuovo del C e in tante cose mi trovo a disagio, ma ce n'e' una che 
credo proprio sia una laguna mia.
Ho perso il pomeriggio a vedere morire i miei processi figli (un 
pomeriggio straziante) senza uno straccio di indicazione a console di 
cosa era successo.
Alla fine era un & di troppo in una memcpy() che probab. causava un 
segmentation fault o chissa cosa e il processo moriva.
Esiste il modo di avere a video una indicazione dell'errore che termina 
un processo generato dal mio programma?
Ciao
Ux.

 un processo generato dal mio programma?
usare un debugger come gdb?

 usare un debugger come gdb?
Io ho trovato molto agevole l'uso di ddd, che altro non e' che il
front-end grafico di gdb. OTTIMO.
-- 
HappyCactus - Linux User #209744 - 
http://pngstego.sourceforge.net
 
              pngstego 0.3.2 has been released! 
/* Ci sono 10 categorie di persone al mondo: quelle che capiscono */
/* il sistema binario e quelle che non lo capiscono.              */


E' un casino gestire i processi figli con il debugger, almeno quello di 
kdevelop, perche' dopo la fork() continua a tracciare il padre.
Non esiste in C una ON ERROR GOTO xxx del tanto ingiustamente 
bistrattato BASIC ?



ddd (Data Display Debugger), un front-end per gdb, ti offre la possibilità
di effettuare "l'attach" ad un dato processo.
Potrebbe esserti d'aiuto.
Per quanto riguarda "on error goto" in C non esiste nulla. I segmentation
fault sono gestiti a livello di kernel se non sbaglio.
Nel codice devi espressamente inserire i controlli necessari per evitare
di utilizzare le funzioni con valori errati.
Un ottimo metodo e' quello di usare le asserzioni, ossia la "funzione" assert() 
il cui header e' presente in assert.h
Esempio:
#include <assert.h>
int funz(char *ptr, int x)
{
  assert(ptr != NULL);
  *ptr = '\0'; 
  return x+1;
}
In questo modo se fornisci ptr pari a NULL, il programma verra' interrotto e
verra' segnalata automaticamente il fallimento della assert(), con tanto di indicazione
della linea del sorgente a cui si riferisce.
Quest'ultima informazione dovrebbe essere segnalata se hai abilitato le informazioni
di debug nella compilazione dell'eseguibile.
Bye

 un processo generato dal mio programma?
Un altro modo é quello di pre-caricare la libreria libSegfault.so con 
LD_PRELOAD=/lib/libSegfault.so
Quando un processo muore, hai almeno il backtrace da cui risalire dove é 
successo il misfatto.
ciao,
stefano

 front-end grafico di gdb. OTTIMO.
l'ho provato. non mi č piaciuto molto ddd. Comunque č una questione di
gusti.

 esserti d'aiuto.
ma anche col gdb si fa. basta dirgli il pid.

 bistrattato BASIC ?
in gdb: set follow-fork-mode child
per approfondire: info gdb, nodo Debugging programs with multiple 
processes
-- 
#include <stdio.h>/* (C) BW2K+3 This code is released under GPL 2+ */
int main(){char c[]={98,108,97,99,107,119,111,108,102,64,100,101,115,112,
97,109,109,101,100,46,99,111,109,32,119,101,98,46,116,105,115,99,97,108,
105,46,105,116,47,98,108,97,107,119,111,108,102,0};printf("%s\n",c);}

 front-end grafico di gdb. OTTIMO.
prova anche gvd :)
vjt
-- 
pub 1024D/F04476A2 :: 6807 EEA5 7F97 AC9A D8EF  AE73 64CD 71A2 F044 76A2
http://suxserv.sourceforge.net/vjt.asc
        ||  This signature has         
Free advertisement: 
http://www.freebsd.org/
   ||      Super Cow Powers.