Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Memory Leaks werden nicht gemeldet (https://www.delphipraxis.net/166361-memory-leaks-werden-nicht-gemeldet.html)

Y.Elm 9. Feb 2012 15:24

Delphi-Version: 2010

Memory Leaks werden nicht gemeldet
 
Hallo allerseits,
ich arbeite seit einiger Zeit an der Weiterentwicklung eines Software-Projektes, das von Delphi 7 auf Delphi 2010 umgestellt wurde.
Aus Langzeittests ist auch bekannt, dass mindestens ein Memory Leak im Code steckt (vermutlich sind es mehr als nur einer :roll:).
Durch
Delphi-Quellcode:
System.ReportMemoryLeaksOnShutdown := TRUE;
habe ich die Warnmeldung über Memory Leaks aktiviert. Allerdings wird mir keine Meldung angezeigt.
Ich habe testweise absichtlich einen Memory Leak in meinen Programmcode eingebaut, bekomme aber immernoch keine Meldung.
Es werden zwar einige DLLs verwendet, aber nirgendwo ein SimpleShareMem eingebunden oder ein anderer MemoryManager verwendet.

In einem kleinen Testprojekt wird die Meldung problemlos angezeigt, nur in meinem großen Projekt nicht.
Woran könnte das liegen? Müssen bestimmte Compiler-Optionen aktiviert sein?

Danke schonmal für eure Hilfe

mjustin 9. Feb 2012 15:42

AW: Memory Leaks werden nicht gemeldet
 
Ich würde versuchen die Ursache über "Binäres Umzingeln" einzukreisen:

* ein Memory Leak einbauen und den Programmstartupcode so anpassen, dass nach das Programm nach der Initalisierung sofort beendet wird (also zum Beispiel nach allen Formularerzeugungen, vor dem Application.Run)
* wenn dann das Leak angezeigt wird: den deaktivierten Code nach und nach wieder aktivieren und Test wiederholen bis das Phänomen auftritt => dann muss es im zusätzlich aktivierten Code liegen
* wenn das Leak nicht abgezeigt wird, weiteren Code stilllegen und Test wiederholen

himitsu 9. Feb 2012 15:45

AW: Memory Leaks werden nicht gemeldet
 
ReportMemoryLeaksOnShutdown kann nur Speicherlecks finden, welche im Delphi-Speichermanager (FastMM) liegen.
File-/GDI-Handles und direkte Speicheranfragen an Windows sind dort nicht enthalten.

Auch werden nur Speicherlecks gefunden, welche zum Programmende (noch) existieren.
Einfach nur ein
Delphi-Quellcode:
TEdit.Create(Self);
in einem Timer wird nicht gefunden, auch wenn wärend der Laufzeit dort "Speicherlecks" entstehen,
so werden diese zum Programmende vom Self (der Form) aufgeräumt und schwupps, wird nichts davon mehr gefunden.

Y.Elm 9. Feb 2012 16:11

AW: Memory Leaks werden nicht gemeldet
 
Danke für eure schnellen Antworten.
Leider bekomme ich immernoch keine MemLeak-Meldung ...
Ich habe meinen gesamten Code jetzt folgendermaßen zusammengestaucht:

Delphi-Quellcode:
// Projektdatei
uses
  windows,
  Forms,
  mwsmain in 'source\mwsmain.pas' {MWSForm};

var pp: Pointer;
begin
  ReportMemoryLeaksOnShutdown := TRUE;
  GetMem(pp, 100); // absichtlicher Memory Leak zum Test

  Application.Initialize();
  Application.CreateForm(TMWSForm, MWSForm); // in MWSForm.Create() wird ausschließlich inherited Create(Application); ausgeführt
  try
    Application.Run();
  finally
    Application.Terminate();
  end;

end.
Es werden keine Ressourcen eingebunden, es werden keine DLLs eingebunden, es passiert eigentlich gar nichts, außer, dass ich einen Memory Leak erzeuge ... aber genau der wird nicht gemeldet.

ChrisE 9. Feb 2012 16:39

AW: Memory Leaks werden nicht gemeldet
 
Zitat:

Zitat von himitsu (Beitrag 1150134)
ReportMemoryLeaksOnShutdown kann nur Speicherlecks finden, welche im Delphi-Speichermanager (FastMM) liegen.
File-/GDI-Handles und direkte Speicheranfragen an Windows sind dort nicht enthalten.

Das dürfte für Dich wichtig sein. GetMem ist genau eine solche direkte Speicheranfrage.

Ersetze mal die Zeile durch
Delphi-Quellcode:
aMemoryleak := TForm.Create(nil);
Das dürftest du dann sehen.

Gruß, Chris

Y.Elm 13. Feb 2012 11:56

AW: Memory Leaks werden nicht gemeldet
 
OK, jetzt bin ich wirklich verwirrt.
Ich kompiliere mein Projekt auf meinem Entwicklungsrechner, starte die Exe aus der IDE, beende das Programm -> Ergebnis: keine MemLeak-Meldung.
Ich kopiere die eben erstellte Exe auf einen Techtrechner, starte die Exe, beende das Programm -> Ergebnis: die Meldung über MemLeaks wird angezeigt.
Ich schließe Delphi auf meinem Entwicklungsrechner und starte auch dort die Exe ohne IDE -> Ergebnis: trotzdem keine MemLeak-Meldung.


Kann denn das System, auf dem eine Exe ausgeführt wird, so einen Einfluss auf den Memory Manager haben, dass er MemLeaks nicht erkennt bzw. die Meldung nicht anzeigen kann / darf? :glaskugel:

Anmerkung: Mein Entwicklungsrechner = Win 7, 64 Bit
Testrechner = Win 8 Developer Preview, 32 Bit
Auf beiden Rechnern wird das Programm mit Standard-Benutzerrechten ausgeführt.

jaenicke 13. Feb 2012 12:13

AW: Memory Leaks werden nicht gemeldet
 
Vielleicht wurde auf dem Rechner der Code gar nicht ausgeführt, der das Speicherleck verursacht, so dass kein Speicherleck aufgetreten ist.

Wie wäre es denn mit FastMM4 direkt? Vielleicht findet das ja was.

generic 13. Feb 2012 12:18

AW: Memory Leaks werden nicht gemeldet
 
Es könnten auch Handels von Windows sein, welche nicht mehr freigegeben werden.

Y.Elm 27. Feb 2012 11:46

AW: Memory Leaks werden nicht gemeldet
 
Hier ein kleines Update zum Problem:
Ich habe mir die FullDebug-Version des FastMM besorgt und diese dann im FullDebugMode laufen lassen, mit den Optionen: Prüfung auf Zugriff auf freigegebenen Speicher, detailliertem Aufrufstack und Erzeugen eines Textlogs.

Und siehe da: die Suche nach Memory Leaks wird mit minimalem Aufwand um ein Vielfaches einfacher :thumb:.
Und es wurde sogar ein Zugriff auf bereits freigegeben Speicher gemeldet. Nach dem Beseitigen dieses Problems hab ich sogar auch wieder die Message beim Beenden der Applikation bekommen ... nur dass ich sie da nicht mehr brauche, weil das Textlog viel bequemer und aufschlussreicher ist ...
Da der Zugriff-auf-freigegebenen-Speicher-Bug in einer komplizierten Funktion beim Beenden der Applikation steckte, vermute ich, dass da irgendwas durcheinander gekommen ist, was dazu führte, dass die MessageBox nicht von FastMM angezeigt wurde.

Also ich kann nur Jedem empfehlen, sofort die FullDebug-Version des FastMM zu benutzen, sobald man auf MemLeak-Jagt geht.

hoika 27. Feb 2012 13:13

AW: Memory Leaks werden nicht gemeldet
 
Hallo,

und ich kann nur empfehlen, nutzt Unit-Tests.
Ich habe hier eine App, die braucht 5 Minutem zum Starten im FullDebug-Mode
(viel XML-Kram).


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz