4

コードにメモリリークがあります。ヒープはフローのトリガーとともに増加し続けます。私のコードには、基本的にキューで待機するwhile(1)ループがあります。そのフローがWebサービスからトリガーされると、着信メッセージがキューにプッシュされ、メッセージを受け取り、グラフ形式のフローを実装するc++のメソッドが呼び出されます。

トリガーごとに、ヒープ内で604kbのメモリが増加していることがわかります。これを解決する必要があります。

サービスを停止しました[prodで実行されているバイナリ]。

valgrindでサービスを開始しました[valgrindへの入力としてバイナリを指定しました]

valgrind  --log-file=/home/valgrind-output.txt --leak-check=full <service binary>

ただし、バイナリの実行中はリークは表示されず、サービスを停止したときにのみリークが発生します。ただし、これらは1回限りのリークであり、サービスを再起動するとクリアされます。[binary]。

各フローがトリガーされるプロセスの開始時に、意図的に割り当てを追加しました。

 int *p = new int[10];

ログも追加しました。フローをトリガーするたびにログが印刷されますが、valgrindが出力ファイルにリークを与えることはありません。

各フローコール間のリークを確認するにはどうすればよいですか?valgrindシューズは、メインの終わりが呼び出されたときにのみリークしますか?この場合、コードのリークの原因を動的に確認する方法。インストールする必要のある他の検出器がありますか?提案してください。それは大きな助けになるでしょう。ありがとう。

4

2 に答える 2

2

valgrind は、プログラムの終了時にのみメモリ リークをチェックします。その時点で、スタックおよびグローバル変数から到達可能なすべてのメモリがトレースされ、到達できないものはすべてリークと見なされます。

長時間実行されているプログラムでリークを見つけたい場合は、しばらく実行した後に発生する exit (プログラムの中止) の呼び出しを挿入する必要があります。これにより、その時点で何がリークしたかが表示されます。

于 2013-03-01T06:50:28.940 に答える
-2

-massifを使用すると、すべての呼び出しスタックでメモリが割り当てられている詳細な出力が得られます。

于 2013-03-01T06:48:01.277 に答える