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

tad*_*zik 50 valgrind suppress-warnings

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

mor*_*gil 38

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

{
   ignore_libcrypto_conditional_jump_errors
   Memcheck:Leak
   ...
   obj:*/libcrypto.so.*
}
Run Code Online (Sandbox Code Playgroud)

...成一个文件,并把它传递给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.*
}
Run Code Online (Sandbox Code Playgroud)

这不太可能,但您可能需要添加目录模式的其他变体以考虑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.*
}
Run Code Online (Sandbox Code Playgroud)

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

仅供参考:我使用的是valgrind 3.5.

  • 这个答案唯一缺少的是如何处理抑制文本...... (7认同)
  • 这些设置旨在保存到Valgrind启动时读取的抑制文件中.选项--suppressions = <filename>请参阅http://valgrind.org/docs/manual/manual-core.html (7认同)

Dou*_*der 10

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

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

  • http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress这是有关valgrind的错误抑制信息的链接. (5认同)

jil*_*les 6

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

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

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