Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Fehler beim Programm beenden (https://www.delphipraxis.net/186999-fehler-beim-programm-beenden.html)

Jens Hartmann 19. Okt 2015 19:53

Fehler beim Programm beenden
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen,

seid ein paar Tagen, bringt mein Programm beim schliessen der Anwendung einen seltsamen Fehler. Dieser tritt aber auch nicht immer auf. Siehe Bild im Anhang. Ich vermute, dass diese irgendwo damit zu tun hat, das ich beim beenden auf ein Objekt zugreifen will, welches es nicht mehr gibt. Das Problem allerdings ist, wie kann ich das finden.

Ich habe in der Projektdatein aktuell folgenden Code eingefügt und bekomme beim beenden die Fehlermeldung (siehe Bild 2)

Delphi-Quellcode:
   
{$IFDEF DEBUG}
ReportMemoryLeaksOnShutdown := True;
{$ENDIF}
Kann mir jemand eine Hilfestellung geben, wie ich das Problem auffinden kann?

geskill 19. Okt 2015 20:08

AW: Fehler beim Programm beenden
 
Bekommst du den MemoryLeak Report auch ohne die Zugriffsverletzung (AV)?

Wenn nein, dann folgt daraus, dass nach der AV eigentlich noch Objekte wären, die hätten freigegeben werden müssen. Die AV sorgt aber dafür, dass das Programm abbricht. Am besten kannst du den Fehler mit dem Debugger finden. Damit trotz AV Objekte freigegeben werden gibt es try .. finally .. end;

Wenn ja, dann haben die MemoryLeaks nichts mit der AV gemeinsam.


Bevor du mit dem Debugger arbeitest solltest du in den Projektoptionen Debug diverse Optionen wie Optimierung ausschalten. Dadurch wird dein Programm beim Debugger langsamer, aber du kannst dir noch Variablen ansehen, die der Compiler sonst schon wieder aus dem LX verworfen hätte.

Versuch einfach mal direkt wenn die AV kommt auf Anhalten zu klicken. Im IDE Fenster Call Stack bekommst eine Liste der Aufrufe, die zu diesem Fehler geführt haben (Ausführungsablauf). Daran kannst du dich nach oben entlanghangeln.

Vielleicht hilft dir dies schon weiter ;)

Luckie 19. Okt 2015 21:25

AW: Fehler beim Programm beenden
 
Andere Theorie: Du gibst Objekte frei die automatisch erzeugt werden und eigentlich auch automatisch wieder frei gegeben werden, aber da du sie schon frei gibst... Oder du gibts was frei, was schon freigegeben ist. Greifst auf schon freigegeben Objekte zu. Überpürf das alles mal.

Jens Hartmann 19. Okt 2015 21:41

AW: Fehler beim Programm beenden
 
Ich glaube, dass das ganze mit der Komponente VirtualStringTree zu tun hat. In der OnCloseQuery gebe ich das VST frei und irgendwie habe ich die Vermutung, das der Fehler dabei auftreten tut.
Nach der Fehlermeldung ist der VST nicht mehr sichtbar und die Anwendung ansonsten noch offen. Außerdem verwende ich in der VST Objekte.

Luckie 19. Okt 2015 22:08

AW: Fehler beim Programm beenden
 
Erstellt du ihn auch "von Hand" im Code?

Jens Hartmann 19. Okt 2015 22:52

AW: Fehler beim Programm beenden
 
Nein, liegt als Komponenten auf der Form...

Luckie 19. Okt 2015 23:28

AW: Fehler beim Programm beenden
 
Und warum gibst du ihn dann selbst frei?

Perlsau 20. Okt 2015 05:21

AW: Fehler beim Programm beenden
 
Zitat:

Zitat von Jens Hartmann (Beitrag 1319136)
Ich glaube, dass das ganze mit der Komponente VirtualStringTree zu tun hat. In der OnCloseQuery gebe ich das VST frei und irgendwie habe ich die Vermutung, das der Fehler dabei auftreten tut. Nach der Fehlermeldung ist der VST nicht mehr sichtbar und die Anwendung ansonsten noch offen. Außerdem verwende ich in der VST Objekte.

Wenn du den VirtualStringTree (VST) nicht selbst erzeugst, darfst du ihn auch nicht selbst freigeben. Legst du einen VST auf die Form, erhält dieser automatisch die Form als Eigentümer (Owner) und wird somit automatisch freigegeben, wenn die Form freigegeben wird. Mit irgendwelchen Objekten, die du dem VST zuweist, ist es ähnlich: Du mußt feststellen, ob diese Objekte beim Zerstören des VST ebenfalls zerstört werden und wenn nicht, diese Objekte zuerst freigeben.

Im Übrigen sollte man Freigaben niemals im OnCloseQuery machen, sondern immer im OnDestroy, weil erst im OnDestroy sichergestellt ist, daß die Zerstörung nun wirklich begonnen hat und auch durchgeführt wird. So könnte im OnClose, das nach OnCloseQuery aufgerufen wird (wenn CanClose = True), auch etwas anderes als das caFree vereinbart werden oder worden sein; der Standard-Wert ist nämlich caHide. Nur wenn die zu schließende Form auch die Mainform ist, wird bei OnClose automatisch caFree aufgerufen.

Um genau herauszufinden, wo diese ominösen Memory-Leaks entstehen, wäre es zielführend, das Programm-Ende ein- oder mehrmals sorgfältig durchzusteppen. Beim letzten meiner Kunden, der dieses Problem hatte, wurde in seiner vollkommen undurchschaubaren Anwendung mehrfach OnClose oder OnDestroy aufgerufen, was sich natürlich fatal auf die saubere Beendigung des Programms auswirkt. Oft werden bei älteren Anwendungen auch massenweise Hinweise und Warnungen mitgeschleppt und ignoriert (besagter Kunde erzeugte bei jedem Kompilierungsvorgang mehrere Hundert!). Da muß man sich einfach die Zeit nehmen, das einmal in aller Ruhe zu bereinigen. Häufig erledigen sich dadurch bereits zahlreiche Fehlerquellen, vor allem beim Beheben von Warnungen über nicht initialisierte Variablen.

Dejan Vu 20. Okt 2015 06:44

AW: Fehler beim Programm beenden
 
Die Memoryleaks kommen vom vorzeitigen Abbruch der Anwendung, jede Wette. Na ja. Fast jede. :mrgreen:

Jens Hartmann 20. Okt 2015 07:34

AW: Fehler beim Programm beenden
 
Danke schon mal zusammen, werde das heute Abend mal anpassen.

Das ich eine VST normal nicht freigeben muss (wenn es auf der Form liegt), war mir eigentlich klar, allerdings meine ich mich daran errinnern zu können, das ich das vor einiger Zeit mal eingebaut habe, weil ein ähnliches Problem vorhanden war und das Problem mit dem VST.free erledigt war.

Hat mich damals schon gewundert. Ich werde heute mal alle Warnungen versuchen zu beseitigen und schauen das alle Objekte zum passenden Zeitpunkt freigegeben werden. Die Freigabe vom VST nehme ich wieder raus.

Dann schaun war mal

Danke und Gruß Jens


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 Uhr.
Seite 1 von 4  1 23     Letzte »    

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