36

我正在尝试在我正在处理的程序上使用 Valgrind,但 Valgrind 会为我正在使用的一个库生成一堆错误。我希望能够告诉它抑制涉及该库的所有错误。我可以为抑制文件想出的最接近的规则是

{
   rule name
   Memcheck:Cond
   ...
   obj:/path/to/library/thelibrary.so
}

然而,这并不能完全发挥作用。我必须为出现的每种抑制类型(Cond、Value4、Param 等)创建其中一个,它似乎仍然错过了一些错误,这些错误在堆栈跟踪中有库。

有没有办法给 Valgrind 一个单一的抑制规则,让它完全忽略一个特定的库?即使没有办法制定涵盖所有抑制类型的规则,是否至少有一种方法可以创建一个忽略特定库中特定抑制类型的所有错误的规则?

4

3 回答 3

33

对于大多数抑制类型,您可以省略通配符,如下所示:

{
   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
   ...
}
于 2010-11-19T15:55:12.550 回答
18

似乎有必要为每种类型的错误(Cond、Value4、Param 等)包含单独的抑制记录。但是根据我对 valgrind-3.6.0.SVN-Debian 的测试,我相信您可以对每种类型的错误使用以下简化形式...

{
   <insert_a_suppression_name_here>
   Memcheck:Cond
   ...
   obj:/path/to/library/thelibrary.so.*
   ...
}

{
   <insert_a_suppression_name_here>
   Memcheck:Leak
   ...
   obj:/path/to/library/thelibrary.so.*
   ...
}

这三个点在 Valgrind 文档中称为帧级通配符。这些匹配调用堆栈中的零个或多个帧。换句话说,当谁调用库或库随后调用什么函数无关紧要时,您可以使用这些。

有时错误包括“obj:”帧,有时它们只使用“fun:”帧。这通常基于该函数是否包含在库的符号表中。如果目标是排除整个库,则最好在库不包含符号的情况下工作,这样您就可以根据库文件名进行排除,而不必为库中的每个函数调用创建单独的抑制。希望 Valgrind 足够聪明,可以抑制基于库文件名的错误,即使它确实知道函数名,但我还没有验证这一点。

如果您确实需要根据库中的各个函数添加抑制,您应该能够使用相同的表单...

{
   <insert_a_suppression_name_here>
   Memcheck:Leak
   ...
   fun:the_name_of_the_function
   ...
}

注意:您可以包含--gen-suppressions=all在 valgrind 命令行中,以查看抑制每个错误所需的确切形式和名称(包括任何 C++ 修改)。您可以使用该输出作为抑制记录的模板——您通常希望用其中替换大多数行,...以简化抑制可能与特定库或函数调用相关联的所有错误的过程。

注意:<insert_a_suppression_name_here>是一个占位符,您可以在其中键入所需的任何描述性文本。不能为空。

于 2011-12-19T20:16:50.710 回答
2

nobar 的回答几乎对我有用,但我遇到了语法错误:

==15566== FATAL: in suppressions file "suppresion.error.txt" near line 4:
==15566==    bad or missing extra suppression info
==15566== exiting now.

对于系统调用,我需要添加一个额外的行作为文档状态:

Param errors have a mandatory extra information line at this point,
which is the name of the offending system call parameter.

所以我最终得到了这个并且它起作用了:

{
   <sup_mmap_length>
   Memcheck:Param
   mmap(length)
   ...
   fun:function_from_offending_lib
   ...
}
于 2017-10-19T21:54:59.420 回答