2013-07-04 21 views
7

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?

+0

garip ... Repo'yu klonladın mı ve xe3 üzerinde çalıştın mı? – balazs

+0

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

cevap

5

nedeni FastMM kapatma sürecinin bu koddan kaynaklanıyor: En seçeneklerinde

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} 
); 

, RequireDebuggerPresenceForLeakReporting tanımlanır. Dahası, DLL, DebugHook0 eşittir, muhtemelen DLL yerine uygulamayı hata ayıklama olduğundan. Bu, False geçişini CheckBlocksOnShutdown aramanız anlamına gelir. Ve bu False, sızıntı bildirimini devre dışı bırakır.

Bu sorunu, RequireDebuggerPresenceForLeakReporting undefining ile çözebilirsiniz.

+0

çalışıyor memnunum Balazs'ın projesi 'RequireDebuggerPresenceForLeakReporting' tanımlandı. – Ravaut123

+0

ile fastMM raporlarını sızıntı olsun o –

+0

Evet, ve cevabınızı bildiriyorum – Ravaut123

-1

Sadece Delphi2010 üzerinde versiyon Hızlı Bellek Yöneticisi 4.97 ile test - Win7

  1. FastMM4 .dpr ait 'kullanır' maddesinin (proje ve dll)
  2. 'ShareMM' ilk birimdir
  3. 'AttemptToUseSharedMM' seçeneği etkinleştirildiğinde
  4. seçeneği etkinleştirildiğinde
  5. 'EnableMemoryLeakReporting' seçeneği etkinleştirildiğinde

Hızlı MM_FullDebugMode.dll exe klasörüne

klasörüne ekleyin. Ayrıca, bir 'Demo yüklenebilen' DLL ' bir test demosu da vardır. Bu demo ShareMem yok. 'ShareMM' ve 'AttemptToUseSharedMM' seçeneklerini etkinleştirmeli ve FastMM'nin sızıntı raporuna sahip olmak için FastMM_FullDebugMode.dll dosyasını eklemeliyim. DLL sızıntıları raporlama değildir

+0

Sharemem'i neden etkinleştirdiniz? Askerin, Sharemem'i kullanmak istemediğini açıkça belirttiğini düşünün. –

+0

Projemizi test etmek için dll memshare ile yapıldı. Bu yüzden de memshare'yi – Ravaut123

+0

'da test ediyorum. Bu senin için iyi. Ama neden soruda açıklanan senaryoya uymaya çalışmıyorsunuz? –

İlgili konular