2013-07-04 13 views
7

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?

+0

komisch ... Haben Sie nur den Repo geklont, und laufen und es funktioniert auf xe3? – balazs

+0

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. –

Antwort

5

Der Grund, dass die DLL nicht Lecks ergibt sich aus diesem Code in der FastMM Shutdown Berichterstattung:

CheckBlocksOnShutdown(
    {$ifdef EnableMemoryLeakReporting} 
     True 
    {$ifdef RequireIDEPresenceForLeakReporting} 
     and DelphiIsRunning 
    {$endif} 
    {$ifdef RequireDebuggerPresenceForLeakReporting} 
     and ((DebugHook <> 0) 
     {$ifdef PatchBCBTerminate} 
     or (Assigned(pCppDebugHook) and (pCppDebugHook^ <> 0)) 
     {$endif PatchBCBTerminate} 
     ) 
    {$endif} 
    {$ifdef ManualLeakReportingControl} 
     and ReportMemoryLeaksOnShutdown 
    {$endif} 
    {$else} 
     False 
    {$endif} 
); 

In Optionen, RequireDebuggerPresenceForLeakReporting definiert ist. Was mehr in der DLL ist ist gleich 0, vermutlich weil Sie die Anwendung und nicht die DLL Debuggen. Das heißt, Sie rufen CheckBlocksOnShutdown über False. Und das False deaktiviert das Melden von Lecks.

Sie können dies beheben, indem Sie RequireDebuggerPresenceForLeakReporting nicht definieren.

+0

Ich erhalte Leckberichte des fastMM mit RequireDebuggerPresenceForLeakReporting Disable, ShareMM Disable und AttamtToUseSharedMM Disable – Ravaut123

+0

@ Ravaut123 Wie ich in der Antwort angegeben, der einzige Faktor, der Leckberichte in der Das Projekt von balazs bestand darin, dass 'RequireDebuggerPresenceForLeakReporting' definiert wurde. –

+0

Ja, und ich habe deine Antwort verbessert – Ravaut123

-1

Ich teste es nur mit Version Fast Memory-Manager 4.97 auf Delphi2010 - win7

  1. FastMM4 ist die erste Einheit in der Klausel 'Nutzung' des .dpr (Projekt- und DLL)
  2. 'ShareMM' Option aktiviert ist
  3. 'AttemptToUseSharedMM' Option aktiviert ist
  4. 'EnableMemoryLeakReporting' Option aktiviert

Fügen Sie FastMM_FullDebugMode.dll im Ordner der exe hinzu

Es gibt auch eine Testdemo 'Dynamisch geladene DLL' Diese Demo ist ohne die ShareMem. Ich muss die Option 'ShareMM' und 'AttemptToUseSharedMM' aktivieren und die FastMM_FullDebugMode.dll hinzufügen, um einen Leckbericht von FastMM zu erhalten.

+0

Warum haben Sie Sharemem aktiviert? Bedenken Sie, dass der Fragesteller ausdrücklich erklärt hat, dass er Sharemem nicht verwenden möchte. –

+0

Mein Projekt zum Testen der DLL wurde mit Memshare erstellt. Also teste ich auch die Memshare auf – Ravaut123

+0

Das ist nett für dich. Aber warum versuchst du nicht, das in der Frage beschriebene Szenario zu erreichen? –