Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Memoryleak woher? (https://www.delphipraxis.net/193269-memoryleak-woher.html)

sko1 11. Jul 2017 08:41

Delphi-Version: 5

Memoryleak woher?
 
Hallo,

ich habe bei Programmende ein kleines Memoryleak:

21 - 28 bytes : TMBSEncoding x 1

Wo zum Teufel kommt das her?

Ciao
Stefan

Uwe Raabe 11. Jul 2017 08:44

AW: Memoryleak woher?
 
Zitat:

Zitat von sko1 (Beitrag 1376416)
Wo zum Teufel kommt das her?

:glaskugel:

sakura 11. Jul 2017 08:54

AW: Memoryleak woher?
 
Installiere dir FastMM und binde den in Dein Programm ein. Dann gehe in den Debug-Mode und schaue Dir das Log-File an, da findest Du die meisten Informationen.

Mehr kann man dir mit deiner genauen Angabe, was Du so alles gemacht hast in Deinem Programm auch nicht helfen... :roll:

...:cat:...

P.S.: Mein Programm stürzt immer mal wieder ab, warum? <- Ist in etwa genau so einfach und sicher zu beantworten...

DevLinus 11. Jul 2017 09:21

AW: Memoryleak woher?
 
Madexcept ist ziemlich wirkungsvoll um Memmory Leaks zu finden.

Glados 11. Jul 2017 09:23

AW: Memoryleak woher?
 
Wurde TMBSEncoding von dir selber angelegt? Falls ja, gibst du es auch wieder frei?

Stevie 11. Jul 2017 10:07

AW: Memoryleak woher?
 
:glaskugel:

Ich vermute mal, du meinst TMBCSEncoding. Wird irgendwo TEncoding.GetEncoding aufgerufen? Das TEncoding, was dort zurück kommt, muss auch wieder freigegeben werden.

sko1 11. Jul 2017 11:08

AW: Memoryleak woher?
 
Die einzige Programmstelle, wo überhaupt ein Encoding vorkommt, wäre diese:

Delphi-Quellcode:
function CreateDocumentXML: boolean;
var
  Xml: IXMLDOCUMENT;
...
begin
  try
    Xml := NewXMLDocument;
    Xml.Encoding := 'utf-8';
    Xml.Options := [doNodeAutoIndent]; // looks better in Editor ;)
    ArchivNode := Xml.AddChild('archive');
.....

Ciao
Stefan

Stevie 11. Jul 2017 11:41

AW: Memoryleak woher?
 
Hilfe zur Selbsthilfe:

- FastMM4 herunterladen (die mit Delphi ausgelieferte ist etwas abgespeckt, was das genaue Lokalisieren des Leaks angeht):
- FastMM als erste unit in der Projekt dpr Einbinden
- irgendwo
Delphi-Quellcode:
ReportMemoryLeaksOnShutDown := True
rein schreiben
- FullDebugMode den Defines hinzufügen (Projektoptions -> Delphi Compiler -> Conditional defines) - hierbei auf die richtige Config oben in der Combobox achten.
- sicherstellen, dass in der entsprechenden Config Debug Informationen generiert und in der binary vorhanden sind (unter Linking entweder der Haken bei Debug Information) oder eine map Datei erzeugt wird - beides sollte in der standard Debug Config der Fall sein
- die FastMM_FullDebugMode.dll aus dem FastMM4 Repository unter "FullDebugMode DLL/Precompiled" in das Ausgabeverzeichnis deines Projekts (also neben die exe) kopieren (alternativ, irgendwo, wo Windows sie per PATH findet)
- Programm aus der IDE heraus mit Debugging(!) starten

Nach dem Beenden und Bestätigen des Dialogs mit dem Leak, sollte neben deiner exe eine txt Datei liegen, wo jeder Leak inklusive des Callstacks, der dazu führte aufgelistet ist.

Sherlock 11. Jul 2017 11:59

AW: Memoryleak woher?
 
@stevie & sakura:
Zitat:

21 - 28 bytes : TMBSEncoding x 1
Für mich sieht das schon ziemlich gut nach einem Teil einer FastMM Meldung zu einem Speicherleck aus. ;)

Sherlock

sakura 11. Jul 2017 12:10

AW: Memoryleak woher?
 
Zitat:

Zitat von Sherlock (Beitrag 1376443)
Zitat:

21 - 28 bytes : TMBSEncoding x 1
Für mich sieht das schon ziemlich gut nach einem Teil einer FastMM Meldung zu einem Speicherleck aus. ;)

Wie schon oben erwähnt, das von Delphi mitgelieferte ist abgespeckt. Die volle FastMM Version ist um Längen informativer.

...:cat:...

sakura 11. Jul 2017 12:12

AW: Memoryleak woher?
 
Zitat:

Zitat von sko1 (Beitrag 1376439)
Die einzige Programmstelle, wo überhaupt ein Encoding vorkommt, wäre diese:

Entweder du stellst den kompletten Quellcode als Anhang rein, oder du installierst FastMM und befolgst die Schritte von stevie. Aber alles andere hilft weder dir noch uns dabei dir zu helfen.

...:cat:...

Stevie 11. Jul 2017 12:51

AW: Memoryleak woher?
 
Zitat:

Zitat von Sherlock (Beitrag 1376443)
Für mich sieht das schon ziemlich gut nach einem Teil einer FastMM Meldung zu einem Speicherleck aus. ;)

Die Meldung dort zeigt nur das "was" - mit der von mir geposteten Anleitung kann man sich das "woher" (siehe Threadtitel) selbst beantworten, weil der Callstack, der zu der Speicherallokierung führt, geloggt wird.

Aviator 11. Jul 2017 13:47

AW: Memoryleak woher?
 
Ich hänge mich mal kurz an das Thema mit folgender Frage ran:

Ich entwickele zur Zeit eine Anwendung, die mehrere ebenfalls selbst programmierte DLLs einbindet und nutzt. Alle DLLs (13 an der Zahl) und die Anwendung selbst sind in der gleichen Projektgruppe.

Mir geht es jetzt hauptsächlich darum, wie ich evtl. vorhandene MemoryLeaks in einer DLL finden kann. Manchmal kommt es mir nämlich so vor, als ob Delphi mir die nicht wirklich anzeigt.

Wie muss ich genau vorgehen, um auch MemoryLeaks innerhalb einer DLL angezeigt zu bekommen? Muss ich die DLL selbst debuggen und als Host Anwendung meine Hauptanwendung angeben? Oder reicht es, einfach die Anwendung zu starten und dann die DLL Funktionen zu nutzen? In die DLL kann ich ja auch schrittweise reindebuggen wenn ich nur die Anwendung starte. Deshalb wundert es mich ein wenig.


Wäre super, wenn mir jemand darauf (auch in einem gekaperten Thread [aber mich gleichem Thema]) jemand eine Antwort geben könnte wie ich da genau vorgehen muss. :-D

sko1 11. Jul 2017 13:48

AW: Memoryleak woher?
 
Danke erst mal für die Tips!

Das mit dem FastMM4 werde ich jetzt in Angriff nehmen und Ergebnisse vermelden...

Ciao
Stefan

sakura 11. Jul 2017 14:08

AW: Memoryleak woher?
 
Zitat:

Zitat von Aviator (Beitrag 1376459)
Ich hänge mich mal kurz an das Thema mit folgender Frage ran:

Bitte nicht, dann wird es nur unnötig unübersichtlich. :roll:

...:cat:...

sko1 11. Jul 2017 14:19

AW: Memoryleak woher?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nach Eurer Beschreibung habe ich jetzt mal FastMM4 dazugehängt (Version 4991 von Sourceforge).

Nach Programmende bekommt ich folgende Meldung siehe Anhang.

Irgendwas mach ich aber noch falsch!

Ciao
Stefan

edit:
In der DLL-dpr-Datei habe ich jetzt die beiden defines ergänzt:

Delphi-Quellcode:
{$DEFINE FullDebugMode}
{$DEFINE LogMemoryLeakDetailToFile}
und nun gibt es am Programmende gar keine Meldung mehr!
Ist damit das Leak verschwunden?

Sherlock 11. Jul 2017 14:33

AW: Memoryleak woher?
 
Ich komme mit den Options nie so recht klar. Ich hab einfach in der dpr folgendes stehen (ausser dem uses FastMM4 an erster Stelle natürlich):

Delphi-Quellcode:
   System.ReportMemoryLeaksOnShutdown := True;
   SetMMLogFileName(PAnsiChar('C:\temp\Leaks.txt'));
Sherlock

sko1 11. Jul 2017 14:46

AW: Memoryleak woher?
 
Deine zweite Zeile ergibt bei mir

"[dcc32 Fehler] testdll.dpr(30): E2003 Undeklarierter Bezeichner: 'SetMMLogFileName'"

Ciao
Stefan

himitsu 11. Jul 2017 14:48

AW: Memoryleak woher?
 
System.ReportMemoryLeaksOnShutdown ist ausschließlich für den eingebauten FastMM

Die Options.inc und Funktionen ala SetMMLogFileName sind für den externen FastMM.
Der muß natürlich auch als erste Unit in der DPR eingebunden sein.

[edit] wenn du SetMMLogFileName aufrufen willst, dann mußt du auch die entsprechende Unit ins Uses aufnehmen.
System.pas und SysInit.pas werden dagegen immer automatisch eingebunden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 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