![]() |
Zugriffsverletzung bei Programmende (nicht nachvollziehbar)
Hallo,
seit etlichen Jahren (Delphi 1) arbeite ich an einem größeren Programm, das auch hervorragend läuft und immer weiter wächst und gedeit. Wenn ich einen kompletten Build mache komme ich intwischen auf 239000 Zeilen (nicht alle von mir). So weit so gut. Wenn ich das Programm aus der IDE heraus starte klappt alles prima. Wenn ich es aber stand-alone starte kommte es beim Beenden hin und wieder zu Zugriffsverletzungen. Meist sind es etwa 10 Stück. Da sie NIE in der IDE auftreten weiß ich nicht wie ich sie debuggen soll. Mir ist klar, dass hier wahrscheinlich Speicher aufgeräumt wird, den ich schon deallokiert habe, aber wie kann ich herausfinden welcher? Das Problem ist, dass der Fehler nicht nachvollziehbar ist. Ich öffne das Programm, gehe in ein oder zwei Dialoge, beende das Programm und dann tritt der Fehler manchmal auf und manchmal nicht. Dann kann es sein, dass bei mir alles klappt und dass dann einer meiner User nach der Installation (Inno Setup) trotzdem die Zugriffsverletzungen bekommt. Hin und wieder denke ich sogar, dass es am Build hängt, denn wenn ich nach einen "fehlerhaften" Build das Programm nochmal baue ist der Fehler zumindest bei mir oft weg (ich sollte die Builds wirklich mal vergleichen). Gibt es irgendwelche Tools um dieses hartnäckige Probem zu lösen? Habt Ihr sonst irgendwelche kreativen Ideen? Habt Ihr ein solches Problem mal selbst gehabt? Peter |
Re: Zugriffsverletzung bei Programmende (nicht nachvollziehb
Hi,
Hantierst Du irgendwo vielleicht mit Zeigern, die Fehler auslösen könnten? Verwendest Du Threads, die evtl. nicht beendet werden? mfG mirage228 |
Re: Zugriffsverletzung bei Programmende (nicht nachvollziehb
Wenn der Fehler, außeer der Tatsache, dass er eben kommt, nichts ausmacht, kannst du ihn ja (uneleganterweise ;)) mit try-except unterdrücken.
sonst kannst du noch mit showmessages debuggen, die immer die aktuelle Position anzeigen. |
Re: Zugriffsverletzung bei Programmende (nicht nachvollziehb
Moin Peter,
in solchen Fällen könnten MemProof und/oder ![]() Speziell MadExcept wäre hier wohl hilfreich, da Dir bei einem Fehler i.d.R. der gesamte CallStack mit angezeigt wird. |
Re: Zugriffsverletzung bei Programmende (nicht nachvollziehb
Hi,
natürlich benutze ich Zeiger, Threads sind dann keine mehr offen (bestimmt). Ich kann aber ziemlich sicher ausschliessen, dass Zeiger mein Problem sind. Wie gesagt. Zehnmal das Programm gestartet, das selbe gemacht und fünfmal Fehler und fünfmal nicht. Kann es hier in Windows zu Unterschieden kommen? Wie kann ich Zugriffsverletzungen am Ende des Programms debuggen? Sie treten nach meiner letzten Programmzeile auf. Sorry, muss jetzt weg. Kann erst heute abend wieder antworten. |
Re: Zugriffsverletzung bei Programmende (nicht nachvollziehb
Ein beliebter Auslöser für solche Effekte ist es auch, wenn man hier und da mal Array-Grenzen überschreitet. Um das herauszufinden einfach mal die Bereichsprüfung anknpisen. (Solltest du allerdings C-Like simulierte dynamische Arrays ala "array[0..0] of xxx" mit GetMem und Zeigerarithmetik verwenden, so hilft die Bereichsprüfung nicht wirklich.)
Auch beliebt ist das manuelle Freigeben von automatisch erzeugen Formularen (bzw. Komponenten), die beim Beenden nochmals freigegeben werden. Danach u.U. auch mal Ausschau halten. Dass die Exceptions innerhalb der IDE nicht auftauchen, könnte daran liegen, dass du dies abgeschaltet hast. Mal in die Debugger-Optionen schauen. Gruss, Fabian |
Re: Zugriffsverletzung bei Programmende (nicht nachvollziehb
Ich hatte auch schon solche Fehler :wall: , und mir hat MemCheck (freeware) sehr geholfen!
Findet man schnell über google. Kann ich wirklich empfehlen. Die IDE merkt es nicht immer wenn man mal was 2x freigibt. Viel Erfolg. Thomas |
Re: Zugriffsverletzung bei Programmende (nicht nachvollziehb
Moin Peter,
Zitat:
Da können Dir die schon genannten Tools helfen. Wenn Du das Projekt mit Debug DCUs kompilierst kannst Du u.U. auch nach Deiner letzten Zeile debuggen. |
Re: Zugriffsverletzung bei Programmende (nicht nachvollziehb
Dank MadExcept weiss ich jetzt, dass die Exception in der Procedure DoneControls in der Controls.pas passiert und zwar bei:
Delphi-Quellcode:
Application.Free; <---
... ![]() :?: :?: Ich bin mir sehr sicher, dass ich das Application Objekt nicht selbst anrühre. Was passiert hier? Bin jetzt fast noch ratloser. Hat das was mit irgendwelchen Popup-Menüs oder dem Hauptmenü zu tun? |
Re: Zugriffsverletzung bei Programmende (nicht nachvollziehb
Hallo Peter,
das Application Objekt versucht alles was ihm "gehört" wegzuräumen, aber es scheint etwas schon vorher weggeräumt worden zu sein. Hast Du irgendwelche Komponenten manuell erstellt - also nicht auf das Formular plaziert, sondern mit create selbst erzeugt ? Wenn ja kommt es drauf an ob Du die Owner und Parent Eigenschaften korrekt gesetzt hast. Owner solltest Du auf NIL setzen und dann die Komponente selber freigeben. Parent muss manuell auf z.B das Form gesetzt werden, damit die Komponente korrekt gezeichnet werden kann. z.B.
Delphi-Quellcode:
Grussprocedure TForm1.OnCreate; begin myButton := tButton.Create(nil); myButton.Parent := Self; ... end; procedure TForm1.OnDestroy; begin myButton.Free; end; Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr. |
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-2025 by Thomas Breitkreuz