Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffsverletzung bei Programmende (nicht nachvollziehbar) (https://www.delphipraxis.net/61440-zugriffsverletzung-bei-programmende-nicht-nachvollziehbar.html)

Peter Mössinger 21. Jan 2006 14:28


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

mirage228 21. Jan 2006 14:30

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

ichbins 21. Jan 2006 14:32

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.

Christian Seehase 21. Jan 2006 14:32

Re: Zugriffsverletzung bei Programmende (nicht nachvollziehb
 
Moin Peter,

in solchen Fällen könnten MemProof und/oder Bei Google suchenMadExcept helfen.
Speziell MadExcept wäre hier wohl hilfreich, da Dir bei einem Fehler i.d.R. der gesamte CallStack mit angezeigt wird.

Peter Mössinger 21. Jan 2006 14:37

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.

dizzy 21. Jan 2006 14:49

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

thkerkmann 21. Jan 2006 15:29

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

Christian Seehase 22. Jan 2006 00:06

Re: Zugriffsverletzung bei Programmende (nicht nachvollziehb
 
Moin Peter,

Zitat:

Zitat von Peter Mössinger
Wie kann ich Zugriffsverletzungen am Ende des Programms debuggen? Sie treten nach meiner letzten Programmzeile auf.

dass schon, aber die Ursache liegt mit Sicherheit in Deinen Programmzeilen ;-)
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.

Peter Mössinger 22. Jan 2006 01:30

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; <---
  ...
http://www.rttv.de/ergebnisdienst/fehler.jpg

:?: :?:

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?

thkerkmann 22. Jan 2006 10:50

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:

procedure TForm1.OnCreate;
begin
  myButton := tButton.Create(nil);
  myButton.Parent := Self;
  ...
end;

procedure TForm1.OnDestroy;
begin
  myButton.Free;
end;
Gruss
Thomas


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

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