Ich kann nicht herausfinden, wie Speicherverluste in einer statisch oder sogar dynamisch verknüpften DLL erkannt werden. Ich möchte nur die Lecks in der DLL erkennen, und ich möchte nicht den Speichermanager zwischen der DLL und der App teilen. Zusätzlich ist die dll mit Laufzeit von Paketen verknüpftKonfigurieren von FastMM zum Erkennen von Speicherverlust in einer DLL
Meine Probe DLL wie folgt aussieht:
library dll;
uses
fastmm4,
System.SysUtils,
System.Classes;
{$R *.res}
procedure MyInit; stdcall;
Begin
TObject.Create;
End;
exports MyInit;
begin
end.
Anwendung 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.
Hinweis: Wenn Kommentar- ich fastmm4, als ich das erkennen kann, Memleak verursacht durch die Anwendung (TStringList.Create), aber nicht das Leck in der DLL.
Und in der Anwendung Hauptgerät:
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.
ich von FastMM erwarte einen Bericht zu erzeugen, wenn Freelibrary aufgerufen wird, oder beim Beenden des Programms, wenn die DLL statisch geladen ist, aber nichts passiert.
Im FastMM4Options.inc
ich zusätzlich eingestellt gerade FullDebugMode und ClearLogFileOnStartup und die FastMM_FullDebugMode.dll ist im Ausgabeverzeichnis.
Ich habe eine repository on github erstellt. Was vermisse ich?
komisch ... Haben Sie nur den Repo geklont, und laufen und es funktioniert auf xe3? – balazs
Ich konnte nicht repro, wenn ich mein eigenes Projekt baute. Aber ich habe meine eigenen Fastmm-Optionen verwendet. Allerdings habe ich Ihr Projekt übernommen, konnte repo, und habe jetzt das Problem gelöst. –