12

一部のライブラリ セットを無視するように valgrind に指示することは可能ですか? 具体的には glibc ライブラリ..

実際の問題: 通常の実行で正常に動作するコードがいくつかあります。漏れ等はありません。

valgrind で実行しようとすると、コア ダンプが発生し、プログラムが再起動/停止します。

コアは通常、glibc 関数 (通常は fseek、mutex など) を指します。互換性のない glibc / valgrind バージョンに問題がある可能性があることを理解しています。

さまざまな valgrind リリースと glibc バージョンを試しましたが、うまくいきませんでした。助言がありますか?

4

4 に答える 4

11

これはおそらくあなたの質問に答えませんが、特定のエラーを抑制する方法の詳細を提供します(他の人がほのめかしているが詳細には説明していません):

まず、次のように実行valgrindします。

 valgrind --gen-suppressions=all --log-file=valgrind.out ./a.out

これで、出力ファイルvalgrind.outには、次のような自動生成された抑制ブロックが含まれます。

{
   stupid sendmsg bug: http://sourceware.org/bugzilla/show_bug.cgi?id=14687
   Memcheck:Param
   sendmsg(mmsg[0].msg_hdr)
   fun:sendmmsg
   obj:/usr/lib/libresolv-2.17.so
   fun:__libc_res_nquery
   obj:/usr/lib/libresolv-2.17.so
   fun:__libc_res_nsearch
   fun:_nss_dns_gethostbyname4_r
   fun:gaih_inet
   fun:getaddrinfo
   fun:get_socket_fd
   fun:main
}

ここで、「愚かなsendmsgバグ」とリンクは、このブロックを参照するために追加した名前です。次に、そのブロックをに保存し、次の実行時にそのファイルについてsendmsg.supp通知します。valgrind

valgrind --log-file=valgrind --suppressions=sendmsg.supp ./a.out

そしてvalgrind、その愚かな上流のバグを丁寧に無視します。

于 2013-03-20T21:29:53.113 に答える
4

unwind で指摘されているように、valgrind には、インストルメント化されるプロシージャとその方法を制御する精巧なメカニズムがあります。しかし、valgrind と glibc はどちらも複雑な獣であり、あなたは本当に、本当に、本当にこれをしたくありません。相互に互換性のある glibc と valgrind を入手する簡単な方法は、選択した Linux ディストリビューションから両方を入手することです。物事は「うまくいく」べきであり、うまくいかない場合は、誰かに文句を言う必要があります。

于 2010-05-25T01:44:21.390 に答える
3

はい、Valgrindの抑制システムを調べてください。

于 2010-05-24T10:57:15.693 に答える
1

これについては、おそらくValgrind ユーザーのメーリング リストで質問したいと思うでしょう(これは非常に役に立ちます)。特定の呼び出しからの出力を抑制することはできますが、ノイズを抑制することだけがすべてです。呼び出しはまだ Valgrind を通過しています。

必要なことを達成するには、(理想的には) Valgrind を glibc と適切に一致させる、マクロを使用しvalgrind/valgrind.hてそれらを回避します。これらを使用すると、特定のものに触れないように valgrind に指示できます。どの呼び出しがすべてを中断しているのかはわかりませんが、valgrind で実行されている場合は、独自のプログラムでコードの一部を (選択的に) 実行しないこともできます。RUNNING_ON_VALGRINDのマクロを参照してくださいvalgrind/valgrind.h

他に気になることは、スレッドを処理するために Valgrind が正しくコンパイルされていることを確認することです。Valgrind でのアトミック操作は、適切に構成されていない場合、レース操作中にプログラムがクラッシュする可能性があることに注意してください。

valgrind と glibc のバージョンを交換している場合、一致するものを見つけた可能性がありますが、ビルド時に valgrind が正しく構成されていません。

于 2010-05-24T14:45:30.307 に答える