你怎么告诉Valgrind完全压制一个特定的.so文件?

时间:2010-03-03 23:09:56

标签: shared-libraries valgrind suppress-warnings

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

{
   rule name
   Memcheck:Cond
   ...
   obj:/path/to/library/thelibrary.so
}
然而,这并不能完全胜任这项工作。我必须为每个出现的抑制类型(Cond,Value4,Param等)创建其中一个,并且它似乎仍然会遗漏一些在堆栈跟踪中具有库的错误。

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

3 个答案:

答案 0 :(得分:30)

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

{
   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
   ...
}

答案 1 :(得分:17)

似乎有必要为每个错误的类型包含一个单独的抑制记录(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
   ...
}

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

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

答案 2 :(得分:2)

nobar's answer几乎为我工作,但我收到语法错误:

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

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

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
   ...
}