Valgrind是否可以忽略某些库?

65

或者更好的方式是全部加入,而不仅仅只是我的代码?我的程序使用Gtk、Loudmouth和其他一些东西,这两个(以及它们背后的一些东西,如libgcrypto、libssl)本身就会导致很多错误,使我无法检测到自己的错误。是否可能使valgrind忽略来自于比我自己的代码更深层的东西?


1
+1,我也遇到了同样的问题。NVIDIA的GL库基于未初始化的内存进行条件跳转,而std::string也会不断抛出错误警告(“可能丢失”)。 - Thomas
3个回答

53
假设您正在运行memcheck工具,并且希望忽略libcrypto中的Leak错误,您可以添加一个suppression,如下所示:
{
   ignore_libcrypto_conditional_jump_errors
   Memcheck:Leak
   ...
   obj:*/libcrypto.so.*
}

将其保存到文件中,并使用valgrind--suppressions=FILENAME参数传递给它。
要忽略任何lib目录(/lib/lib64/usr/lib/usr/lib64等)下的所有共享库中的Leak错误:
{
   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能够跟踪分配情况,但也使得实现您所要求的操作变得更加困难。
FYI:我正在使用Valgrind 3.5。

7
这个答案唯一缺少的就是如何处理那些被压制的文本... - lvella
8
这些设置应该保存到抑制文件中,Valgrind启动时会读取该文件。选项--suppressions=<文件名>。请参考http://valgrind.org/docs/manual/manual-core.html。 - Alex InTechno
有点相关... https://dev59.com/-XE85IYBdhLWcg3wMQhm#15535105。该链接讲述了如何使用memcheck生成所有抑制项到日志文件中。然后可以使用日志文件创建通配符抑制表达式。 - Trevor Boyd Smith

10

您可以为库中的错误生成抑制项,但我认为通常无法排除库。

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


6
这是关于使用Valgrind进行错误抑制的信息链接。 - blwy10

7

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

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

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


1
很好。忽略未定义值实际上使我的特定情况得以解决,我的一个库(不是OpenSSL)报告了“检测到10000000个以上的总错误”,从而通过分析其余代码来解决问题。 - Rui Marques

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接