Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi AV aus dem Nirgendwo beim Beenden (https://www.delphipraxis.net/184902-av-aus-dem-nirgendwo-beim-beenden.html)

Der schöne Günther 29. Apr 2015 09:47

AV aus dem Nirgendwo beim Beenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe eine Win32-VCL-Anwendung. Beim Beenden bekomme ich, nicht nachvollziehbar, Zugriffsverletzungen. Weder der Debugger noch FastMM bringen mich hier irgendwie weiter- im Debuger sehe ich nur das hier:

Anhang 43062

Ich bin kein Meister am Debugger und weiß nicht wie ich mich hier verhalten soll.

TRomano 29. Apr 2015 10:13

AW: AV aus dem Nirgendwo beim Beenden
 
Wenn es wirklich nur beim Schließen der Anwendung vorkommt, solltest Du dir dort haltepunkte setzen, wo Formulare geschlossen werden (und es z.B. OnClose- oder OnDestroy-Events gibt) oder finalization-Abschnitte existieren. Vielleicht existieren dort irgendwelche Referenzen auf Objekte nicht mehr. So würde ich erst einmal vorgehen (in Unkenntnis deines Projektes). Meistens weiß ich noch, was ich gerade geändert hatte und habe da ebenfalls einen Anhaltspunkt ...

TheMiller 29. Apr 2015 10:29

AW: AV aus dem Nirgendwo beim Beenden
 
Hast du irgendwelche Threads während zur Laufzeit gestartet? Oftmals kommen AVs (zumindest bei mir), wenn ich bezüglich Threads etwas falsch gemacht habe - nicht richtig freigegeben, nicht synchronisierter Zugriff von Threads auf die VCL etc.

Der schöne Günther 29. Apr 2015 10:41

AW: AV aus dem Nirgendwo beim Beenden
 
Nein, ist eine eher simple Anwendung, nichts mit TThreads, auch sonst keine Abenteuerlichkeiten.

Mich irritiert der Callstack im Debugger. Der gibt ja wirklich absolut nichts her. Beim nächsten mal schaue ich aber mal in die anderen Threads, vielleicht geben die ja etwas her...

// Update:
Das Programm kommt problemlos bis zum letzten "end." der DPR, drücke ich danach F7: Es knallt in System.pas:_Halt0() unter

Delphi-Quellcode:
  if InitContext.DLLInitState = 0 then
    while ExitProc <> nil do
    begin
      @P := ExitProc;
      ExitProc := nil;
      P;
    end;
beim Aufruf von P()

Absolut keine Ahnung...

stahli 29. Apr 2015 11:41

AW: AV aus dem Nirgendwo beim Beenden
 
Hast Du es mal stand alone versucht (also nicht aus der IDE heraus starten)?

Ich hatte mal Probleme bei eigenen Framework-Controls, wenn nach der Projektausführung wieder die IDE wieder geöffnet wurde.

Der schöne Günther 29. Apr 2015 11:50

AW: AV aus dem Nirgendwo beim Beenden
 
Also ich steppe immer weiter durch und merke dass es beim Freigeben eins TPageControl knallt. Warum weiß ich nicht. Wo genau (also wohl eher ein darauf enthaltener Frame) weiß ich auch nicht. Der Debugger kann mir hier ja nicht helfen. :cry:

Uwe Raabe 29. Apr 2015 12:32

AW: AV aus dem Nirgendwo beim Beenden
 
Setz doch mal zwischen das
Delphi-Quellcode:
Application.Run
und das
Delphi-Quellcode:
end
ein
Delphi-Quellcode:
Application.DestroyComponents
. Taucht der Fehler dann noch auf? Kanst du ihn da besser debuggen?

Der schöne Günther 29. Apr 2015 12:47

AW: AV aus dem Nirgendwo beim Beenden
 
Nein, leider nicht.
Der Fehler tritt weiterhin auf und der Stack ist der gleiche. Ich gebe die Formulare vorher mal manuell frei und schaue was passiert. Oder lasse den "Globale Variable + Application.Run()"-Quatsch gleich ganz...

Uwe Raabe 29. Apr 2015 13:11

AW: AV aus dem Nirgendwo beim Beenden
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1299649)
Oder lasse den "Globale Variable + Application.Run()"-Quatsch gleich ganz...

Wenn es sich wirklich um eine eher simple Anwendung handelt, sollte der Quatsch aber durchaus funktionieren. Irgendwas machst du scheinbar anders als es gedacht ist. Nur kann man das von hier leider nicht sehen.

Union 29. Apr 2015 13:22

AW: AV aus dem Nirgendwo beim Beenden
 
Eventuell gibst Du Komponenten doppelt frei.

Sir Rufo 29. Apr 2015 13:25

AW: AV aus dem Nirgendwo beim Beenden
 
Zitat:

Zitat von Union (Beitrag 1299655)
Eventuell gibst Du Komponenten doppelt frei.

Da hilft dann nur statt
Delphi-Quellcode:
MyBlub.Free;
beherzt auf
Delphi-Quellcode:
FreeAndNil( MyBlub );
umzusteigen ;)

Der schöne Günther 29. Apr 2015 13:45

AW: AV aus dem Nirgendwo beim Beenden
 
Ich erzeuge weder dynamisch Komponenten, noch zerstöre ich sie explizit. Ich weiß nur dass es einen Timer gibt dessen Routine unter Umständen einmal länger als der Intervall dauern kann. Ob das sowas auslösen kann?

Mein Problem ist ja dass ich die Ursache nicht finden kann. Ich habe doch Debug-DCUs an. Warum bekomme ich keinen Stack?

stahli 29. Apr 2015 13:57

AW: AV aus dem Nirgendwo beim Beenden
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1299659)
Ich weiß nur dass es einen Timer gibt dessen Routine unter Umständen einmal länger als der Intervall dauern kann.

Das kann ggf. eine Zeitschleife auslösen und dafür verantwortlich sein, dass ich gelegentlich früh zu spät zur Arbeit komme. :stupid:
Eine AV dürfte das aber wohl nicht auslösen. Dann feuert halt eben das nächste Intervall, denke ich.

Hast Du meine Frage überlesen? Mal ohne Debug-Kontrolle versucht?

Ansonsten kannst Du auch mal die IDE debuggen. Vielleicht hilft das ja weiter...

Uwe Raabe 29. Apr 2015 14:18

AW: AV aus dem Nirgendwo beim Beenden
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1299659)
Mein Problem ist ja dass ich die Ursache nicht finden kann. Ich habe doch Debug-DCUs an. Warum bekomme ich keinen Stack?

Vermutlich taucht der Fehler erst auf, nachdem das Exception-Handling schon beendet wurde.

Aber eigentlich stochern wir doch hier alle im Trüben, da wir deinen Code nicht sehen können.

Bjoerk 29. Apr 2015 14:19

AW: AV aus dem Nirgendwo beim Beenden
 
Könnte doch mit dem Timer zusammenhängen. Wie isses denn so?
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FTimerEnabled := false;
  FDingens.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  try
    if FTimerEnabled then
      FDingens.MachWas;    
  finally
    if FTimerEnabled then
      Timer1.Enabled := true;
  end;
end;

Uwe Raabe 29. Apr 2015 14:43

AW: AV aus dem Nirgendwo beim Beenden
 
Und warum dann nicht gleich so:

Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Timer1.OnTimer := nil;  
  FDingens.Free;
end;
Das nil-Setzen verhindert einen erneuten Aufruf des Timer-Events. Dazu müsste aber eh noch irgendwo die Message-Queue abgearbeitet werden. Vielleicht schwirrt auch noch ein verträumtes
Delphi-Quellcode:
Application.ProcessMessages
rum?

rwalper 29. Apr 2015 15:24

AW: AV aus dem Nirgendwo beim Beenden
 
Bei solchen Problemen füge ich gerne OutputDebugString-Anweisungen an den Stellen ein, die mir verdächtig vorkommen bzw. die das zeitliche Abräumen der Controls in der Anwendung dokumentieren.

Beispiel:
Delphi-Quellcode:
  ...
  Application.Run;
  OutputDebugString('### Application.Run - Ende');
  ...
Beim Start in der IDE sieht man diese Debug-Strings dann im Ereignisprotokoll-Fenster. Und beim Start außerhalb der IDE nehme ich die Dbgview-Anwendung von den Sysinternals-Tools, um die Debug-Strings zu sehen.

Der schöne Günther 29. Apr 2015 16:36

AW: AV aus dem Nirgendwo beim Beenden
 
Vielen Dank für den seelischen Beistand soweit! :thumb:

Ich habe noch ein bisschen gewühlt und den gefunden dass es der Destruktor einer TeeChart-Komponente ist welche die AV auslöst. Anscheinend hatte ich das ohne "Debug-DCUs" installiert, daher der nicht vorhandene Aufrufstack (richtig?).

Da das nur beim Beenden (und wenn in den Chart überhaupt etwas gemalt wurde) passiert ist das nicht sonderlich wild. Werde ich auf Dauer wohl dahinterkommen...

himitsu 29. Apr 2015 19:37

AW: AV aus dem Nirgendwo beim Beenden
 
Oder er hat schrottige Komponenten (hab ich hier was von einem Frame gehört?), welche ihre Property nicht aufräumen, wenn angehängte Komponenten freigegeben werden.


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