或者更好的方式是全部加入,而不仅仅只是我的代码?我的程序使用Gtk、Loudmouth和其他一些东西,这两个(以及它们背后的一些东西,如libgcrypto、libssl)本身就会导致很多错误,使我无法检测到自己的错误。是否可能使valgrind忽略来自于比我自己的代码更深层的东西?
或者更好的方式是全部加入,而不仅仅只是我的代码?我的程序使用Gtk、Loudmouth和其他一些东西,这两个(以及它们背后的一些东西,如libgcrypto、libssl)本身就会导致很多错误,使我无法检测到自己的错误。是否可能使valgrind忽略来自于比我自己的代码更深层的东西?
{
ignore_libcrypto_conditional_jump_errors
Memcheck:Leak
...
obj:*/libcrypto.so.*
}
valgrind
和--suppressions=FILENAME
参数传递给它。{
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.*
}
您可以为库中的错误生成抑制项,但我认为通常无法排除库。
此外,很难自动知道库中的内存错误是否是由您的代码问题引起的。
特别是在使用OpenSSL时,这非常困难。 SSL加密密钥部分基于未初始化的堆栈垃圾,这意味着所有解密数据也被污染了。 这种污染往往会超出OpenSSL本身。
使用“PURIFY”选项编译OpenSSL可能会有所帮助。不幸的是,由于一些主要Linux发行版的不良思考行为,这不太可能成为默认选项。
一个非常直接的解决方法是memcheck的--undef-value-errors=no
选项。
std::string
也会不断抛出错误警告(“可能丢失”)。 - Thomas