Valgrindは知っていますが、メモリ管理の問題を検出するだけです。私が探しているのは、プログラムのどの部分がどれだけのメモリを消費しているかの概要を示すツールです。たとえば、 (KCachegrindがCallgrindに対して行うように)ツリーマップは格好良いでしょう。
私はLinuxマシンで作業しているので、Windowsツールはあまり役に立ちません。
Valgrindツールの一部である massif を使用します。 massif-visualizer は、データをグラフ化するのに役立ちます。または、ms_print
コマンド。
Googleが提供する heap profilergperftools で提供されています。私は常にソースからビルドしてきましたが、いくつかのLinuxディストリビューションでは プリコンパイル済みパッケージ として入手できます。
動的ライブラリを実行可能ファイルにリンクしてプログラムを実行するのと同じくらい簡単に使用できます。次のいずれかが発生するたびに、すべての動的メモリ割り当てに関する情報を収集し(私が確認した限り)、ディスクにメモリダンプを保存します。
HEAP_PROFILE_ALLOCATION_INTERVAL
_バイトはプログラムによって割り当てられています(デフォルト:1Gb)HEAP_PROFILE_INUSE_INTERVAL
_バイト増加します(デフォルト:100Mb)HEAP_PROFILE_TIME_INTERVAL
_秒が経過しました(デフォルト:非アクティブ)HeapProfilerDump()
を呼び出しますヒープ使用量のスナップショットをいつ取得し、2つの異なるスナップショットを比較できるので、私の経験では最後のものが最も便利です何が悪いのか見てみましょう。
最終的に、テキストまたはグラフィック(有向グラフの形式)など、いくつかの可能な出力形式があります。
このツールを使用して、Massifを使用して見つけることができなかった誤ったメモリ使用量を見つけることができました。
「新しい」オプションは HeapTrack です。 massifとは異なり、malloc
/free
のインストルメントバージョンであり、すべての呼び出しを保存してログをダンプします。
GUIはナイスです(ただし、Qt5 IIRCが必要です)。結果のタイミング(時間も追跡したい場合があるため)は、valgrindよりも偏っていません(エミュレートされていないため)。