2010-11-19 6 views
1

これはほとんど新しい質問ではありませんが、それ以外の場所では何も見つかりませんでした。 私は実行中のメモリを着実に摂取するCプログラムを持っています。私はそれを追跡するために 'free'コマンドを使用しています。実行可能な限り、使用可能なメモリの量は減少しています。しかし、私はプログラムそのものにこれを引き起こす可能性のあるものは何も見つかりません。私はvalgrindとdmallocでそれをテストしました。そして、それらのnetherはメモリ損失を検出することができます。Cでメモリリークを検出しました

どのようにしてリークを見つけることができますか?

+0

使用しているメモリの容量にバッファを含めていないのですか?あなたのプログラムがファイルなどを読み込むと、そこでは恒常的に増加する可能性がありますが、そのメモリは他のアプリケーションで利用できなくなるという意味では、実際には "使用中"ではありません。 – Arkku

+0

私はかなり確信しています。私はプログラムを2日間実行した後、最初にこれに気付きました。それはすべてのメモリをいっぱいにしてクラッシュしました。 – Benubird

答えて

3

あなたは、メモリのあなたの使い方について確信している場合は、おそらくそれが問題ですあなた mallocをと解放ではありません。

ライブラリを使用している場合は、正しく使用しているかどうかを再度確認する必要があります。多くの場合、簡単に忘れてメモリリークを引き起こす初期化機能と解放機能があります。

+0

これ以上の調査では、私が期待したように、ツリーが使用していたメモリを解放していないというケースがありました。 – Benubird

3

実際にメモリがリークしていますか、それとも実行時間が長いほどメモリが消費されますか?言い換えれば、プログラムはおそらく単に成長し続けている大きな動的データ構造(リンクされたリストなど)を構築しているのだろうか?プログラムがメモリへのポインタを持っている限り、実際にはリークではありませんが、割り当てが解放されないと、新しいものはOSからより多くのメモリを取得します。それはまた、あなたが使用したツールが「漏れ」を報告しなかった理由を説明します。

私がこれをしなければならなかったとき、私のプログラムがメモリを割り当てて解放するたびにフラットファイルにログメッセージを書き込むようなことをやったことがあります。メッセージには、メモリが割り当てられたファイル名やプログラム行、メモリ割り当て時にmallocから返されたアドレス、解放されるファイル名とプログラム行、解放されるバッファのアドレスなどが含まれます。次に、結果ファイルをアドレスでソートすることができます。 "ALLOCATE"メッセージを持つが、 "FREE"メッセージを持たないアドレスは、漏洩している可能性があります。これは実装に時間がかかることがあり、自動化されたツールがあればより良いツールになりますが、状況によってはこのようなことをしなければならないかもしれません。

また、ガート・コレクターを使用してパントして使用することもできます。 Boehmコレクターがあなたのために働くかもしれません - http://www.hpl.hp.com/personal/Hans_Boehm/gc/を見てください。

共有して楽しんでください。

+0

OPはヒーププロファイラである 'massif' Valgrindツール(デフォルトの' memcheck'ではなく)を使ってみることもできます。これは、割り当てられたメモリの総量をプログラムの一部に割り当てます。これにより、メモリが使用されている場所を特定できるようになります。 – caf

+0

@caf - 私は、彼はすでにvalgrindとdmallocを試していたとOPは指摘した。 –

+0

OPは、メモリリークを探すためにValgrindを使って言いました。これは 'memcheck'ツールを使ったことを意味しています。 Valgrindは実際にはいくつかの異なるツールのパッケージです。代わりに、実際には "リーク"ではないという考えに基づいて、代わりに 'massif'ヒーププロファイラを使用することを提案しています(漏れは探しませんが、プロファイルのメモリ使用量) "古典的な意味では全く。 – caf

関連する問題