Statik veya dinamik olarak bağlı bir dll'de bellek sızıntılarını nasıl algılayacağımı anlayamıyorum. Sadece dll'deki sızıntıları tespit etmek istiyorum ve bellek yöneticisini dll ve uygulama arasında paylaşmak istemiyorum. Ayrıca dllBir dll'de bellek sızıntısını algılamak için FastMM nasıl yapılandırılır
Benim örnek dll şöyle çalışma zamanı paketleri ile bağlantılı geçerli:
library dll;
uses
fastmm4,
System.SysUtils,
System.Classes;
{$R *.res}
procedure MyInit; stdcall;
Begin
TObject.Create;
End;
exports MyInit;
begin
end.
uygulama dpr:
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.
Not: Ben algılayabilir daha fastmm4, yorumsuz Uygulamanın neden olduğu memleak (TStringList.Create), ancak dll'deki sızıntı değil.
Ve uygulama ana ünitede
: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.
Ben dll statik yüklü ise FreeLibrary denilen veya program Çıkışta olduğunda bir rapor oluşturmak için FastMM bekledikleri, ancak hiçbir şey olmuyor. FastMM4Options.inc
yılında
Ben ayrıca sadece ClearLogFileOnStartupFullDebugMode ve ayarlayın ve FastMM_FullDebugMode.dll çıktı dizinde olduğunu.
repository on github'u oluşturdum. Neyi kaçırıyorum?
garip ... Repo'yu klonladın mı ve xe3 üzerinde çalıştın mı? – balazs
Kendi projemi oluşturduğumda yeniden yayınlanamadım. Ama kendi hızlı seçeneklerimi kullandım. Ancak projeni aldım, repo aldım ve şimdi sorunu çözdüm. –