或者最好是全部而不是我的代码?我的程序使用 Gtk、Loudmouth 和其他一些东西,而这两个(以及它们后面的一些,libgcrypto、libssl)本身导致了很多错误,以至于我无法检测到自己的错误。是否有可能让 valgrind 忽略来自比我自己的代码更深的东西?
3 回答
假设您正在运行memcheck工具并且您只想忽略libcrypto中的泄漏错误,您可以设置如下抑制:
{
ignore_libcrypto_conditional_jump_errors
Memcheck:Leak
...
obj:*/libcrypto.so.*
}
...放入一个文件并将其传递给valgrind
with --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。
您可以为库的错误生成抑制,但我认为您通常不能排除这些库。
此外,很难自动知道库中的内存错误是否是由代码中的问题引起的。
特别是对于 OpenSSL,这非常困难。SSL 加密密钥部分基于未初始化的堆栈垃圾,这意味着所有解密的数据也受到污染。这种污染往往会蔓延到 OpenSSL 本身之外。
使用“PURIFY”选项编译 OpenSSL 可能会有所帮助。不幸的是,由于主要 Linux 发行版的一些考虑不周的行为,这不太可能成为默认设置。
一个非常直接的解决方法是 memcheck 的--undef-value-errors=no
选项。