2010-07-04 45 views
40

或者最好是所有的人而不是我的代码?我的程序使用Gtk,Loudmouth和其他一些东西,而这两个(以及它们后面的一些libgcrypto,libssl)自己造成了很多错误,我无法检测到我自己的错误。是否有可能让valgrind忽略比我自己的代码更深的东西?是否有可能让valgrind忽略某些库?

+1

+1,我有同样的麻烦。 NVIDIA的GL库基于未初始化的内存执行有条件的跳转,并且'std :: string'也一直引发误报(“可能丢失”)。 – Thomas 2010-07-04 11:31:33

回答

12

您可以为库的错误生成压制,但我认为您不能一般排除这些库。

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

+4

http:// valgrind。org/docs/manual/manual-core.html#manual-core.suppress这是valgrind错误抑制信息的链接。 – blwy10 2010-07-04 13:35:28

5

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

用“PURIFY”选项编译OpenSSL可能对此有所帮助。不幸的是,由于主要的Linux发行版的一些糟糕的行动,这不太可能成为默认。

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

+1

不错。忽略undef-values实际上使我的特殊情况成为我的特例,我从一个库(不是OpenSSL)中“检测到超过10000000个错误”,然后分析其余代码。 – 2014-06-12 11:31:10

28

假设你正在运行的MEMCHECK工具,并要忽略泄漏错误libcrypto只有,你可以把抑制,如:

{ 
    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。

+7

这个答案缺少的唯一东西是如何处理抑制文本...... – lvella 2014-11-20 17:01:31

+7

这些设置是为了保存在Valgrind启动时读取的抑制文件中。选项--suppressions = 请参阅http://valgrind.org/docs/manual/manual-core.html – 2015-03-04 05:54:29

+0

@mormegil意外地低估了答案。抱歉 – Greg 2017-03-29 15:22:20

相关问题