2013-01-18 2 views
6

Delphi 7を使用して大規模なアプリケーションでメモリ使用量をデバッグしようとしていますが、fastmmデバッグフルdllをインストールできました。FastMMを使用してメモリが割り当てられている場所を知ります

また、メモリ使用量トラッカーをインストールして、割り当てられたブロックとそのサイズを確認することもできました。

私の質問は、ブロックが割り当てられた場所を見つける方法はありますか?メモリが解放されていなければ、スタックトレースが印刷されるので、可能であることはわかっています。与えられた割り当てのためにスタックトレースを出力するためにfastmmに 'ポーク'する方法はありますか?

サイド質問:割り当ての開始アドレスがわかっている場合、オブジェクトがどのクラスであるかを調べる方法はありますか? (割り当てがオブジェクトのものであると仮定します。

答えて

4

次のいずれかを実行できます

  • LogAllocatedBlocksToFile手順を使用してみてください。そのALastAllocationGroupToLog paramがAFirstAllocationGroupToLogより小さいかゼロである場合、すべてブロックと割り当て呼び出しスタックが記録されます。しかし、あなたのアプリが多くのメモリを持っている場合は、待つ準備をしてください。私は約4時間の待ち時間と1.5Gbの結果ファイルを経験しました。(サイドノート:このような大きなファイルを表示するには、gloggを使用してください)
  • を修正してください。そのため、実装のLogCallStackはインターフェイスに表示されます。または、直接使用することができますFastMM_FullDebugMode.dll

DetectClassInstance機能を試してみてください。

2

FullDebugModeを使用してデータをファイルに書き込む条件を有効にすると、求めているものを正確に取得する必要があります。スタックトレースを書き出しますプログラムがシャットダウンしたときに各リークされた割り当てごとに(もしメモリリークが多いプログラムをデバッグしているのなら、それはしばらく時間がかかることがあります。 。他のオブジェクトの多くを保持するコンテナ)

+0

はい、私は問題に遭遇しますが、アプリケーションを閉じるとメモリがきれいに整理されます。特定の時点の情報を知りたいとき - すべてがアプリケーションに読み込まれたとき。 – wmercer

2

あなたは論理メモリリークを探しているに聞こえるあなたはアプリのメモリが私のために、アプリケーションの終了にきれいにクリーンアップされることをコメントで述べて考える - 他の言葉で:オブジェクト必要以上に生きているbときには、時間が到着すると、アプリをクリーニングするためのコードが存在するため、アプリがクリーンアップされます。

例:

  • は、所有者とそれがフォームのユニットを作成するときにDelphiが作成グローバル一つである参照変数としてアプリケーションを使用してTFormはを作成します。
  • コンフィグcaHideにフォームのCloseAction(OnCloseのイベントで)
  • は、フォームが、
  • それを操作表示フォームを閉じて、アプリが
  • アプリケーションを作るアプリを閉じてを閉じるまで以上にそれを使用することはありませんそれは

を所有している明確なすべてのオブジェクトがだから、論理的なメモリリークを持っていなく物理メモリがリークし - FastMMが簡単に検出できることが親切です。アプリケーションが終了するまで仮想TFormが存在することを意図していないので、意味的に漏れてしまいますが、参照されてアプリケーションの最後に破棄されるコードがあるため、FastMMは通常の割り当てです。

メモリマネージャのメモリダンプは必要ありませんが、メモリプロファイラはそうだと言われています。

+0

詳細な回答ありがとうございます、デルファイのためのメモリプロファイラのようなものがありますか? – wmercer

+1

@emuduguntar:[AQTime](http://smartbear.com/products/qa-tools/application-performance-profiling)は、私が知っているデルファイの唯一のメモリプロファイラです。FastMM自体は例外です –

関連する問題