Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Runtime Error 216 (https://www.delphipraxis.net/116086-runtime-error-216-a.html)

hsbc 23. Jun 2008 10:22


Runtime Error 216
 
Hallo allerseits,

Meine Delphi-Anwendung liefert eine Fehlermeldung:

Zitat:

Anwendung hat einen Fehler festgestellt und muss beendet werden.
...
Melden / Nicht melden
Wenn ich nun auf Nicht melden drücke, so erscheint ein weiteres kleines Fenster mit folgendem Inhalt:

Zitat:

Runtime Error 216 at 00404126
Das Interessante ist, dass die Anwendung entgegen der Meldung nicht beendet wird, sondern bis zum Schluss ordnungsgemäß abläuft.

Was sagt mir die Fehler-Adresse? Wie kann ich feststellen, warum der Fehler ausgelöst wird?

Ja, noch was: Die Meldung kommt nur dann, wenn im Hintergrund ein Programm für ShutDown läuft, jedoch zu diesem Zeitpunkt keine Aktion auslöst. Wenn ich dieses ShutDown-Programm nicht laufen habe, kommen auch keine Fehlermeldungen von meinem Programm.
Starte ich von meiner Anwendung jedoch eine andere (ältere) Version, so funktioniert es auch parallel mit ShutDown.

Ein Virus ist ebenfalls keiner auf der Platte. Diese wurde komplett mit dem neuesten Virenscanner Avira AntiVir Personal durchgescannt.

Wie kann ich vielleicht auf Grund der Fehler-Adresse herausfinden, was die Ursache ist.

mfg
Herbert

alzaimar 23. Jun 2008 10:27

Re: Runtime Error 216
 
Der Fehler tritt auf, nachdem das Delphiprogramm (Application-Object) beendet wurde. Du kannst versuc hen, mit dem integrierten Debugger der IDE den Fehler zu lokalisieren. Stelle die Compiler-Option 'Mit Debug-DCU' in den Projektoptinen ein, setze einen Breakpoint auf die letzte Zeile des Programmquelltextes (auf das 'End.') und beende dein Programm in der IDE.
Dann gehst Du per Einzelschritt vorwärts. Diese Fehler sind nicht leicht zu lokalisieren, vermutlich wird irgendwo im finalization-Abschnitt ein Objekt verwendet, das nicht mehr gültig ist. Kandidaten dafür sind z.B. Threads, die in ihrer Terminationsroutine auf Objekte der Unit 'Classes' zugreifen, die aber schon freigeben wurden.
Abhilfe: Gib die Threads frei BEVOR das Programm terminiert.

Virus & Co kann man zu 99.999% ausschließen. Der Fehler liegt :zwinker: immer im Programm(ierer).

hsbc 23. Jun 2008 10:52

Re: Runtime Error 216
 
Hallo,

das ging aber schnell.

Kann es sein, dass ein Timer die Ursache sein könnte? Ich werde mir mal ansehen, ob dieser zum Zeitpunkt des Beendens noch enabled ist.

Das Problem beim Debuggen ist folgendes:

Auf dem Rechner, wo der Fehler auftritt, ist kein Delphi installiert.
Auf meinem Delphi-Rechner hingegen tritt dieser Fehler überhaupt nie auf.

mfg
Herbert

Luckie 23. Jun 2008 10:57

Re: Runtime Error 216
 
Kleiner Tipp, guck mal in der Hilfe nach, was Laufzeitfehler 216 ist.

hsbc 23. Jun 2008 11:13

Re: Runtime Error 216
 
Hallo nochmals,

ich lese schon eine ganze Zeit lang in den diversen Unterlagen. Zum Fehler 216 gibt es leider keine eindeutige Antwort. Einmal heisst es, es kann ein Virus (Trojaner SubSeven) sein, dann heisst es wieder, es können Programme sein, die im Hintergrund laufen, usw.

Ich glaube aber, dass es doch an meiner Application liegen muss, obwohl auf verschiedenen Rechnern verschiedene Ergebnisse entstehen.

Bei dem obigen Tipp mit dem Breakpoint bin ich auf folgende Routine einer eingebundenen Indy-Unit gekommen:

Delphi-Quellcode:
initialization
  RegisterFTPListParser(TIdFTPLPMusic)
finalization
  RegisterFTPListParser(TIdFTPLPMusic)
end;
Das kann doch nicht stimmen. In der finalization sollte doch stehen: UnRegister....

Ich habe das mal geändert und neu compiliert. Mal sehen, was passiert.

mfg
Herbert

Luckie 23. Jun 2008 12:03

Re: Runtime Error 216
 
also meine Hilfe sagt ganz eindeutig dazu:
Zitat:

216 Schutzverletzung EAccessViolation
Und warum sollte ein anderes Programm in deiner Anwendunge eine AccessViolation auslösen?

hsbc 23. Jun 2008 12:12

Re: Runtime Error 216
 
Hallo Luckie,

genau, das ist ja auch meine Meinung, nur wie komme ich dem Übeltäter auf die Spur.

Wie könnte ich vorgehen, um die Ursache zu finden?

Kann ich aufgrund der Fehler-Adresse etwas finden?

mfg
Herbert

RavenIV 23. Jun 2008 12:31

Re: Runtime Error 216
 
Verwendest Du dll's?
Dann fehlt bestimmt ein ShareMem in der dpr als ersten Eintrag bei den uses.
Wenn Du eine dll per Assistent erstellst, wird in den dpr der dll ein Hinweis auf sharemem gegeben.

Falls ohne dll, dann kannst Du die sharemem trotzdem einbinden. Tut ja nicht weh.

toms 23. Jun 2008 12:33

Re: Runtime Error 216
 
Zitat:

Zitat von hsbc
Wie könnte ich vorgehen, um die Ursache zu finden?

Kann ich aufgrund der Fehler-Adresse etwas finden?

Hallo, du könntest mal madexcept installieren.
Sollte dir dann die Zeile im Code angeben, wo der Fehler herkommt.

hsbc 23. Jun 2008 13:02

Re: Runtime Error 216
 
@RavenIV

Wenn ich ShareMem hinzufüge, kommen auch auf dem Entwickler-PC folgende Fehler:

Runtime Error 216 at 00404172 und nach wiederholten Aufrufen
Runtime Error 217 at 0041BED4


@toms

madexcept habe ich installiert. Muss ich da irgendetwas starten bzw. einfügen, damit ich etwas sehe?

mfg
Herbert

hsbc 24. Jun 2008 07:13

Re: Runtime Error 216
 
Da ich nach wie vor noch keine Lösung habe und das Problem am Entwicklungsrechner absolut nicht vorkommt, habe ich mal madexcept installiert und die neu compilierte Anwendung am anderen Rechner gestartet. Ergebnis:

Zitat:

Access Violation
... bei Adresse 00406f82 in Modul 'anwendung.exe'. Lesen von Adresse 00B78C1C

Main ($da0):
00406f82 +0e anwendung.exe System @IntfClear
Wie komme ich im Quelltext zu dieser Adresse ?

Kann jemand damit etwas anfangen?

Ich brauche nochmal eure Hilfe.

mfg
Herbert

hsbc 24. Jun 2008 08:23

Re: Runtime Error 216
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, jetzt habe ich noch einen Versuch gemacht:

Habe FASTMM4 eingebunden und bekomme jetzt folgende Meldung beim Beenden des Programms (siehe Anhang):

Schaut für mich so aus, als wären die Übeltäter in Indy zu finden. Kann das sein bzw. wenn ja, was kann ich dagegen tun?

mfg
Herbert

RavenIV 24. Jun 2008 08:25

Re: Runtime Error 216
 
Das sind MemoryLeaks, also Löcher im Speicher.
Vermutlich von nicht freigegebenen Objekten.

Das muss aber nicht heissen, dass das Programm deshalb eine Fehlermeldung erzeugt.

hsbc 24. Jun 2008 11:13

Re: Runtime Error 216
 
Mittlerweile konnte ich mein Problem ein wenig einkreisen.

Ich rufe mittels ButtonClick von meinem Hauptformular aus ein weiteres Formular (Unit FTP) auf. In dieser Unit habe ich in letzter Zeit einiges geändert.

Die Unit FTP ist im Hauptformular mit uses FTP eingefügt, das Formular wird bei Bedarf per ButtonClick erzeugt:

Delphi-Quellcode:
procedure ButtonClick(Sender: TObject);
begin
  Application.CreateForm(TF_FTP, F_FTP);
  F_FTP.ShowModal;
  F_FTP.Free;
end;
Ich habe nun aus meinem Projekt diese Unit FTP mal entfernt - und siehe da, die Fehlermeldungen sind weg.

Jetzt meine Fragen:

Wieso kommen die Fehlermeldungen bei hinzugefügter Unit FTP, obwohl der Button zum FTP.ShowModal NIE gedrückt wurde?
Wird da eben bei Programmstart in der Unit FTP trotzdem etwas initialisiert, wenn ja, was bzw. wo?

mfg
Herbert

RavenIV 24. Jun 2008 11:16

Re: Runtime Error 216
 
Zitat:

Zitat von hsbc
Wieso kommen die Fehlermeldungen bei hinzugefügter Unit FTP, obwohl der Button zum FTP.ShowModal NIE gedrückt wurde?
Wird da eben bei Programmstart in der Unit FTP trotzdem etwas initialisiert, wenn ja, was bzw. wo?

Wird die Unit FTP im dpr erzeugt?
Dann wird sie natürlich bei Programmende auch wieder gelöscht.
Dabei wird dann wohl der Fehler entstehen.

hsbc 24. Jun 2008 14:12

Re: Runtime Error 216
 
Vielen herzlichen Dank nochmals an euch alle. Ich glaube, ich konnte mit eurer Hilfe mein Problem lösen.

Durch das ewige Herumprobieren - unit FTP aus dem Programm entfernen / in das Programm einschliessen, usw. - hatte sich die unit FTP in das dpr automatisch eingetragen. Parallel dazu öffnete ich ja mittels ButtonClick das Formular händisch (siehe weiter oben). Das war vermutlich auch der Grund, dass ShareMem noch mehr Fehler produzierte.

Nachdem ich jetzt die automatischen Einbindung der FTP-Unit gelöscht habe, lässt sich auch ShareMem fehlerfrei einbinden. Seitdem läuft meine Anwendung jetzt fehlerfrei. Ich hoffe, dass dieser Zustand weiterhin anhält und dies die Ursache für die Fehlermeldungen war.

Sollte wider Erwarten nochmals ein Problem auftreten, werde ich die hier berichten.

mfg
Herbert


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