Memory debug

hamming_burst
Salve, vorrei chiedere una mano.
Sto implementando un progetto per un corso in università, sarebbe un Database Relazionale semplificato con concorrenza allestito per funzionare con device driver, in linguaggio C con pthread.

Tale progetto però mi ha dato parecchie grande con problemi di segmentation fault in ambiente user space (kernel space funziona egregiamente).
Debaggando con gdb (ddd) ho trovato il punto di rottura di tutto il programma, cioè il punto da dove c'è il segmentation fault. Sarebbe l'allocazione di un'n-esima struttura dati ce ne sono molte, propriamente durante la malloc di un array di puntatori a stringhe, e allocando le strighe a sua volta.
Ma non trovo il punto da dove parte tutti gli overflow.

Visto che ho sentito parlare molte volte di strumenti più potenti per il debugging della memoria, vorrei chiedere a qualcuno che conosce tali programmi per spiegarmene almeno uno.
Quelli che conosco e che mi hanno consiglato sono:

- valgrind
- efence
- Dmalloc

La dmalloc ho cercato qualcosa, ma per attivare le funzionalità del logging della schell non ci riesco, e l'attivazione nel gcc men che meno. (le librerie di tutte i sistemi detti sopra soo già a posto)

Praticamente potreste dirmi come attivare almeno una di queste funzionalità?

Grazie mille a chi aiuta :)

Risposte
Rggb1
"ham_burst":
Tale progetto però mi ha dato parecchie grande con problemi di segmentation fault in ambiente user space (kernel space funziona egregiamente).

Welcome in segfault world! :-D

"ham_burst":
Debaggando con gdb (ddd) ho trovato il punto di rottura di tutto il programma, cioè il punto da dove c'è il segmentation fault. Sarebbe l'allocazione di un'n-esima struttura dati ce ne sono molte, propriamente durante la malloc di un array di puntatori a stringhe, e allocando le strighe a sua volta.
Ma non trovo il punto da dove parte tutti gli overflow.

hm? Puoi far vedere il pezzo di codice incriminato?

"ham_burst":
Quelli che conosco e che mi hanno consiglato sono:
- valgrind
- efence
- Dmalloc

Valgrind esegue in sottoambiente controllato, mentre con Electric Fence devi compilare con le librerie, e normalmente si usa per progetti grandi; quindi forse ti è più utile valgrind.
Non lo conosco, sorry, ma ho colleghi che ne parlano bene.

hamming_burst
ho provato ad usare efence visto che è una libreria, mi sembra che è più veloce da usare.

Compilando con flag -lefence mi ha mostrato un fantastico SIGSEGV in un punto che non mi mostrava il normale debugging con gdb, e mi ha illuminato.

Avevo scritto una fantastica funzione alle 3 di notte che deallocava una struttura, che avevo prestabilito nella progettazione che allocavo e deallocavo all'inizio e alla fine di tutto il programma, e non ogni volta all'utilizzo.

Perciò entravo in spazi di inirizzamento che deallocavo.

Fantastica sta libreria :D

Mamma mia quanto detesto i segfault, tutto compila, tutto progettato alla perfezione o quasi, e un bel segfault ti fa arrendere.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.