2010-05-24 6 views
10

È possibile dire a valgrind di ignorare alcune serie di librerie? In particolare librerie glibc ..Posso fare in modo che valgrind ignori le librerie di glibc?

Problema effettivo: Ho un codice che funziona bene nell'esecuzione normale. Nessuna perdita, ecc.

Quando provo a eseguirlo attraverso valgrind, ottengo core dump e il programma si riavvia/si ferma.

Il nucleo di solito punta alle funzioni di glibc (di solito fseek, mutex ecc.). Capisco che potrebbe esserci qualche problema con la versione di glibc/valgrind incompatibile.

Ho provato varie versioni di valgrind e versioni di glibc ma senza fortuna. Qualche suggerimento?

risposta

3

Sì, guarda su Valgrind's suppression system.

+0

Penso che voglia dire a valgrind di non profilare certe funzioni di glibc, non solo di sopprimere l'output risultante. –

+0

@Tim: Esattamente! Fondamentalmente voglio che valgrind li ignori (eseguirli come nell'esecuzione normale) – Jack

+0

@Jack - per questo dovresti familiarizzare con gli interni di valgrind. Vi suggerisco di dare un'occhiata a valgrind/valgrind.h, è difficile suggerire qualcosa a meno che non pubblichiate l'output che avete ricevuto da valgrind. –

1

Probabilmente vorrai chiedere questo allo Valgrind user's mailing list (che è estremamente utile). È possibile sopprimere l'output da determinate chiamate, tuttavia, sopprimere il rumore è tutto ciò che si sta facendo. Le chiamate stanno ancora attraversando Valgrind.

per realizzare quello che vi serve, è (idealmente) abbinare Valgrind adeguatamente con glibc o utilizzare le macro in valgrind/valgrind.h a lavorare intorno a loro. Usando quelli, sì, puoi dire a Valgrind di non toccare certe cose. Non sono sicuro di quali chiamate stiano borkando tutto, tuttavia puoi anche (in modo selettivo) non eseguire bit di codice nel tuo programma se eseguito sotto valgrind. Vedere la macro RUNNING_ON_VALGRIND in valgrind/valgrind.h.

L'altra cosa che viene in mente è assicurarsi che Valgrind sia stato compilato correttamente su deal with threads. Tieni presente che le operazioni atomiche sotto Valgrind potrebbero causare il crash del tuo programma durante le operazioni di gara, dove altrimenti non potrebbe, se non configurato correttamente.

Se si stanno scambiando le versioni di valgrind e glibc, è possibile che si sia trovata una corrispondenza, ma in modo errato configurato valgrind in fase di compilazione.

4

Come notato da unwind, valgrind ha un meccanismo elaborato per controllare quali procedure sono strumentate e come. Ma sia i valgrind che gli glibc sono bestie complicate e tu davvero, davvero, davvero non vuoi farlo. Il modo più semplice per ottenere un glibc e valgrind che siano reciprocamente compatibili è quello di ottenere dalla distro Linux di tua scelta. Le cose dovrebbero "funzionare", e se non lo fanno, c'è qualcuno con cui lamentarsi.

6

Questo probabilmente non rispondere alla tua domanda, ma vi fornirà le specifiche di come sopprimere alcuni errori (che altri hanno alluso, ma non hanno descritti in dettaglio):

In primo luogo, eseguire valgrind come segue:

valgrind --gen-suppressions=all --log-file=valgrind.out ./a.out 

Ora il file di output valgrind.out conterrà alcuni blocchi di soppressione generati automaticamente come il seguente:

{ 
    stupid sendmsg bug: http://sourceware.org/bugzilla/show_bug.cgi?id=14687 
    Memcheck:Param 
    sendmsg(mmsg[0].msg_hdr) 
    fun:sendmmsg 
    obj:/usr/lib/libresolv-2.17.so 
    fun:__libc_res_nquery 
    obj:/usr/lib/libresolv-2.17.so 
    fun:__libc_res_nsearch 
    fun:_nss_dns_gethostbyname4_r 
    fun:gaih_inet 
    fun:getaddrinfo 
    fun:get_socket_fd 
    fun:main 
} 

Dove "stupido sendmsg bug" e il collegamento sono il nome che ho aggiunto per fare riferimento a questo blocco.Ora, fermo restando che al blocco sendmsg.supp e dire valgrind su quel file sulla prossima corsa:

valgrind --log-file=valgrind --suppressions=sendmsg.supp ./a.out 

E valgrind sarà gentilmente ignorare quello stupido errore a monte.

Problemi correlati