是否有可能使valgrind忽略某些图书馆?
或者最好是所有的人而不是我的代码? 我的程序使用Gtk,Loudmouth和其他一些东西,而这两个(还有一些是libgcrypto,libssl)自己造成了很多错误,所以我无法检测到自己的错误。 是否有可能让valgrind忽略比我自己的代码更深的东西?
您可以生成抑制库的错误,但我不认为你可以通常排除库。
另外,很难自动知道库中的内存错误是否是由代码中的问题引起的。
假设您正在运行memcheck工具,并且只想忽略libcrypto中的 泄漏错误,则可以执行如下的抑制措施:
{ ignore_libcrypto_conditional_jump_errors Memcheck:Leak ... obj:*/libcrypto.so.* }
…进入一个文件,并通过--suppressions=*FILENAME*
传递给valgrind
。
要忽略任何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库的位置。
请注意,这将忽略由您所编写的库所调用的callback引起的错误 。 在这些callback中捕获错误几乎可以通过以下方式完成:
{ 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被直接注入到程序文本中,而不是作为一个dynamic库加载,所以它会像你自己的代码一样出现在堆栈中。 这使得Valgrind能够跟踪分配,但也使得难以完成你所要求的。
仅供参考:我正在使用valgrind 3.5。
特别是对于OpenSSL,这非常困难。 SSLencryption密钥部分基于未初始化的堆栈垃圾,这意味着所有解密的数据也被污染。 这种污染往往会超越OpenSSL本身。
用“PURIFY”选项编译OpenSSL可能对此有所帮助。 不幸的是,由于一个主要的Linux发行版的一些糟糕的行动,这不太可能成为默认。
一个非常钝的解决方法是memcheck的--undef-value-errors=no
选项。