FastMMによって特定のメモリブロックが解放されなかったかどうかをプログラムで確認する方法はありますか?


103

メモリブロックが解放されなかったかどうかを検出しようとしています。もちろん、マネージャーはダイアログボックスまたはログファイルでそれを通知しますが、データベースに結果を保存したい場合はどうなりますか?たとえば、データベーステーブルに、特定のブロックを割り当てたルーチンの名前を付けたいと思います。

FastMMのドキュメントを読んだ後、バージョン4.98以降、メモリの割り当て、解放、再割り当てが発生すると、マネージャから通知を受ける可能性があることがわかりました。たとえば、OnDebugFreeMemFinishイベントはPFullDebugBlockHeader有用な情報を含むaに渡されます。PFullDebugBlockHeader不足していることが1つあります。指定されたブロックがアプリケーションによって解放された場合の情報です。

OnDebugFreeMemFinish解放されていないブロックに対してのみ呼び出されない限り?これは私にはわからないので知りたいです。

問題は、OnDebugFreeMemFinishイベントにフックしてもブロックが解放されたかどうかを確認できなかったことです。

次に例を示します。

program MemLeakTest;

{$APPTYPE CONSOLE}

uses
  FastMM4, ExceptionLog, SysUtils;


procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer);
begin
//This is executed at the end, but how should I know that this block should be freed
//by application? Unless this is executed ONLY for not freed blocks.
end;

procedure Leak;
var
  MyObject: TObject;
begin
  MyObject := TObject.Create;
end;

begin
  OnDebugFreeMemFinish := MemFreeEvent;
  Leak;
end.

私が欠けているのは次のようなコールバックです:

procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);

FastMMのソースを閲覧した後、手順があることがわかりました。

procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);

これはオーバーライドできますが、もっと簡単な方法があるかもしれませんか?


7
FastMMがこのチェックを行うことができるのは、プログラムが行うべき非常に最後のアクションとして(定義により)、FastMMがレポートを作成するまでにコードが完了していることを常に理解しています。部分的な解決策を取得するには、常にソースを調べて、割り当てられたメモリにフラグが設定されている方法を確認します。
ブライアンフロスト

6
予期したリークとして報告されましたか?期待通りに登録しましたか?また、予想される寿命を理解する複雑なロジックを提供しない限り、シャットダウンするまでメモリがリークしていると判断することはできません。
David Heffernan 2012年

6
OnDebugFreeMemFinishが呼び出された場合は、ブロックが解放されたことを意味します。OnMemoryLeakイベントはありません。そのような出来事は決してあり得なかったでしょう。FastMMが行うことは、シャットダウン時に、解放されていないブロックはすべてリークでなければならないことを決定することです。それより前にリークを検出することはできません。
David Heffernan 2012年

12
FastMMがメモリリークがあることを通知するたびに、ツールを停止してすぐに修正します。そうしないと、リークを再現するのが難しくなります。本当にデータベースにログを記録したい場合は、CheckBlocksOnShutdown関数を確認する必要があります。別の潜在的な拡張ポイントがAppendEventLogありますが、私は疑わしいFastMMソースを変更する必要があります。
David Heffernan 2012年

12
Ermはファイルを取得して解析し、DBに入れますか?
トニーホプキンソン

回答:


2

そのようなハンドラーが存在しても、FastMMがリークを報告するときにDBを含むすべてがシャットダウンされるため、ほとんど役に立ちません。

だから、私はあなたに条件文LogErrorsToFileとともにオンにすることをお勧めします。これにより、リークを含むテキストファイルが得られます。後でこれを解析してDBに書き込むことができます。FullDebugModeFastMM4Options.inc

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.