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

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

メモリ関連の問題を追跡する際には、どのような戦略を使用しますか? メモリ リーク、メモリ破損などを特定するために、どのようなツール (オープン ソースとプロプライエタリ) を使用しますか? システムで gdb/dbx しか使用できない場合、どのようにメモリ リークを追跡しますか?

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

答え1

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

できない場合は、ヴァルグリンドそういうことの標準です。Valgrindは一般的にはやや使いにくいと感じますが、はるかに多くの機能があり、コードにdmalloc呼び出しを追加する必要がありません。

答え2

valgrind は驚くほど役に立ちます。

答え3

マシフ(valgrind より) は、メモリ リークを見つけるための最良の方法の 1 つです。疑わしいコードを繰り返し (またはプログラムを十分に長く実行し)、ms_print で結果をダンプします。通常、コール スタックには、問題を修正するのに十分な情報が含まれています。

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

プログラムが別の言語で書かれている場合は、より複雑になるかもしれません。最近、一部のGDBはスクリプト化が可能になり、次のような興味深いプロジェクトが始まりました。gdb ヒープは、コアダンプから Python メモリを分析できます。同様のメモリ分析スクリプトは、C++ オブジェクトでも可能かもしれません。

こちらもご覧くださいhttps://stackoverflow.com/questions/2564752/examining-cc-heap-memory-statistics-in-gdb

答え4

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

関連情報