51

C++ プログラムでメモリ割り当てを追跡する方法を探しています。私は、ほとんどのツールが見つけようとしているメモリ リークには関心がありませんが、アプリケーションのメモリ使用プロファイルを作成することに関心があります。理想的な出力は、関数名の大きなリストと時間の経過に伴う最大割り当てバイト数、またはさらに良いことに、時間の経過に伴うヒープのグラフィカル表現のいずれかです。横軸は時間、縦軸はヒープスペースです。すべての関数は独自の色を取得し、割り当てられたヒープ バイトに従って線を描画します。割り当てられたオブジェクト タイプを識別するためのボーナス ポイントも同様です。

アイデアは、メモリのボトルネックを見つけて、どの関数/スレッドが最も多くのメモリを消費し、さらに最適化する必要があるかを視覚化することです。

Purify、BoundsChecker、および AQTime を簡単に調べましたが、それらは私が求めているものではないようです。Valgrind は適切に見えますが、私は Windows を使用しています。Memtrackは有望に見えますが、ソース コードを大幅に変更する必要があります。

Google のスキルが足りなかったに違いありません。それほど珍しいリクエストではないように思われますか? そのようなツールを作成するために必要なすべての情報は、プログラムのデバッグ シンボルとランタイム API 呼び出しからすぐに利用できるはずです。

4

8 に答える 8

35

Valgrind とそのツールである Massif を使用します。その出力例 (一部):

99.48% (20,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->49.74% (10,000B) 0x804841A: main (example.c:20)
| 
->39.79% (8,000B) 0x80483C2: g (example.c:5)
| ->19.90% (4,000B) 0x80483E2: f (example.c:11)
| | ->19.90% (4,000B) 0x8048431: main (example.c:23)
| |   
| ->19.90% (4,000B) 0x8048436: main (example.c:25)
|   
->09.95% (2,000B) 0x80483DA: f (example.c:10)
  ->09.95% (2,000B) 0x8048431: main (example.c:23)

したがって、詳細な情報が得られます。

  • WHO がメモリを割り当てました (関数: 上記の例の g()、f()、および main())。また、関数の割り当てにつながる完全なバックトレースを取得し、
  • メモリが移動したデータ構造(上記の例ではデータ構造はありません)、
  • それが起こった時、
  • 割り当てられたすべてのメモリの割合 (g: 39.7%、f: 9.95%、メイン: 49.7%)。

Massifのマニュアルはこちら

ヒープ割り当てとスタック割り当てを追跡できます (デフォルトではオフになっています)。

PS。Windows を使用していると読みました。ただし、可能なツールから何が得られるかを示すため、答えは残しておきます。

于 2009-05-26T11:55:02.057 に答える
21

Microsoft は、メモリ追跡機能について十分に文書化しています。ただし、何らかの理由で、開発者コミュニティではあまり知られていません。これらは CRT デバッグ関数です。良い出発点は、CRT Debug Heap functionsです。

詳細については、次のリンクを確認してください

  1. ヒープ状態レポート関数
  2. ヒープ割り当てリクエストの追跡。おそらく、これはあなたが探している機能です。
于 2009-05-26T11:35:40.397 に答える
1

Xcode では、Instruments を使用して、割り当て、VM の使用状況、およびその他のいくつかのパラメーターを追跡できます。主に iOS 開発者の間で人気がありますが、試してみる価値があります。

于 2015-10-22T02:37:35.503 に答える