2010-07-04 28 views
40

O preferiblemente todos ellos en lugar de solo mi código? Mi programa usa Gtk, Loudmouth y algunas otras cosas, y estos dos (y algunos detrás de ellos, libgcrypto, libssl) están causando tantos errores que no puedo detectar el mío. ¿Es posible hacer que valgrind ignore cosas que vienen de más profundo que mi propio código?¿Es posible hacer que valgrind ignore ciertas bibliotecas?

+1

+1, estoy teniendo los mismos problemas. La biblioteca GL de NVIDIA hace saltos condicionales basados ​​en la memoria no inicializada, y 'std :: string' sigue arrojando falsos positivos (" posiblemente perdidos ") también. – Thomas

Respuesta

12

Puede generar supresiones para los errores de las bibliotecas, pero no creo que pueda excluir las bibliotecas en general.

También es difícil saber automáticamente si un error de memoria en la biblioteca es causado por un problema en su código o no.

+4

http: // valgrind.org/docs/manual/manual-core.html # manual-core.suppress Este es el enlace para obtener información sobre la supresión de errores para valgrind. – blwy10

5

Con OpenSSL en particular, esto es muy difícil. Las claves de cifrado SSL se basan parcialmente en la basura de la pila no inicializada, lo que significa que todos los datos descifrados también están contaminados. Esta contaminación tiende a extenderse más allá de OpenSSL.

La compilación de OpenSSL con una opción "PURIFICAR" puede ayudar aquí. Desafortunadamente, debido a algunas acciones mal pensadas por una gran distribución de Linux, es poco probable que se convierta en default.

Una solución muy directa es la opción --undef-value-errors=no de Memcheck.

+1

Agradable. Ignorar los valores de undef hizo realidad mi caso particular, donde tuve "más de 10000000 errores totales detectados" provenientes de una biblioteca (no OpenSSL), analicé el resto del código. –

28

Suponiendo que está ejecutando la herramienta memcheck y desea ignorar fugas errores en libcrypto única, se puede poner una supresión como:

{ 
    ignore_libcrypto_conditional_jump_errors 
    Memcheck:Leak 
    ... 
    obj:*/libcrypto.so.* 
} 

... en un archivo y pase a valgrind con --suppressions=*FILENAME*.

Ignorar fugas errores en todas las bibliotecas compartidas bajo cualquier directorio lib (/lib, /lib64, /usr/lib, /usr/lib64, ...):

{ 
    ignore_unversioned_libs 
    Memcheck:Leak 
    ... 
    obj:*/lib*/lib*.so 
} 
{ 
    ignore_versioned_libs 
    Memcheck:Leak 
    ... 
    obj:*/lib*/lib*.so.* 
} 

es poco probable, pero puede que tenga que añadir variaciones adicionales del patrón de directorio para dar cuenta de la ubicación de la X11 y Bibliotecas GTK.

Tenga en cuenta que esto ignorará los errores causados ​​por las devoluciones de llamada que escribió que fueron invocadas por las bibliotecas. La captura de errores en las devoluciones de llamada podrían casi pueden hacer con:

{ 
    ignore_unversioned_libs 
    Memcheck:Leak 
    obj:*/lib*/lib*.so 
    ... 
    obj:*/lib*/lib*.so 
} 
{ 
    ignore_versioned_libs 
    Memcheck:Leak 
    obj:*/lib*/lib*.so.* 
    ... 
    obj:*/lib*/lib*.so.* 
} 

... pero esto revela errores en las llamadas por una biblioteca que utilizan el malloc Valgrind. Como valgrind malloc se inyecta directamente en el texto del programa, no se carga como una biblioteca dinámica, aparece en la pila de la misma manera que su propio código. Esto le permite a Valgrind rastrear las asignaciones, pero también hace que sea más difícil hacer exactamente lo que ha pedido.

FYI: Estoy usando valgrind 3.5.

+7

Lo único que falta en esta respuesta es qué hacer con los textos de supresión ... – lvella

+7

Estas configuraciones están destinadas a guardarse en el archivo de supresión que se lee cuando Valgrind se inicia. Opción --suppressions = Ver http://valgrind.org/docs/manual/manual-core.html –

+0

@mormegil accidentalmente rechazó la respuesta. Lo siento – Greg

Cuestiones relacionadas