2010-11-11 34 views
5

que acaba de comenzar el aprendizaje del uso valgrind y la --tool = memcheckCómo utilizar con eficacia valgrind

Pero lo que estoy teniendo problemas con que en realidad la búsqueda de los problemas.

p. Ej.

Uno de estos problemas es esto.

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

y otra es esta

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

estoy después de algunos consejos sobre cómo trazar con mayor eficacia este tipo de problemas. (Los saltos condicionales y los valores no inicializados.)

EDITAR

¿Es esta nada de qué preocuparse? Parece desaparecer con la opción --run-libc-freeres=no. ¿Eso significa que tengo una biblioteca con errores C?

==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 una herramienta muy importante para poder usar –

+0

Los valores no inicializados se explican en QuickStart de Valgrind http://valgrind.org/docs/manual /QuickStart.html (aproximadamente 12 párrafos en total, menos sobre los valores no inicializados). – isomorphismes

Respuesta

15

Básicamente, cada error de Valgrind muestra un seguimiento de la pila. Las partes más altas del seguimiento de la pila pueden no serle de gran utilidad, ya que hacen referencia al código de la biblioteca. Sin embargo, en última instancia, estos problemas se derivan de problemas en su código. Comience escaneando la primera parte del seguimiento de la pila que hace referencia a una línea de código en su aplicación (a diferencia de una función de biblioteca). Si examina el seguimiento de la pila, verá que la línea 198 de obbs.cpp es el punto su aplicación conduce a la causa de su primer problema. Más arriba en la pila, puede ver que la línea 63 de mUUID.h es en última instancia donde se evalúa la variable no inicializada, ya sea a través de una declaración if, o un ciclo.

El error "Conditional jump or move depends on uninitialised value(s)" significa que tiene una variable no inicializada que se utiliza para afectar el flujo de su programa. En su caso, parece que está pasando una variable no inicializada a una función de biblioteca de Boost, y la función de biblioteca llama a su clase de controlador que evalúa la variable no inicializada en una instrucción condicional. Esto significa que su programa exhibe un comportamiento indefinido.

Un ejemplo trivial que podría causar este problema sería algo así como:

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

Empezar comprobando la línea 198 de obbs.cpp y subir el seguimiento de la pila hasta que se da cuenta del problema.

También agregaré que errores como este a veces pueden ser detectados por el compilador, si compila con todas las advertencias. (En GCC, por ejemplo, asegúrese de compilar con el indicador -Wall)

+1

Gracias por la sugerencia. ¿Valgrind se equivoca a veces? No hay variables no inicializadas que pueda ver. ¿Qué hay de la inicialización tardía? – Matt

+3

Valgrind casi nunca informa falsos positivos. –

+0

Intente buscar más arriba en el seguimiento de la pila, por ejemplo en la línea 63 de 'mUUID.h' donde se invoca su controlador de devolución de llamada. ¿Se han inicializado todas las variables miembro de su clase de controlador? –