* nixシステム上の大規模なC / C ++コードでメモリ関連の問題を追跡/修正する方法


9

メモリ関連の問題を追跡するときに使用する戦略は何ですか?メモリリークやメモリ破損などを特定するために、どのツール(オープンソースおよび独自仕様)を使用していますか?システムでgdb / dbxしか使用できない場合、どのようにメモリリークを追跡しますか?

私にとって、デバッガだけでメモリリークを修正することは非常に困難です。


2
個人的には、この質問はUNIXに関連するよりもプログラミングに関連していると思います。
phunehehe 2010

回答:


12

ソースコードを変更できる場合は、Dmallocが最適です。解放されなかったポインターと(デバッグシンボルでビルドされたコードの場合)割り当てられた行が正確にリストされます。

できない場合は、Valgrindがそのようなものの標準となっています。私は通常、Valgrindを使用するのが少し難しいと思いますが、機能がはるかに多く、コードにdmalloc呼び出しを追加する必要はありません。


非常に大規模なシステムで期待されるように、dmallocはあまりパフォーマンスが良くありません。valgrindの...よりよい賭けであり、さらにそこには、ボトルネックをヒットする

valgrind --tool memcheck "yourapp"は、ランタイムにメモリ関連の情報を提供します(デスクトップシステムで役立ちます)。もう1つの優れたツールはmemwatchですが、ソースと一緒にコンパイルする必要があります。Memwatchは詳細をファイルに記録できるため、組み込みシステムにより適しています。
rajaganesh87


2

Massif(valgrindから)は、メモリリークを見つけるための最良の方法の1つです。疑わしいコードを繰り返し(またはプログラムを十分に長く実行して)、ms_printで結果をダンプします。通常、呼び出しスタックはそれを修正するのに十分な情報を提供しています。

GDBを使用すると、実行中のプログラムにアタッチして、次のような関数を呼び出すことができます。 malloc_stats()

プログラムが別の言語で書かれている場合は、よりトリッキーになる可能性があります。最近、一部のGDBはスクリプト機能を獲得しており、人々はコアダンプからPythonメモリを分析できるgdb-heapなどの興味深いプロジェクトを開始しました。同様のメモリ分析スクリプトがC ++オブジェクトに対して可能である場合があります。

/programming/2564752/examining-cc-heap-memory-statistics-in-gdbもお読みください


1

Solarisの場合、このStackOverflowの質問への回答にいくつかのツールがリストされています(これらのツールには、他の形式の不良メモリアクセスとのリークチェックが含まれています)。


1

私はしばらくの間Objective-Cを行っていますが、Cレベルのメモリ管理などを扱うアナライザーがあります。Clang Static Analyzerは非常に優れているため、AppleはそれをxCode IDEにバンドルすることにしました。これがあなたの質問に適しているかどうかはわかりませんが、Cを実行している場合は、試す価値があります。


マイナーな問題:clangは最初からxcodeで使用するために開発されました。clang.llvm.org/clang_video-05-25-2007.htmlを
Daniel James

こんにちはダニエル、本当かもしれませんが、最近まで(または少なくともAppleからダウンロードしたバンドルには含まれていませんでした)にxCodeに含まれていませんでした
phunehehe 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.