2010-03-03 10 views
30

Estoy tratando de usar Valgrind en un programa en el que estoy trabajando, pero Valgrind genera un montón de errores para una de las bibliotecas que estoy usando. Me gustaría poder decirle que suprima todos los errores que involucran esa biblioteca. La regla más cercana que puedo encontrar para el archivo de supresión es¿Cómo le dice a Valgrind que suprima por completo un archivo .so en particular?

{ 
    rule name 
    Memcheck:Cond 
    ... 
    obj:/path/to/library/thelibrary.so 
} 

Esto no hace el trabajo por completo, sin embargo. Tengo que crear uno de estos para cada tipo de supresión que aparece (Cond, Value4, Param, etc.), y parece que aún se pierden algunos errores que tienen la biblioteca en el seguimiento de la pila.

¿Hay alguna manera de darle a Valgrind una sola regla de supresión para que ignore por completo una biblioteca en particular? E incluso si no hay forma de hacer una regla que cubra todos los tipos de supresión, ¿existe al menos una forma de crear una regla que ignore todos los errores de un tipo de supresión particular de una biblioteca en particular?

+0

Puede que desee preguntar esto en el correo valgrind l ist también. –

Respuesta

29

Para la mayoría de los tipos de supresión, se omite el comodín, así:

{ 
    name 
    Memcheck:Cond 
    obj:/path/to/lib/lib.so.10.1 
} 

{ 
    name 
    Memcheck:Free 
    obj:/path/to/lib/lib.so.10.1 
} 

{ 
    name 
    Memcheck:Value8 
    obj:/path/to/lib/lib.so.10.1 
} 

Observe que debe enumerar cada tipo de error por separado, no se puede comodín ellos. También debe listar la ruta completa de la biblioteca (como se muestra en valgrind, con cualquier "decoración" como números de versión).

Además, las fugas se manejan de manera diferente - para los que se necesita algo que se parece a esto:

{ 
    name 
    Memcheck:Leak 
    fun:*alloc 
    ... 
    obj:/path/to/lib/lib.so.10.1 
    ... 
} 
+11

Solo un comentario porque me confundí: los tres puntos representan los comodines de invocación/uso y los marcadores de posición * not * como si fuera mi primera suposición;) – Eric

+0

Eric - el "..." se llama "comodín de nivel de marco", y se discute en el [Manual básico de Valgrind en la Sección 2.5] (http://valgrind.org/docs/manual/manual-core.html). – jww

14

Parece ser que es necesario incluir un registro de supresión separada para cada tipo de error (Cond , Value4, Param, etc.). Pero basado en mis pruebas con valgrind-3.6.0.SVN en Debian, creo que se puede utilizar el siguiente formulario simplificado para cada tipo de error ...

{ 
    <insert_a_suppression_name_here> 
    Memcheck:Cond 
    ... 
    obj:/path/to/library/thelibrary.so.* 
    ... 
} 

{ 
    <insert_a_suppression_name_here> 
    Memcheck:Leak 
    ... 
    obj:/path/to/library/thelibrary.so.* 
    ... 
} 

Los tres puntos son llamados comodines a nivel de trama en los documentos de Valgrind. Estos coinciden con cero o más cuadros en la pila de llamadas. En otras palabras, los usa cuando no importa quién llamó a la biblioteca, o qué funciones la biblioteca posteriormente llama al.

A veces los errores incluyen marcos "obj:" y, a veces solo utilizan marcos "divertidos". Esto se basa, en general, en si esa función se incluye o no en la tabla de símbolos de la biblioteca. Si el objetivo es excluir toda la biblioteca, puede funcionar mejor si la biblioteca no incluye los símbolos para que pueda excluir en función del nombre de archivo de la biblioteca en lugar de tener que crear supresiones separadas para cada llamada de función dentro de la biblioteca. Con suerte, Valgrind es lo suficientemente inteligente como para suprimir los errores basados ​​en el nombre de archivo de la biblioteca, incluso cuando sabe el nombre de la función, pero no he verificado esto.

Si necesita añadir supresiones en base a las funciones individuales dentro de la biblioteca, usted debería ser capaz de usar la misma forma ...

{ 
    <insert_a_suppression_name_here> 
    Memcheck:Leak 
    ... 
    fun:the_name_of_the_function 
    ... 
} 

Nota: Puede incluir --gen-suppressions=all en la línea de comandos valgrind con el fin de ver la forma exacta y los nombres (incluyendo cualquier formateo de C++) necesarios para suprimir cada error.Puede usar esa salida como plantilla para sus registros de supresión, en los que normalmente desea reemplazar la mayoría de las líneas con ... para simplificar el proceso de supresión de todos los errores que puedan ocurrir en asociación con una biblioteca o llamada de función específica.

Nota: <insert_a_suppression_name_here> es un marcador de posición en el que puede escribir el texto descriptivo que desee. Se requiere que no esté en blanco.

2

nobar's answer casi funcionó para mí, pero yo estaba recibiendo un error de sintaxis:

==15566== FATAL: in suppressions file "suppresion.error.txt" near line 4: 
==15566== bad or missing extra suppression info 
==15566== exiting now. 

Para las llamadas al sistema, que tenía que añadir una línea adicional como el docs Estado:

Param errors have a mandatory extra information line at this point, 
which is the name of the offending system call parameter. 

Por lo tanto, terminó con esto y funcionó:

{ 
    <sup_mmap_length> 
    Memcheck:Param 
    mmap(length) 
    ... 
    fun:function_from_offending_lib 
    ... 
} 
Cuestiones relacionadas