Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Exception beim Schließen ohne genauen Hintergrund (https://www.delphipraxis.net/111536-exception-beim-schliessen-ohne-genauen-hintergrund.html)

s.h.a.r.k 4. Apr 2008 23:41


Exception beim Schließen ohne genauen Hintergrund
 
Guten Abend,

so komisch sich der Thread-Titel anhört, so komisch ist mein Problem auch. Ich habe eine Anwendung mit mehreren Klassen, mehreren Dialogen etc. Nun ist es so, dass ich mir einen ObjektManager erstellt habe, von dem aus alle Objekte erstellt werden, also ein Baum mit einer Instanz des ObjektManager als Wurzel. Wende ich dann am Schluss, d.h. beim OnClose des Programms FreeAndNil(); auf diesen an, wird jedes Objekt brav vernichtet.

Seit heute ist es aber so, dass auf einmal eine Exception (Zugriffsverletzung an ...) auftritt, wenn ich das Programm schließe. Natürlich arbeite ich immer weiter an dem Objekt. Allerdings habe ich nur einige kleine Details daran geändert. Wenn die Exception auftritt und ich dann auf Anhalten klicke springt die IDE nicht zu dem Punkt, an dem die Exception auftritt. Ich habe das Problem soweit eingrenzen können, dass ich weiß, dass beim FreeAndNil(); auf eine Form bzw. bei dessen Ausführung, die ich über den ObjektManager erzeugt habe der Fehler auftritt. Ich habe mir zwei Haltepunkte gesetzt. Einen genau auf den Befehl, der nach Ausführung die Exception wirft und einen danach. Drücke ich F9 erscheint die Exception und ich weiß nicht wieso. Vielleicht kennt das Problem jemand?

Des Weiteren habe ich probiert dieses FreeAndNil() heraus zu lassen. Sogar mit Erfolg, nur finde ich es total unzufriedenstellend, da es einfach unsauber ist. Unsauber und unschön... Windows holt sich doch zwar den Speicher zu zurück (oder irre ich hier?), aber ich will alles selbst kontrollieren, auch wenn es nur beim Schließen auftritt, an einer Stelle wo es mir egal sein könnte.

Mit freundlichen Grüßen
der Hai ;)

busybyte 5. Apr 2008 00:01

Re: Exception beim Schließen ohne genauen Hintergrund
 
Meine Gedanken:
Möglichkeit 1: ein Objekt wurde bereits freigegeben
zu prüfen mit if not (irgendwas=nil) oder if Assigned(irgendwas) then freeandnil(irgendwas);

Möglichkeit 2a: ein Timer oder Thread versucht noch auf das Objekt zuzugreifen
alle Timer im OncloseQuerry stoppen bzw.Threads terminieren

Möglichkeit 2b: eine andere Methobe bzw. Objekt versucht noch auf das Objekt zuzugreifen
Lösung nur mit Quellcode möglich,da Glaskugel leider defekt.

Muetze1 5. Apr 2008 00:05

Re: Exception beim Schließen ohne genauen Hintergrund
 
Zitat:

Zitat von busybyte
zu prüfen mit if not (irgendwas=nil) oder if Assigned(irgendwas) then freeandnil(irgendwas);

Das FreeAndNil(irgendwas); würde vollkommen reichen, da die Abfrage auf NIL im enthaltenen Free gemacht wird.

s.h.a.r.k 5. Apr 2008 19:47

Re: Exception beim Schließen ohne genauen Hintergrund
 
Das Problem ist aber, wie ich an die Stelle gelange, die den Fehler verursacht. Bisher ist Delphi ja immer an die passende Stelle gesprungen, aber irgendwie tut es da ja nicht. Ich weiß in dem Fall nicht wirklich wie ich eben da hin komme. Über das CPU-Fenster habe ich es auch schon probiert, allerdings gelange ich da nur an die Stelle, an der die Exception geworfen wird. Das hat ja nichts mit meinem Programm zu tun...

Bzgl den Timern: Haltet ihr es sinnvoll einen timerManager einzubauen und eine eigene von TTimer abgeleitete Klasse zu implementieren. Wenn ich dann einen Timer davon erzeuge registriert sich der Timer dann automatisch beim TimerManager. Diese muss ich dann beim Schließen eben noch anweisen eben alle anzuhalten.

igel457 5. Apr 2008 19:54

Re: Exception beim Schließen ohne genauen Hintergrund
 
Vielleicht hast du irgendwo ein Memoryoverlay verursacht. Überprüfe, ob du irgendwo über einen bestimmten Speicherbereich hinaus schreibst.

Beispiel 1:
Delphi-Quellcode:
var
  i: integer;
  arr: array of integer;
begin
  SetLength(arr, 10);
  for i := 0 to 20 do
    arr[i] := 0;
Beispiel 2:
Delphi-Quellcode:
var
  i: integer;
  mem: PByte;
begin
  GetMem(mem, 512);
  for i := 0 to 1024 do
  begin
    mem^ := 0;
    inc(mem);
  end;

Dani 5. Apr 2008 20:15

Re: Exception beim Schließen ohne genauen Hintergrund
 
Zitat:

Zitat von s.h.a.r.k
Drücke ich F9

Drück doch mal F7, vielleicht bringt das etwas Licht in die Sache. Alternativ: vielleicht gibts die betreffende Form gar nicht mehr, weil im OnClose "Action: TCloseAction" auf caFree gesetzt wird?

MrKnogge 5. Apr 2008 20:18

Re: Exception beim Schließen ohne genauen Hintergrund
 
Nutzt du irgendwelche speziellen Komponenten ?

sx2008 5. Apr 2008 21:58

Re: Exception beim Schließen ohne genauen Hintergrund
 
Verwendest du selbstdefinierte Interfaces ?
Also etwa so:
Delphi-Quellcode:
  TMyObject = class(TPersistent, IMyLogging)

s.h.a.r.k 8. Apr 2008 09:39

Re: Exception beim Schließen ohne genauen Hintergrund
 
Zitat:

Zitat von igel457
Vielleicht hast du irgendwo ein Memoryoverlay verursacht. Überprüfe, ob du irgendwo über einen bestimmten Speicherbereich hinaus schreibst.

Das denke ich nicht, dass das der Fall ist, da ich da immer recht gut darauf aufpasse.

Zitat:

Zitat von Dani
Drück doch mal F7, vielleicht bringt das etwas Licht in die Sache. Alternativ: vielleicht gibts die betreffende Form gar nicht mehr, weil im OnClose "Action: TCloseAction" auf caFree gesetzt wird?

Das hat mir auch nicht die versprochene Lösung bescheert, leider :( das mit dem caFree kann aber durchaus sein, da ich MDI-Forms habe und diese eben mit caFree freigebe. Muss ich mir mal näher anschauen! Danke für den Tipp.

Zitat:

Zitat von MrKnogge
Nutzt du irgendwelche speziellen Komponenten ?

Die folgende Frage drängt sich hier auf: Was genau verstehst du unter "speziell"? Ich nutze Toolbar2000+TBX, VirtualDrawTree und AnyDAC 1.x für die Datenbankanbindung. Weiterer bin ich mir gerade nicht mehr bewusst. Es hat bisher ja alles funktioniert. Daher würde es mich überaus wundern, wenn es daran liegen sollte.

Zitat:

Zitat von sx2008
Verwendest du selbstdefinierte Interfaces ?

Nein, Interfaces nutze ich gar nicht.


Resumée: Ich denke, dass es an den Timern liegt, werde es allerdings erst heute wieder genauer unter die Lupe nehmen können, d.h. ihr bekommt noch im Laufe des Tages ein Feedback darüber was, wann und wo schief gelaufen ist ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 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 by Thomas Breitkreuz