2010-05-24 5 views
10

¿Es posible decirle a valgrind que ignore algún conjunto de bibliotecas? Específicamente bibliotecas glibc ..¿Puedo hacer que valgrind ignore las bibliotecas glibc?

Problema real: Tengo un código que funciona bien en la ejecución normal. Sin fugas, etc.

Cuando trato de ejecutarlo a través de valgrind, obtengo volcados de memoria y reinicios/paradas del programa.

Core generalmente apunta a las funciones glibc (generalmente fseek, mutex, etc.). Entiendo que podría haber algún problema con la versión incompatible de glibc/valgrind.

Probé varias versiones de valgrind y glibc pero no tuve suerte. ¿Alguna sugerencia?

Respuesta

3

Sí, mira en Valgrind's suppression system.

+0

Creo que quiere decirle a valgrind que no perfile ciertas funciones glibc, no solo suprima la salida resultante. –

+0

@Tim: ¡Exactamente! Básicamente, quiero que Valgrind los ignore (ejecútelos como en la ejecución normal) – Jack

+0

@Jack: para eso, tendrá que familiarizarse con los internos de Valgrind. Realmente sugiero echar un vistazo a valgrind/valgrind.h, es difícil sugerir algo a menos que publiques el resultado que recibiste de valgrind. –

1

Probablemente desee preguntar sobre esto en el Valgrind user's mailing list (que es extremadamente útil). Puede suprimir la salida de ciertas llamadas, sin embargo, suprimir el ruido es todo lo que está haciendo. Las llamadas todavía están pasando por Valgrind.

Para lograr lo que necesita, (idealmente) combine Valgrind adecuadamente con glibc o utilice las macros en valgrind/valgrind.h para solucionarlos. Usando esos, sí, puedes decirle a valgrind que no toque ciertas cosas. No estoy seguro de qué llamadas están ejecutando todo, pero también puedes (selectivamente) no ejecutar bits de código en tu propio programa si se ejecuta bajo valgrind. Consulte la macro RUNNING_ON_VALGRIND en valgrind/valgrind.h.

Lo otro que viene a la mente es asegurarse de que Valgrind se haya compilado correctamente en deal with threads. Tenga en cuenta que las operaciones atómicas bajo Valgrind podrían hacer que su programa se bloquee durante las operaciones de carrera, donde de lo contrario no podría, si no está configurado correctamente.

Si ha estado intercambiando versiones de valgrind y glibc, existe la posibilidad de que encuentre una coincidencia, pero valgrind configurado incorrectamente en tiempo de compilación.

4

Según lo observado por unwind, valgrind tiene un elaborado mecanismo para controlar qué procedimientos están instrumentados y cómo. Pero valgrind y glibc son bestias complicadas, y realmente, realmente, realmente no quieres hacer esto. La forma más fácil de obtener un glibc y valgrind que sean mutuamente compatibles es obtener ambos de la distribución de Linux de su elección. Las cosas deberían "funcionar", y si no lo hacen, tienes a alguien a quien quejarse.

6

Esto probablemente no responde a tu pregunta, pero le proporcionará los detalles de cómo suprimir ciertos errores (que otros han aludido pero no se han descrito en detalle):

primer lugar, ejecute valgrind de la siguiente manera:

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

Ahora el archivo de salida valgrind.out contendrá algunos bloques de supresión generadas automáticamente como el siguiente:

{ 
    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 
} 

Donde "estúpido error sendmsg" y el enlace son el nombre que agregué para referirse a este bloque.Ahora, guarde ese bloque a sendmsg.suppvalgrind y contar acerca de ese archivo en la próxima ejecución:

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

Y valgrind se amablemente ignorar ese error aguas arriba estúpida.

Cuestiones relacionadas