Newsgroup: it.comp.os.linux.development
Titolo: Controllo cavolate ovvero debugging

Salve,
volevo sapere che cosa e, perchè no, come utilizzare uno strumento che 
mi permetta di vedere quando a tempo di esecuzione - programmando in c - 
vado a scrivere su un'area di memoria non allocata e quindi incasino 
tutto il programma..
Ho provato ad usare gdb -che non conosco, e magari forse fa quello che 
voglio-, e riesco ad ottenere un qualcosa di questo tipo, ma a me dice 
poco..
Program received signal SIGSEGV, Segmentation fault.
0x08086000 in ?? ()
Come posso capire quando ma soprattutto in che blocco di istruzioni vado 
a scrivere oltre i limiti??
grazie


Prova a linkare il programma con libefence. Debuggandolo con gdb dovresti
ruscire a risalire al problema.
Alessandro.

 ruscire a risalire al problema.
scusa l'ignoranza.. ho provato a guardare su google, e da quel che ho 
capito devo installare ilpacchetto electric-fence. Ok, questo l'ho fatto.
Una volta installato, mi potresti dire in che modo dovrei linkarlo??
grazie


Aggiungi il flag "-lefence" all'invocazione del gcc che ti crea il file.
Esempio:
gcc hello.c -lefence -o hello
Alessandro.


Suppongo che il "-g" per il debug ci sia gia', altrimenti aggiungilo.
Alessandro.

Grazie mille!!
Ho beccato l'errore!!!
Adesso ho visto un altro comportamento analogo del programma al quale 
sto lavorando, ma purtroppo libefence non mi viene in aiuto.. :-(
Il problema, sempre un segmentation fault, credo sia dovuto allo 
strabocco di qlc array o ad un modo non corretto di utilizzare 
strncpy... però il messaggio di errore che ottengo, è quantomai generico 
(e lo riporto qua sotto), mentre prima ho ottenuto un chiaro riferimento 
ad una chiamata a free, e così ho risolto.. Non è che per caso esiste un 
qlc altro strumento che mi può venire incontro?? Immagino ne esistano 
davvero tanti.. mi potete dare, anche a livello puramente informativo, 
qlc info su dove trovare questi strumenti e/o quali utilizzare?? Un 
"debugging tools" su google è infatti un po troppo generico.. :-)
[Switching to Thread 16384 (LWP 6429)]
0x40191c08 in ?? ()
Grazie ancora

"debugging tools" su google è infatti un po troppo generico.. :-)
]zac[
Non credo che troverai quel che cerchi, il c e il c++ non hanno nessun
tipo di controllo di accesso alla memoria, non c'e' niente che segnali
se un'area è allocata o no, non c'e' controllo sui limiti dei vettori o
altro.
La potenza del c e c++ sta proprio nell'evitare controlli 'inutili' e
'costosi', e' compito del programmatore assicurarsi di non uscire dai
'limiti', nel pretendere una profonda 'prudenza' nell'uso di variabili,
vettori, puntatori, nel tutto ti è permesso, se riesci a farlo
funzionare.
I programmi in c e c++ non è che si bloccano perchè è stata usata
memoria non allocata, ma perchè è stato cercato di usare memoria che non
è accessibile, di solito l'errore è prima del punto dove si genera il
messaggio del debugger.
Se cerchi dei controlli più stringenti è probabile che devi usare
linguaggi di più 'alto livello', più 'sicuri' da usare ma sicuramente
meno potenti.

 dovresti ruscire a risalire al problema.
cosa fa la libreria? non basta il flag -g?

Ottavio Campana:

Che io sappia traccia l'esecuzione delle malloc/free effettuando dei
controlli (per esempio viene se richiamata la free 2 volte sullo stesso
puntatore).
In pratica fa in modo di segnalarti il punto esatto in cui avviene l'errore,
mentre altrimenti il segmentation fault potrebbe essere segnalato su
istruzioni non legate strettamente all'errore.
Mi e' stato consigliato di usarla qualche mesetto fa su questo newsgroup,
fai una ricerca su google se ti interessa.
Alessandro.


Hai provato a dare il comando "back" per vedere lo stack delle chiamate? Se
funziona puoi usere il comando "up" per risalire alla funzione chiamante.
Alessandro.

0x08086000 in ?? ()
qualcosa di piu` significativo al posto dei ??
Adesso dai il comando 'where' e avrai lo stack delle chiamate
al momento del core dump con tanto di indicazioni delle righe
di codice sorgente incriminate.
ciao
	Andrea
-- 
Per favore non inviatemi file in formato .exe .doc .xls o .pps
Please, don't send me .exe .doc .xls or .pps attachments