8

手動で終了するまで永久に実行される C++ アプリケーションを作成しました。他の重要なアプリケーションを監視します。その結果、デーモン アプリケーションがダウンすることはありません。それを念頭に置いて、アプリケーションにメモリ リークがあるかどうかを確認したいと考えています。valgrind を使用しましたが、このアプリケーションは永久に実行され続けるため、valgrind は終了しません。コントロール - C を実行すると、valgrind ログファイルから完全な情報が得られません。

Valgrind と同じことができるツールはありますか?

4

3 に答える 3

6

gdb を実行中の valgrind プロセスに接続し、リーク チェックを明示的に実行するように指示できると思います。

私はこれを試していません。ドキュメントで見ただけです。

リンク切れの場合:

GDB を Valgrind gdbserver に接続する

$ valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prog

(エラー パラメータは、gdbserver がアクティブになる前のエラーの数です。0 は、すぐに実行を開始することを意味します)。

次に、プログラムで gdb を起動し、リモート ターゲットに接続します。

$ gdb ./prog
(gdb) target remote | vgdb

チェックをトリガーする

(gdb) monitor leak_check full reachable any

詳細については、ドキュメントまたはリンクされたドキュメントを参照してください。

于 2012-02-14T11:36:59.203 に答える
4

最も明白な方法は、おそらくSIGTERMシグナルをキャッチしてシャットダウンすることにより、デーモンをシャットダウンするためのクリーンな方法を追加することです。そうしないと、デーモンを強制終了するときに(合法的に)使用されているメモリがあると、結果が複雑になります。

または、valgrindクライアントリクエストがあります。VALGRIND_DO_LEAK_CHECKVALGRIND_DO_ADDED_LEAK_CHECK VALGRIND_DO_CHANGED_LEAK_CHECKデーモンで、おそらくタイマーでトリガーできます。次に、結果を比較すると、リークについてわかる場合があります。

于 2012-02-14T11:32:17.770 に答える
0

ある時点で終了しないと、リークを検出できません。valgrind を使用して、たとえば 5 分後にデーモンを終了させることができると思います。次に、valgrind がリークを報告します。アルゴリズムの論理的な欠陥のためにデーモンが継続的にメモリを割り当てている場合でも、コードにリークがなくてもメモリ不足になる可能性があることに注意してください。

于 2012-02-14T11:35:26.507 に答える