Discussion:
Exception beim Beenden meiner Applikation
(zu alt für eine Antwort)
Thomas Söhne
2006-07-21 14:08:11 UTC
Permalink
Hallo,

Meine Applikation wirft auf diversen Kundenrechnern eine EAccessViolation.

Von Madexcept erhalte ich diesen Output:

--
exception number : 1
exception class : EAccessViolation
exception message : Zugriffsverletzung bei Adresse 01066B78 in Modul
'dsadmin.exe'. Lesen von Adresse 00000008.

main thread ($664):
01066b78 +01c dsadmin.exe Classes 2847 +2 TList.IndexOf
01066da2 +012 dsadmin.exe Classes 2908 +1 TList.Remove
010d07f8 +014 dsadmin.exe Controls 2913 +1 ListRemove
010d6bbf +04b dsadmin.exe Controls 5829 +6 TWinControl.Remove
010d5d4c +0a4 dsadmin.exe Controls 5428 +15 TWinControl.Destroy
010a14c2 +036 dsadmin.exe ComCtrls 5595 +3 TCustomStatusBar.Destroy
010d5d58 +0b0 dsadmin.exe Controls 5429 +16 TWinControl.Destroy
010f098e +036 dsadmin.exe Forms 2076 +3 TScrollingWinControl.Destroy
010f1967 +0ab dsadmin.exe Forms 2638 +10 TCustomForm.Destroy
01071e96 +05a dsadmin.exe Classes 9853 +9 TComponent.DestroyComponents
010ef37e +036 dsadmin.exe Forms 1348 +3 DoneApplication
0104f548 +03c dsadmin.exe SysUtils 3409 +6 DoExitProc
01005143 +023 dsadmin.exe system 11349 +19 @Halt0
011c8a06 +246 dsadmin.exe dsAdmin initialization

thread $e18: <priority:1>
7c91eb94 +00 ntdll.dll KiFastSystemCallRet
7c91e319 +0a ntdll.dll NtRemoveIoCompletion
01049d19 +0d dsadmin.exe madExcept CallThreadProc
01049d5b +37 dsadmin.exe madExcept ThreadExceptFrame
719bdbb3 +00 mswsock.dll

cpu registers:
eax = 00000000
ebx = 011d0638
ecx = 008f2960
edx = 00000000
esi = 011d0048
edi = 00000000
eip = 01066b78
esp = 0012fec0
ebp = 0012fecc
--

Ich finde keine Ursache für den Fehler.

Meine Anwendung hat einen Logindialog, der im FormShow
meines Mainforms aufgerufen wird.
Wird die Anmeldung abgebrochen, folgt ein application.terminate; und ein
exit;
Und die Fehlermeldung erscheint.

Wenn ich mich erfolgreich anmelde, und die App beende kommt derselbe Fehler.

Hat jemand einen Tipp wie ich die Ursache herausfinden kann?

Danke und Grüße,
Thomas
Tim Westen
2006-07-22 15:35:31 UTC
Permalink
Post by Thomas Söhne
exception message : Zugriffsverletzung bei Adresse 01066B78 in Modul
^^^^^^^^
Post by Thomas Söhne
01066b78 +01c dsadmin.exe Classes 2847 +2 TList.IndexOf
^^^^^^^^ ^^^^^^^^^^^^^
Steht doch alles da :) Offenbar wird beim Beenden der Anwendung auf
irgendeine Liste zugegriffen, die zu diesem Zeitpunkt bereits freigegeben
wurde. Dahinter kann eine selbsterzeugte Liste oder irgendeine Komponente
stecken. Denkbar wäre zB, daß Du eine Liste oder Komponente in OnCloseQuery
freigibst, aber danach im OnClose nochmal darauf zugreifst. Oder daß Du auf
eine Liste zugreifst, die überhaupt nicht instantiiert wurde oder ähnliche
Fehlkonstruktionen. Vielleicht auch eine fehlerhafte Fremdkomponente.

Dieser Login-Dialog - wie und wo wird der denn erzeugt und freigegeben?
Automatisch oder händisch, und ist er dein Hauptformular?

Gruß, Tim.
Thomas Söhne
2006-07-24 10:06:11 UTC
Permalink
Hallo Tim,
Post by Tim Westen
Steht doch alles da :) Offenbar wird beim Beenden der Anwendung auf
irgendeine Liste zugegriffen, die zu diesem Zeitpunkt bereits freigegeben
wurde. Dahinter kann eine selbsterzeugte Liste oder irgendeine Komponente
stecken. Denkbar wäre zB, daß Du eine Liste oder Komponente in OnCloseQuery
freigibst, aber danach im OnClose nochmal darauf zugreifst. Oder daß Du auf
eine Liste zugreifst, die überhaupt nicht instantiiert wurde oder ähnliche
Fehlkonstruktionen. Vielleicht auch eine fehlerhafte Fremdkomponente.
Ich habe mal das Projekt durchsucht, FormClose/FormCloseQuery wurde an
einer Stelle als Erreignis in Verbindung mit einer Liste verwendet, die
untersuche ich noch.
Post by Tim Westen
Dieser Login-Dialog - wie und wo wird der denn erzeugt und freigegeben?
In der Projektunit, Freigabe automatisch.
Post by Tim Westen
Automatisch oder händisch, und ist er dein Hauptformular?
Nein, das Hauptformular bringt den Logindialog im eigenen Formshow zur
Anzeige.

Schonmal Danke, ich poste nochmal was, wenn es nicht an der o.g. Stelle lag.

Grüße Thomas
Thomas Söhne
2006-07-24 12:05:55 UTC
Permalink
Hallo Nochmal,
Post by Thomas Söhne
Ich habe mal das Projekt durchsucht, FormClose/FormCloseQuery wurde an
einer Stelle als Erreignis in Verbindung mit einer Liste verwendet, die
untersuche ich noch.
Leider ist das eine TStringlist, hab ich erst nicht gesehen.
Die Stringlist wurde hier als TList-Ersatz "missbraucht".

Ich habe einfach kein TList, das für die Exception verantwortlich sein kann.

Komponenten habe ich ausser den Standardkomponenten und Madexcept noch
das StringAlignGrid, alles Dinge die ich in anderen Projekten auch ohne
Fehler habe.

Grüße,
Thomas
Tim Westen
2006-07-29 17:13:07 UTC
Permalink
Post by Thomas Söhne
Komponenten habe ich ausser den Standardkomponenten und Madexcept noch
das StringAlignGrid,
Möglicherweise greifst Du ja darauf nochmal zu, während das Programm
bereits wieder beendet wird. Viele Komponenten arbeiten intern mit
TList-Objekten, gerade auch das TStringAlignGrid.

Generell ist Dein Application.Terminate; im OnShow-Event keine gute
Idee. Zu diesem Zeitpunkt ist das Hauptformular noch nicht vollständig
initialisiert - wenn Du Deinen Code debuggst, wirst Du feststellen, daß
nach dem Application.Terminate zB noch das OnActivate des Hauptformulars
aufgerufen wird. Und falls dort auf irgendwelche Komponenten des Formulars
zugegriffen wird, geht das höchstwahrscheinlich daneben.

Ich schlage vor, Du reparierst diesen Ablauf, mit einiger Wahrscheinlichkeit
ist der Fehler damit schon beseitigt. Erzeuge und zerstöre den Login-Dialog
manuell in der Projektdatei. Entferne dazu auch die globale Dialog-Variable
aus der Login-Dialog-Unit und verwende stattdessen eine lokale Variable.

Das Ganze vor der Erzeugung des Hauptformulars. Und das Hauptformular
erzeugst
Du nur dann, wenn das Login erfolgreich war, anderenfalls beendest Du Dein
Programm an Ort und Stelle wieder.

Gruß, Tim.

Loading...