web-dev-qa-db-ja.com

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

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

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

9
Hemant

ソースコードを変更できるのであれば、 Dmalloc は素晴らしいです。解放されなかったポインターと、(デバッグシンボルを使用して作成されたコードの場合)ポインターが割り当てられた行が正確に一覧表示されます。

できない場合は、 Valgrind がその種の標準です。 Valgrindは一般的に使いにくいと思いますが、機能がはるかに多く、コードにdmalloc呼び出しを追加する必要がありません。

12
Michael Mrozek

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

7
jacksonh

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

GDBを使用すると、実行中のプログラムに接続して、malloc_stats()などの関数を呼び出すことができます。

プログラムが別の言語で書かれている場合は、もっと注意が必要かもしれません。最近、一部のGDBでスクリプトが可能になり、コアダンプからPythonメモリを分析できる gdb-heap などの興味深いプロジェクトが開始されました。同様のメモリ分析スクリプトがC++オブジェクトで可能です。

また読む https://stackoverflow.com/questions/2564752/examining-c-c-heap-memory-statistics-in-gdb

2
elmarco

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

1
alanc

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

1
phunehehe