Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Memory-Leak finden (https://www.delphipraxis.net/137632-memory-leak-finden.html)

Codewalker 24. Jul 2009 20:20


Memory-Leak finden
 
Ich habe in einem größeren Projekt über
Delphi-Quellcode:
    ReportMemoryLeaksOnShutdown := True
mir die Speicherlecks anzeigen lassen. Leider kriege ich ja nur den Datentyp und ungefähre Größen. Die Angabe hilft bei der Suche überhaupt nicht weiter (sind z.B. viele Strings dabei). Wie kann man das ganze denn weiter eingrenzen oder besser finden?

samso 25. Jul 2009 08:44

Re: Memory-Leak finden
 
Nach meiner Erfahrung hilft hier nur Versuch-und-Irrtum und ein selbstkritischer Blick in den Quellcode. Zunächst beseitige ich immer die Speicherlecks, die mit nicht freigebenen Objekten zusammenhängen, denn diese sind am leichtesten zu finden.
Bei solchen Fehlern sind die verdächtigen Kandidaten gerne mal Records mit enthaltenen Strings. Bei Records wird die Type-Information lediglich vom Compiler verwaltet. Sie stehen zur Laufzeit also nicht mehr zu Verfügung. Das ist auch der Grund weshalb FastMM keine weiteren Type-Informationen zu Verfügung stellen kann. Wenn man diese Records dynamisch erstellt und der Zeiger dann fröhlich im Programm durch die Gegend wandert, dann geht dem Compiler schon mal die Type-Information verloren und er weiss dann nicht mehr, daß er auch noch Strings freigeben muss (siehe: Finalize). Man sollte also versuchen, die Programmteile in denen solche Records erstellt werden, einfach mal wegzulassen. Man kann auch mal schaun, ob man mal eine unterschiedlich Anzahl von Records erstellen lassen kann - wie entwickelt sich das Speicherleck dann?

himitsu 25. Jul 2009 08:55

Re: Memory-Leak finden
 
Das sind so Units und Projekte, welche du dir eventuell mal ansehn könntes.
[delphi]\source\Win32\rtl\sys\getmem.inc (hier ist aber schon alles aktiviert)
[delphi]\source\dUnit\src\FastMMMemLeakMonitor.pas
[delphi]\source\dUnit\tests\FastMMMonitorTest.pas
[delphi]\source\dUnit\examples\MemLeakDetect\LeakTestDemo. dpr

Ansonsten mußt du dir einfach mal das "große"/aktuelle FastMM besorgen ... dort gibt es dann auch wesentlich mehr Möglichkeiten.

generic 25. Jul 2009 11:14

Re: Memory-Leak finden
 
Hast du das Entwickler Magazin?

Entwickler Magazin (Ausgabe: 05.08/13.08.2008)
Artikel: Speicher managen mit FastMM

Dort ist das etwas Erklärt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 Uhr.

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