59

或者最好是全部而不是我的代码?我的程序使用 Gtk、Loudmouth 和其他一些东西,而这两个(以及它们后面的一些,libgcrypto、libssl)本身导致了很多错误,以至于我无法检测到自己的错误。是否有可能让 valgrind 忽略来自比我自己的代码更深的东西?

4

3 回答 3

50

假设您正在运行memcheck工具并且您只想忽略libcrypto中的泄漏错误,您可以设置如下抑制

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

...放入一个文件并将其传递给valgrindwith --suppressions=*FILENAME*

要忽略任何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.*
}

这不太可能,但您可能需要添加目录模式的其他变体来说明 X11 和 GTK 库的位置。

请注意,这将忽略由您编写的任何由库调用的回调引起的错误。在这些回调中捕获错误几乎可以通过以下方式完成:

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

...但这揭示了使用 Valgrind malloc 的库调用中的错误。由于 valgrind malloc 直接注入到程序文本中——不是作为动态库加载的——它在堆栈中的显示方式与您自己的代码相同。这允许 Valgrind 跟踪分配,但也使得准确地按照您的要求进行操作变得更加困难。

仅供参考:我正在使用 valgrind 3.5。

于 2013-02-08T19:00:44.610 回答
10

您可以为库的错误生成抑制,但我认为您通常不能排除这些库。

此外,很难自动知道库中的内存错误是否是由代码中的问题引起的。

于 2010-07-04T11:40:34.250 回答
7

特别是对于 OpenSSL,这非常困难。SSL 加密密钥部分基于未初始化的堆栈垃圾,这意味着所有解密的数据也受到污染。这种污染往往会蔓延到 OpenSSL 本身之外。

使用“PURIFY”选项编译 OpenSSL 可能会有所帮助。不幸的是,由于主要 Linux 发行版的一些考虑不周的行为,这不太可能成为默认设置。

一个非常直接的解决方法是 memcheck 的--undef-value-errors=no选项。

于 2010-07-04T13:15:26.970 回答