是否有可能使valgrind忽略某些库?

时间:2010-07-04 11:24:02

标签: valgrind suppress-warnings

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

3 个答案:

答案 0 :(得分:37)

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

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

...进入文件并使用valgrind将其传递给--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。

答案 1 :(得分:10)

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

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

答案 2 :(得分:6)

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

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

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