정적으로 또는 동적으로 링크 된 DLL에서 메모리 누수를 감지하는 방법을 알 수 없습니다. 난 그냥 DLL에서 누수를 감지하고, 나는 DLL과 응용 프로그램간에 메모리 관리자를 공유하고 싶지 않아요. 또한 DLL은이dll에서 메모리 누수를 감지하도록 FastMM을 구성하는 방법
내 샘플 DLL은 다음과 같습니다 런타임 패키지와 연결 입니다 :
library dll;
uses
fastmm4,
System.SysUtils,
System.Classes;
{$R *.res}
procedure MyInit; stdcall;
Begin
TObject.Create;
End;
exports MyInit;
begin
end.
응용 프로그램의 조선 민주주의 인민 공화국 :
program app;
uses
//fastmm4,
Vcl.Forms,
main in 'main.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
참고 : 나는이 감지 할 수있는 것보다 FastMM4가을의 주석을 해제하는 경우 응용 프로그램 (TStringList.Create)에 의한 memleak가 있지만 DLL의 누출은 아닙니다.
그리고 응용 프로그램 본체에
:unit main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
LDLLHandle: HModule;
LShowProc: TProcedure;
end;
var
Form1: TForm1;
{$ifdef static}
procedure MyInit; stdcall; external 'dll.dll';
{$endif}
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
TStringList.Create;
{$ifdef static}
MyInit;
{$else}
LDLLHandle := LoadLibrary('dll.dll');
if LDLLHandle <> 0 then
begin
try
LShowProc := GetProcAddress(LDLLHandle, 'MyInit');
if Assigned(LShowProc) then
LShowProc;
finally
FreeLibrary(LDLLHandle);
end;
end;
{$endif}
end;
end.
내가 DLL이 정적으로로드 된 경우 FreeLibrary를가,라고, 또는 프로그램 종료에 때 보고서를 생성 FASTMM 기대하지만 아무 일도 일어나지 않습니다. FastMM4Options.inc
에서
나는 또한 단지 ClearLogFileOnStartupFullDebugMode 및 을 설정하고, FastMM_FullDebugMode.dll 출력 디렉토리에 있습니다.
나는 repository on github을 만들었습니다. 내가 뭘 놓치고 있니?
이상한 ... 그냥 repo를 복제하고 실행하고 xe3에서 작동합니까? – balazs
나 자신의 프로젝트를 만들 때 나는 재현 할 수 없었다. 그러나 나는 내 자신의 fastmm 옵션을 사용했습니다. 그러나, 나는 당신의 프로젝트를 가져 갔고, repo 할 수 있었고, 지금 문제를 해결했다. –