我正在尝试在我正在使用的程序上使用Valgrind,但是Valgrind为我正在使用的其中一个库生成了一堆错误.我希望能够告诉它压制涉及该库的所有错误.我能为抑制文件提出的最接近的规则是
{ rule name Memcheck:Cond ... obj:/path/to/library/thelibrary.so }
然而,这并不能完全胜任这项工作.我必须为每个出现的抑制类型(Cond,Value4,Param等)创建其中一个,并且它似乎仍然会遗漏一些在堆栈跟踪中具有库的错误.
有没有办法让Valgrind有一个单一的抑制规则让它完全忽略一个特定的库?即使没有办法制定涵盖所有抑制类型的规则,是否至少有一种方法可以创建一个忽略特定库中特定抑制类型的所有错误的规则?
对于大多数抑制类型,省略通配符,如下所示:
{ name Memcheck:Cond obj:/path/to/lib/lib.so.10.1 } { name Memcheck:Free obj:/path/to/lib/lib.so.10.1 } { name Memcheck:Value8 obj:/path/to/lib/lib.so.10.1 }
请注意,您必须单独列出每种类型的错误,不能通配它们.您还必须列出库的整个路径名(如valgrind所示,任何"装饰",如版本号).
此外,泄漏的处理方式也不同 - 对于那些需要看起来像这样的东西:
{ name Memcheck:Leak fun:*alloc ... obj:/path/to/lib/lib.so.10.1 ... }
似乎有必要为每种类型的错误(Cond,Value4,Param等)包含单独的抑制记录.但基于我对valgrind-3.6.0.SVN-Debian的测试,我相信你可以为每种类型的错误使用以下简化形式......
{Memcheck:Cond ... obj:/path/to/library/thelibrary.so.* ... } { Memcheck:Leak ... obj:/path/to/library/thelibrary.so.* ... }
这三个点在Valgrind文档中称为帧级通配符.它们匹配调用堆栈中的零个或多个帧.换句话说,如果调用库的人没关系,或者库随后调用了什么函数,则使用它们.
有时错误包括"obj:"框架,有时它们只使用"fun:"框架.一般来说,这是基于该函数是否包含在库的符号表中.如果目标是排除整个库,则如果库不包含符号,则可能最有效,因此您可以基于库文件名进行排除,而不必为库中的每个函数调用创建单独的抑制.希望Valgrind足够聪明,可以根据库文件名来抑制错误,即使它确实知道函数名称,但我还没有验证这一点.
如果您确实需要根据库中的各个函数添加抑制,那么您应该能够使用相同的表单...
{Memcheck:Leak ... fun:the_name_of_the_function ... }
注意:您可以--gen-suppressions=all
在valgrind命令行中包含,以查看抑制每个错误所需的确切形式和名称(包括任何C++重整).您可以将该输出用作抑制记录的模板 - 您通常希望在其中替换大多数行,...
以简化抑制可能与特定库或函数调用关联的所有错误的过程.
注意:
是一个占位符,您可以在其中键入所需的任何描述性文本.它必须不是空白.