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