61 votes

Est-il possible de faire valgrind ignorer certaines bibliothèques?

Ou, de préférence, tous au lieu de juste mon code? Mon programme utilise Gtk, grande gueule et quelques autres choses, et ces deux-là (et pour certains, derrière eux, libgcrypto, libssl) sont à l'origine de nombreuses erreurs que je n'arrive pas à détecter mon propre. Est-il possible de faire valgrind ignorer ce qui vient de plus profond que mon propre code?

52voto

mormegil Points 177

En supposant que vous êtes l'exécution de la memcheck outil et que vous voulez ignorer la Fuite des erreurs dans libcrypto seulement, vous pouvez essayer une répression comme:

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

Pour ignorer la Fuite des erreurs dans toutes les bibliothèques partagées en vertu de toute lib du répertoire (/lib, /lib64, /usr/lib, /usr/lib64, ...):

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

Son peu probable, mais vous devrez peut-être ajouter d'autres variations du répertoire de modèle pour tenir compte de l'emplacement de l'X11 et les librairies GTK.

Méfiez-vous que cela va ignorer les erreurs causées par les rappels que vous avez écrit qui ont été invoquées par les bibliothèques. La capture des erreurs dans ces rappels pourrait presque être fait avec:

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

... mais cela révèle des erreurs dans les appels par une bibliothèque qui utilisent le Valgrind malloc. Depuis valgrind malloc est injecté directement dans le texte du programme -- pas chargé comme une bibliothèque dynamique -- il apparaît dans la pile de la même façon que votre propre code ne. Cela permet Valgrind pour suivre les allocations, mais la rend aussi plus difficile à faire exactement ce que vous avez demandé.

Pour info: je suis en utilisant valgrind 3.5.

10voto

Douglas Leeder Points 29986

Vous pouvez générer des suppressions pour les erreurs pour les bibliothèques, mais je ne pense pas que vous pouvez exclure les bibliothèques en général.

Aussi, il est difficile de savoir automatiquement si une erreur de mémoire dans la bibliothèque est causée par un problème dans votre code ou pas.

7voto

jilles Points 4241

Avec OpenSSL en particulier, c'est très dur. Les clés de cryptage SSL reposent en partie sur des non initialisée pile d'ordures, ce qui signifie que toutes les données déchiffrées est contaminé trop. Cette contamination a tendance à se propager au-delà OpenSSL lui-même.

La compilation d'OpenSSL avec un "PURIFIER" option peut aider à ici. Malheureusement, en raison de certains mal pensé actions par une grande distribution Linux, il est peu probable de devenir par défaut.

Un très émoussé solution de contournement est memcheck de l' --undef-value-errors=no option.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X