web-dev-qa-db-ja.com

特定の.soファイルを完全に抑制するようにValgrindにどのように指示しますか?

作業中のプログラムでValgrindを使用しようとしていますが、Valgrindは、使用しているライブラリの1つに対して多数のエラーを生成します。そのライブラリに関連するすべてのエラーを抑制するように指示できるようにしたいと思います。抑制ファイルについて私が思いつくことができる最も近いルールは

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

ただし、これで完全に機能するわけではありません。発生するすべての抑制タイプ(Cond、Value4、Paramなど)に対してこれらの1つを作成する必要がありますが、スタックトレースにライブラリがあるいくつかのエラーを見逃しているようです。

Valgrindに特定のライブラリを完全に無視させる単一の抑制ルールを与える方法はありますか?そして、すべての抑制タイプをカバーするそのようなルールを作成する方法がない場合でも、特定のライブラリからの特定の抑制タイプのすべてのエラーを無視するルールを作成する方法は少なくともありますか?

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

エラー(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のドキュメントでは、3つのドットはフレームレベルのワイルドカードと呼ばれています。これらは、コールスタック内の0個以上のフレームに一致します。つまり、これらは誰がライブラリを呼び出したか、またはライブラリがその後どの関数を呼び出すかは関係ありませんの場合に使用します。

エラーには「obj:」フレームが含まれる場合もあれば、「fun:」フレームのみを使用する場合もあります。これは、一般に、その関数がライブラリのシンボルテーブルに含まれているかどうかに基づいています。ライブラリ全体を除外することが目標の場合、ライブラリにシンボルが含まれていない場合に最適に機能する可能性がありますこれにより、ライブラリ内の関数呼び出しごとに個別の抑制を作成する代わりに、ライブラリのファイル名に基づいて除外できます。図書館。うまくいけば、Valgrindは、関数名を知っている場合でも、ライブラリファイル名に基づいてエラーを抑制するのに十分賢いですが、私はこれを確認していません。

ライブラリ内の個々の関数に基づいて抑制を追加する必要がある場合は、同じ形式を使用できるはずです...

{
   <insert_a_suppression_name_here>
   Memcheck:Leak
   ...
   fun:the_name_of_the_function
   ...
}

注:各エラーを抑制するために必要な正確な形式と名前(C++マングリングを含む)を確認するために、valgrindコマンドラインに--gen-suppressions=allを含めることができます。その出力を抑制レコードのテンプレートとして使用できます。通常、特定のライブラリに関連して発生する可能性のあるすべてのエラーを抑制するプロセスを簡素化するために、ほとんどの行を...に置き換えます。関数呼び出し。

注:<insert_a_suppression_name_here>は、必要な説明テキストを入力できるプレースホルダーです。空白にしないでください。

18
nobar

nobarの答え ほとんど機能しましたが、構文エラーが発生していました:

==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
   ...
}
2
Nick