2009-06-27 2 views
11

誰でも、C++用のメモリメモリリーク検出ツールを見つけることができます。このツールは、コマンドラインで実行することも、WindowsおよびLinuxでEclipseプラグインとして実行することもできます。私はそれを使いやすいものにしたいと思います。好ましくは、new()、delete()、malloc()またはfree()を上書きしないものです。コマンドラインにGDBのようなものがありますが、メモリリークの検出に使用されていることは覚えていません。これを自動的に行うユニットテストフレームワークがあれば、それは素晴らしいでしょう。G ++マルチプラットフォームメモリリーク検出ツール

この質問は、他の質問(Memory leak detection under Windows for GNU C/C++など)と似ていますが、私はそれが違うと感じています。ここでもう少し具体的なものを探しているように感じます。提案はすべての要件を満たす必要はありませんが、可能な限り多くは良いでしょう。

ありがとうございました。

編集:私はライブラリを#includeするか、そうでなければC++でコードをコンパイルする方法を変更する必要があるものを "上書き"することで、これを実行時に実行すると、違う環境は素晴らしいものには影響しません。また、残念ながら私はMacを持っていないので、そのための提案は役に立たないが、試してくれてありがとう。私のデスクトップはWindowsを実行しています(私はLinuxがインストールされていますが、私のデュアルモニターはそれで動作しません)、確かにオプションですが、VMでLinuxを実行したくないです。私のラップトップはLinuxを使用しているので、私はそこでそのツールを使用することができますが、デスクスペースをあまり使わないでも画面のスペースが優れているため、 。

注:私は答えを試してみることができますが、私は提案を試してみるまで満足できるものとしてマークしません。

EDIT2:私のコードのプラットフォーム間の互換性については心配していませんが、C++ライブラリだけを使用するコマンドラインアプリケーションです。

答えて

10

Valgrindは、best friendです。 Valgrindは、日食のためにpluginを持っています。 "悲しいことに" ValgrindはWindowsでは動作しませんが、Mac OSX、* BSD、Linux上で動作しますので、 "マルチプラットフォーム"と考えています。 :)

Valgrindは新しい/削除/ malloc/freeを "上書き"しますが、コンパイル時には上書きしません(つまり、それが意味するのであれば再コンパイルする必要はありません)。バイナリを解釈するので、テスト中にパフォーマンスが少し低下します。

0

MacOS Xにはleaksツールがあります(それ以外の場合はわかりません)、私はLinux上でmemprofというツールを使用していました。また、Linuxで動作し、信じられないほど素晴らしいですvalgrindがありますが、実質的なパフォーマンスヒット、表面上はMacosでは、私はそれを試していない。

しかし、私はこのようなツールをWindows上で認識していません。

1

32ビットアプリケーションの場合、valgrind + wineはWindowsアプリケーションのワーキングソリューションとしても適しています。あなたのアプリが変更なしにワインの下で実行することができる場合は、valgrind +ワインの下でそれを実行すると、私の(かなり限られた)経験でうまく動作します。あなたのアプリはLinux上で動作するので、私はあなたのアプリがワインの下で動作する可能性が高いと推測します(ワインではまだサポートされていないWindows固有のコードは避けてください)。

+0

あなたは* nix上のWindowsアプリケーションを、WineをAPI実装として再コンパイルすることを意味しますか? (私はちょうど興味があります) – olliej

+0

valgrindはx86_64、PowerPC、MIPS、ARMなどのアーキテクチャで動作します。 – LiraNuna

+0

いいえ、あなたのWindowsバイナリを、変更されていないLinux上で、valgrind下のワイン自体の下で実行することを意味します。だから、私は32ビットのみを言いました:valgrindは64ビットサポートのワインの下でアプリケーションを実行することはできず、64ビットサポートを持つワインは実験的です(64ビットで、私は64ビットのWindowsアプリケーションを実行します) –

1

これは好ましくないと述べましたが、Boehm Garbage Collectorを使用してメモリリークを検出できます。簡単に言えば、ガベージコレクタが実際に実行されている場合、通常はメモリリークが発生します。 MozillaではFirefoxのメモリリークを検出するためにこの方法で使用されています。

1

DUMAは、多くのプロジェクトで使用するクロスプラットフォームリーク検出ライブラリです。 #includeのDUMA特有のヘッダーは必要ありませんが、メモリ割り当てルーチンを含むシステムのlibcにリンクする前とlibstdC++でリンクした後は、ライブラリ内でリンクするだけでいいからいいです。

特にC++プロジェクトで使用する場合は設定が難しいかもしれませんが、投資しておく価値があると思います。それは私がそうでなければ発見しなかったかもしれない前にいくつかのメモリリークを見つけるのを助け、私が割り当てを2回削除した1つのケース。

メモ:静的なアーカイブ(Windowsではデフォルトで構築されています)を作成すると、実際に漏洩したランタイムによって引き起こされる「誤検出」を減らすことができます。

0

gccの新しいバージョンには、というリークサニタイザと呼ばれるものがあります。コマンドをコンパイルするには、-fsanitize=leakを追加するだけです。その後、プログラムを正常に実行し、最後に漏れがあった場合は、要約を得るでしょう(もちろん端末で)。

関連する問題