代码之家  ›  专栏  ›  技术社区  ›  Jonathan M Davis

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

  •  31
  • Jonathan M Davis  · 技术社区  · 14 年前

    我试图在我正在开发的程序中使用valgrind,但是valgrind为我正在使用的某个库生成了一系列错误。我希望能够告诉它抑制所有涉及该库的错误。对于抑制文件,我能想到的最接近的规则是

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

    然而,这并不能完全完成这项工作。我必须为出现的每个抑制类型(cond、value4、param等)创建一个这样的类型,并且它似乎仍然遗漏了堆栈跟踪中包含库的一些错误。

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

    3 回复  |  直到 7 年前
        1
  •  30
  •   BillTorpey    14 年前

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

    {
       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
       ...
    }
    
        2
  •  17
  •   Brent Bradburn    13 年前

    似乎有必要为每个 类型 错误(条件、值4、参数等)。但根据我对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 在ValgReD命令行上,以查看确切的形式和名称(包括任何C++ Mungle),以抑制每个错误。您可以将该输出用作禁止显示记录的模板——在该模板中,您通常希望用 ... 为了简化抑制与特定库或函数调用关联可能发生的所有错误的过程。

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

        3
  •  2
  •   Nick    7 年前

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