web-dev-qa-db-ja.com

valgrindに特定のライブラリを無視させることは可能ですか?

または、できれば私のコードだけでなく、それらすべてを使用しますか?私のプログラムはGtk、ラウドマスなどを使用しており、これら2つ(およびその背後のいくつか、libgcrypto、libssl)自体が非常に多くのエラーを引き起こしているため、自分のエラーを検出できません。私自身のコードよりも深いところから来るものをvalgrindに無視させることは可能ですか?

51
tadzik

ライブラリのエラーを抑制できますが、一般的にはライブラリを除外できないと思います。

また、ライブラリのメモリエラーの原因がコードの問題かどうかを自動的に判断するのは困難です。

10
Douglas Leeder

memcheckツールを実行していて、Leakエラーを無視したい場合libcryptoのみでは、次のような抑制を行うことができます。

{
   ignore_libcrypto_conditional_jump_errors
   Memcheck:Leak
   ...
   obj:*/libcrypto.so.*
}

...ファイルに入れて、valgrind--suppressions=*FILENAME*を付けて渡します。

無視するリークすべての共有ライブラリのエラーlibディレクトリ(/ lib/ lib64/ usr/lib/ usr/lib64、...):

{
   ignore_unversioned_libs
   Memcheck:Leak
   ...
   obj:*/lib*/lib*.so
}
{
   ignore_versioned_libs
   Memcheck:Leak
   ...
   obj:*/lib*/lib*.so.*
}

可能性は低いですが、X11およびGTKライブラリの場所を考慮して、ディレクトリパターンのバリエーションを追加する必要がある場合があります。

これにより、ライブラリによって呼び出された、ユーザーが記述したコールバックによって発生したエラーは無視されます。これらのコールバックでエラーをキャッチすることは、ほとんどで行うことができます:

{
   ignore_unversioned_libs
   Memcheck:Leak
   obj:*/lib*/lib*.so
   ...
   obj:*/lib*/lib*.so
}
{
   ignore_versioned_libs
   Memcheck:Leak
   obj:*/lib*/lib*.so.*
   ...
   obj:*/lib*/lib*.so.*
}

...しかし、これにより、Valgrind mallocを使用するライブラリによる呼び出しのエラーが明らかになります。 valgrind mallocはプログラムテキストに直接挿入されるため(動的ライブラリとして読み込まれません)、独自のコードと同じようにスタックに表示されます。これにより、Valgrindが割り当てを追跡できるようになりますが、ユーザーが要求した内容を正確に実行することも難しくなります。

参考:valgrind 3.5を使用しています。

38
mormegil

特にOpenSSLでは、これは非常に困難です。 SSL暗号化キーの一部は、初期化されていないスタックガベージに基づいています。つまり、復号化されたすべてのデータも汚染されます。この汚染はOpenSSL自体を超えて広がる傾向があります。

「PURIFY」オプションを使用してOpenSSLをコンパイルすると、ここで役立つ場合があります。残念ながら、主要なLinuxディストリビューションによるいくつかのよく考えられていないアクションのため、これがデフォルトになる可能性は低いです。

非常に率直な回避策は、memcheckの--undef-value-errors=noオプション。

6
jilles