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

Jon*_*vis 32 valgrind shared-libraries suppress-warnings

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

{
   rule name
   Memcheck:Cond
   ...
   obj:/path/to/library/thelibrary.so
}
Run Code Online (Sandbox Code Playgroud)

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

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

Bil*_*pey 31

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

{
   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
}
Run Code Online (Sandbox Code Playgroud)

请注意,您必须单独列出每种类型的错误,不能通配它们.您还必须列出库的整个路径名(如valgrind所示,任何"装饰",如版本号).

此外,泄漏的处理方式也不同 - 对于那些需要看起来像这样的东西:

{
   name
   Memcheck:Leak
   fun:*alloc
   ...
   obj:/path/to/lib/lib.so.10.1
   ...
}
Run Code Online (Sandbox Code Playgroud)

  • 只是一个评论,因为它混淆了我自己:三个点代表调用/使用通配符和*不*占位符,这是我的第一个猜测;) (11认同)

nob*_*bar 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.*
   ...
}
Run Code Online (Sandbox Code Playgroud)

这三个点在Valgrind文档中称为帧级通配符.它们匹配调用堆栈中的零个或多个帧.换句话说,如果调用库的人没关系,或者库随后调用了什么函数,则使用它们.

有时错误包括"obj:"框架,有时它们只使用"fun:"框架.一般来说,这是基于该函数是否包含在库的符号表中.如果目标是排除整个库,则如果库不包含符号,则可能最有效,因此您可以基于库文件名进行排除,而不必为库中的每个函数调用创建单独的抑制.希望Valgrind足够聪明,可以根据库文件名来抑制错误,即使它确实知道函数名称,但我还没有验证这一点.

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

{
   <insert_a_suppression_name_here>
   Memcheck:Leak
   ...
   fun:the_name_of_the_function
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

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