2010-11-11 7 views
5

Ho appena iniziato imparando a usare valgrind e la --tool = memcheckCome utilizzare efficacemente Valgrind

Ma quello che sto avendo difficoltà con è in realtà trovare i problemi.

ad es.

Uno di questi problemi è questo.

==12561== Conditional jump or move depends on uninitialised value(s) 
==12561== at 0x425779: Server::HandleReceiveFrom(boost::system::error_code const&, unsigned long) (mUUID.h:63) 
==12561== by 0x428EC4: boost::asio::detail::reactive_socket_recvfrom_op<boost::asio::mutable_buffers_1, boost::asio::ip::basic_endpoint<boost::asio::ip::udp>, boost::_bi::bind_t<void, boost::_mfi::mf2<void, Server, boost::system::error_code const&, unsigned long>, boost::_bi::list3<boost::_bi::value<Server*>, boost::arg<1> (*)(), boost::arg<2> (*)()> > >::do_complete(boost::asio::detail::task_io_service*, boost::asio::detail::task_io_service_operation*, boost::system::error_code, unsigned long) (mem_fn_template.hpp:280) 
==12561== by 0x42E589: boost::asio::detail::task_io_service::run(boost::system::error_code&) (task_io_service_operation.hpp:35) 
==12561== by 0x42720C: Server::Run() (io_service.ipp:57) 
==12561== by 0x42FB00: main (obbs.cpp:198) 

e un altro è questo

== Use of uninitialised value of size 8 
==12561== at 0x5E56091: _itoa_word (_itoa.c:196) 
==12561== by 0x5E573D8: vfprintf (vfprintf.c:1613) 
==12561== by 0x5F0EA6F: __vsnprintf_chk (vsnprintf_chk.c:65) 

che sto cercando alcuni suggerimenti su come rintracciare più efficacemente questi tipi di problemi. (salti condizionati e valori non inizializzate.)

EDIT

È questo qualcosa di cui preoccuparsi? Sembra scomparire con l'opzione --run-libc-freeres=no. Significa che ho una libreria C bacata?

==14754== Invalid free()/delete/delete[] 
==14754== at 0x4C27D71: free (vg_replace_malloc.c:366) 
==14754== by 0x5F43A0A: free_mem (in /lib/libc-2.12.1.so) 
==14754== by 0x5F435A1: __libc_freeres (in /lib/libc-2.12.1.so) 
==14754== by 0x4A2366B: _vgnU_freeres (vg_preloaded.c:62) 
==14754== by 0x5E4A4A4: exit (exit.c:93) 
==14754== by 0x5E2FD94: (below main) (libc-start.c:258) 
==14754== Address 0x4046bb8 is not stack'd, malloc'd or (recently) free'd 
+0

+1 uno strumento molto importante per poter usare –

+0

I valori non inizializzati sono spiegati in QuickStart di Valgrind http://valgrind.org/docs/manual /QuickStart.html (circa 12 paragrafi in totale, un numero inferiore di valori non inizializzati). – isomorphismes

risposta

15

In pratica, ogni errore Valgrind visualizza una traccia stack. Le parti più alte della traccia dello stack potrebbero non essere molto utili, poiché si riferiscono al codice della libreria. Tuttavia, alla fine questi problemi derivano da problemi nel codice. Inizia con la scansione della prima parte della traccia dello stack che fa riferimento a una riga di codice nell'applicazione (al contrario di una funzione di libreria). Se esamini la traccia dello stack, vedrai che la riga 198 di obbs.cpp è il punto in la tua applicazione porta alla causa del tuo primo problema. Più in alto nello stack, è possibile vedere che la linea 63 di mUUID.h è in definitiva il punto in cui viene valutata la variabile non inizializzata, tramite un'istruzione if o un ciclo.

L'errore "Conditional jump or move depends on uninitialised value(s)" indica che si dispone di una variabile non inizializzata che viene utilizzata per influire sul flusso del programma. Nel tuo caso, sembra che tu stia passando una variabile non inizializzata a una funzione della libreria Boost e la funzione della libreria chiama la classe del gestore che valuta la variabile non inizializzata in un'istruzione condizionale. Ciò significa che il tuo programma presenta comportamenti non definiti.

Un esempio banale che potrebbe causare questo problema sarebbe qualcosa di simile:

int i; // uninitialized value 
if (i == 10) { /* ... do something */ } 

Inizia controllando la linea 198 di obbs.cpp e risalire la traccia dello stack fino a quando ci si rende conto del problema.

Aggiungerò anche che errori come questo a volte possono essere rilevati dal compilatore, se si compila con tutti gli avvisi. (In GCC, ad esempio, assicurati di compilare con il flag -Wall)

+1

Grazie per il suggerimento. A volte valgrind si sbaglia? Non ci sono variabili non inizializzate che posso vedere. Che dire di un'inizializzazione tardiva? – Matt

+3

Valgrind non registra quasi mai falsi positivi. –

+0

Provare a cercare più in alto la traccia dello stack, ad esempio alla riga 63 di 'mUUID.h' in cui viene richiamato il gestore di callback. Sono state inizializzate tutte le variabili membro della classe del gestore? –