Newsgroup: it.comp.lang.c
Titolo: Errore di accesso al segmento di memoria

Già, è il solito errore poco diagnostico.
Mi spiace proporre un problema probabilmente noioso, ma è possibile che 
qualcuni mi sappia dare dei suggerimenti.
Essenzialmente il problema è che ho trasportato un semplice programma C da 
Linux Red-Hat a Suse e, mentre la compilazione non da problemi di sorta, 
quando eseguo il codice ottengo il famigerato errore di "accesso al 
segmento di memoria".
Tramite debug ho appurato che l'errore accade in punto del programma dove si 
ha una chiamata di funzione. Una cosa del tipo:
sldflag = sendLOGData(sbuff);
dove sldflag è un intero e sbuff un puntatore a caratteri. 
Il problema è che la funzione viene eseguita correttamente, il valore di 
ritorno e l'argomento sono quelli che dovrebbero essere, ma non appena 
l'esecuzione della funzione termina il programma si ferma con l'errore 
riportato. Diciamo che se metto un'istruzione prima del return in 
sendLOGData questa viene eseguita, se ne metto una appena dopo la chiamata 
alla funzione questa invece non viene raggiunta. Ovviamente su Red-Hat con 
gli stessi identici input funziona perfettamente.
In pratica brancolo nel buio... qualcuno ha qualche idea?
Grazie,
        Stefano

 qualcuno ha qualche idea?
Compila con -lefence o posta un po' di codice.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Perdona la mia brutale inconpetenza, ma "-lefence" cosa significa? 
        Stefano

 alla funzione questa invece non viene raggiunta.
Il problema sta nella stack.
Ti fallisce la ret.
Praticamente da qualke parte hai sporcato il ret code e quando chiami la ret 
l'ip salta ad un indirizzo sballato (dalle informazioni post-mortem 
dovresti notare che l'indirizzo che ha causato l'eccezione e' lo stesso 
contenuto nell'ip)
X debuggare questa cosa devi prima di tutto capire in quale punto preciso 
della stack si trova il ret code.
per conoscere il punto preciso ti conviene chiamare subito prima di 
sendLOGData una funzione semplice(ma con lo stesso prototipo) che ti dica a 
quale indirizzo e' stato salvato il ret code dopo di che all'interno di 
sendLOGData vedi chi cambia il valore a questo indirizzo, li e' il bug.
Spero che si capisca qualcosa di quello che ho scritto
Ciao,
Drago.

 Drago.
Direi di sì. Cosa intendi però per funzione semplice con lo stesso 
prototipo? 
Ora, a dire il vero, il problema non capita più... ho dichiarato static 
un'array di 40 long che all'interno di sendLOGData era dichiarato 
normalmente, e poi passato come argomenti modificato ad altre funzioni. 
Dopo questa modifica tutto sembra funzionare a dovere. Ha qualche logica la 
cosa?
Comunque moltissime grazie.
        Stefano

         Stefano
Ciao,
Drago

 }
scusa la fretta
 void *getretcode(char *str)


 Perdona la mia brutale inconpetenza, ma "-lefence" cosa significa? 
efence (electric fence) e' una libreria che sostituisce alle *alloc()
della libreria standard delle *alloc() che effettuano dei controlli su
tentativi di scrittura su zone non allocate (ci sono anche altri metodi,
ma io mi trovo comodo con questo), di solito e' installata su tutte le
distribuzioni di Linux. In caso di accesso scorretto alla memoria stampa
una serie di informazioni che (di solito) consentono di trovare l'errore
in maniere molto veloce (man efence per ulteriori info)
-lefence indica al compilatore di usare la libreria efence.
HTH
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Sì, certo. Però sul mio red-hat (7.3) ed anche sul Suse non ho trovato 
risposta con "man efence". Devo intuire che questa libreria non è 
installata o c'è qualcosa d'altro che posso fare? 
In ogni caso, il tema mi sembra possa essere di qualche interesse per un 
incompetente come me, esistono pacchetti software o tecniche specifiche per 
tracciare errori come quello che ho riportato in questo thread oltre a 
quanto già accennato nelle risposte?
Grazie,
        Stefano

         Stefano
