2010-11-11 7 views
5

Je viens juste de commencer à apprendre à utiliser valgrind et --tool = memcheckComment utiliser efficacement valgrind

Mais ce que je ne parviens pas à trouver avec est en fait les problèmes.

par exemple.

L'un de ces problèmes est le suivant.

==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) 

et une autre est ce

== 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) 

Je suis après quelques conseils sur la façon de tracer le plus efficacement possible ces types de problèmes. (sauts conditionnels et des valeurs non initialisées.)

EDIT

Est-ce rien à craindre? Semble disparaître avec l'option --run-libc-freeres=no. Cela signifie-t-il que j'ai une bibliothèque C buggée?

==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 un outil très important pour pouvoir utiliser –

+0

Les valeurs non initialisées sont expliquées dans le QuickStart de Valgrind http://valgrind.org/docs/manual /QuickStart.html (environ 12 paragraphes au total, moins de valeurs non initialisées). – isomorphismes

Répondre

15

Fondamentalement, chaque erreur Valgrind affiche une trace de pile. Les parties supérieures de la trace de la pile peuvent ne pas vous être très utiles, car elles se réfèrent au code de la bibliothèque. Cependant, ces problèmes découlent finalement de problèmes dans votre code. Commencez par rechercher la première partie de la trace de pile qui fait référence à une ligne de code dans votre application (par opposition à une fonction de bibliothèque). Si vous examinez la trace de pile, vous verrez que la ligne 198 de obbs.cpp votre application menant à la cause de votre premier problème. Plus haut dans la pile, vous pouvez voir que la ligne 63 de mUUID.h est finalement où la variable non initialisée est évaluée, soit par l'intermédiaire d'une instruction if, ou une boucle. L'erreur "Conditional jump or move depends on uninitialised value(s)" signifie que vous avez une variable non initialisée qui est utilisée pour affecter le flux de votre programme. Dans votre cas, il semble que vous transmettez une variable non initialisée à une fonction de bibliothèque Boost, et la fonction de bibliothèque appelle votre classe de gestionnaire qui évalue la variable non initialisée dans une instruction conditionnelle. Cela signifie que votre programme présente un comportement indéfini.

Un exemple trivial qui causerait ce problème serait quelque chose comme:

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

Commencez par vérifier la ligne 198 de obbs.cpp et déplacer la trace de la pile jusqu'à ce que vous réalisez le problème.

J'ajouterai également que des erreurs comme celle-ci peuvent parfois être détectées par le compilateur, si vous compilez avec tous les avertissements. (Dans GCC, par exemple, assurez-vous de compiler avec le flag -Wall)

+1

Merci pour l'indice. Est-ce que valgrind se trompe parfois? Il n'y a pas de variables non initialisées que je peux voir. Qu'en est-il de l'initialisation tardive? – Matt

+3

Valgrind ne signale presque jamais de faux positifs. –

+0

Essayez de rechercher plus loin la trace de la pile, par exemple à la ligne 63 de 'mUUID.h' où votre gestionnaire de rappel est appelé. Toutes les variables membres de votre classe de gestionnaire sont-elles initialisées? –