你如何告诉Valgrind完全禁止特定的.so文件?

37

我试图在我正在开发的程序上使用Valgrind,但Valgrind为我使用的一个库生成了大量错误信息。我希望能够告诉它抑制所有涉及该库的错误。我能想到最接近的抑制规则是:

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

然而这并不能完全解决问题。我不得不为每种出现的抑制类型(如Cond、Value4、Param等)创建一个这样的规则,并且它似乎仍然会错过一些在堆栈跟踪中具有库的错误。

有没有办法给Valgrind一个单独的抑制规则,使其彻底忽略特定的库?即使没有覆盖所有抑制类型的这样的规则,是否至少有一种方法可以创建一条规则,以从特定库中忽略特定抑制类型的所有错误?


你可能也想在 Valgrind 邮件列表中问一下。 - Douglas Leeder
可能重复:https://dev59.com/5HA75IYBdhLWcg3wqK7_ - Herpes Free Engineer
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
   ...
}

12
只是一个备注,因为它让我感到困惑:三个点代表调用/使用通配符,而不是像我最初猜测的占位符 ;) - Eric
Eric - "..." 被称为 "frame-level 通配符",在 Valgrind 核心手册的第2.5节 中有讨论。 - jww
至少在bash中(我们的测试运行器中使用),但显然不是用于检查的二进制文件中,fun:*alloc这一行是不必要的,只需要通配符,然后是对象。 - Simon Sobisch

19

看起来需要为每种错误类型(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>是一个占位符,您可以键入任何您想要的描述性文本。它必须不为空。


3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接