【问题标题】:How do you tell Valgrind to completely suppress a particular .so file?你如何告诉 Valgrind 完全禁止特定的 .so 文件?
【发布时间】:2011-01-23 11:03:30
【问题描述】:

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

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

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

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

【问题讨论】:

标签: shared-libraries valgrind suppress-warnings


【解决方案1】:

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

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

【讨论】:

  • 只是一个评论,因为它让我自己感到困惑:三个点代表调用/使用通配符,而 不是 占位符,就像我的第一个猜测一样;)
  • Eric - “...”被称为“帧级通配符”,在Valgrind Core Manual in Section 2.5 中进行了讨论。
  • 至少对于 bash(在我们的测试运行程序中使用,但显然不是要检查的二进制文件),fun:*alloc 行不是必需的,只需通配符,然后是对象。
【解决方案2】:

似乎有必要为每个类型错误(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++ 修改)。您可以将该输出用作抑制记录的模板——您通常希望将其中的大多数行替换为...,以简化抑制可能与特定库或函数调用相关的所有错误的过程.

注意:&lt;insert_a_suppression_name_here&gt; 是一个占位符,您可以在其中键入您想要的任何描述性文本。不能为空。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多