![]() |
Wie Systemexception Ursache finden?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich ärgere ich bereits seit zwei Tagen mit einer Exception herum, die mich langsam in den Wahnsinn treibt. Das Programm in D2009. Ich lege in einer SQL-Datenbank einen Gruppenkopf an. Dann importiere ich ein paar Datensätze in die Bewegungsdatei. Öffne ich jetzt das Bearbeitungsmodul, dann kommt es zu einer Excption immer an der gleichen Stelle. (Fehlermeldung in der Anlage) Klicke ich die Fehlermeldung weg, dann funktioniert das Bearbeitungsmodul. Bei allen folgenden Programmstarts funktioniert das Programm dann klaglos. Wiederhole ich jetzt den Vorgang Datensätze löschen- Neuanlegen, dann kommt beim ersten Start des Bearbeitungsmoduls wieder einmalig der Fehler. Mit der Datenbank (Firebird) kann es nicht zusammenhängen. Ich habe vor dem Öffnen des Bearbeitungsmoduls ein Backup erzeugt. Nach dem Auftreten des Fehlers ein Restore. Dadurch wurde dieser nicht reproduzierbar. Irgendwie hängen die TMS - ADV Menüs da mit drin. Ich kann den Fehler fast an beliebiger Stelle im Initialisierungsteil der Datenstruktur durch ein Application.Processmessages auslösen. Dann rödelt er in den Menümessagesystem. Meist wird eine Speicherschutzverletzung, manchmal auch ein EInvalidCast angezeigt. Der Fehler selbst tritt in System.pas immer an der selben Stelle auf.
Delphi-Quellcode:
Application.Processmessages in try except Block bringt nichts.
procedure GetDynaMethod;
{ function GetDynaMethod(vmt: TClass; selector: Smallint) : Pointer; } asm { -> EAX vmt of class } { SI dynamic method index } { <- ESI pointer to routine } { ZF = 0 if found } { trashes: EAX, ECX } PUSH EDI XCHG EAX,ESI JMP @@haveVMT @@outerLoop: MOV ESI,[ESI] @@haveVMT: MOV EDI,[ESI].vmtDynamicTable TEST EDI,EDI JE @@parent MOVZX ECX,word ptr [EDI] <------ Fehlerstelle Hat wer eine Idee wo man noch suchen kann? Für einen Tip dankbar. Gruß Peter |
Re: Wie Systemexception Ursache finden?
hast du FastMM im Einsatz/getestet? Empfehle ich um Speicherlücken und doppelte Verwendung etc. leichter zu finden.
|
Re: Wie Systemexception Ursache finden?
So jetzt habe ich den Fehler gefunden. Ist natürlich reichlich herb.
Das Programm hat von Delphi1 bis Delphi2007 funktioniert. Der Effekt tritt erst mit D2009/Vista auf. Ich habe ein Auswahlfenster mit einem Grid für die Auswahl von Datensätzen. Mit Drag und Drop oder durch einen Doubleclick wähle ich einen Datensatz aus. Dragmode steht auf manual. Zuerst kommt das Ereignis MouseDown. Hier arbeite ich ein BeginDrag ab und gebe eine Differenz von 8 Pixeln für den Beginn der Drag Funktion. Danach kommt der zweite Klick, welcher als Doppelclick erkannt wird. Die ausgewählte ID wird an das aufrufende Programm übergeben und das Fenster geschlossen und freigegeben.
Delphi-Quellcode:
Das bekommt das Laufzeitsystem von Delphi wohl nicht mit und bei der erst besten Gelegenheit z.B. Application.Processmessages kommt der Absturz
With TAuswahlmodul,Create(Self) do
begin Showmodal; result := ID; Free; end; oder auch nicht. System.pas von Delphi greift auf den bereits freigegebenen Speicherbereich zu und versucht die Methodenliste aufzulösen. Was hier meine SQL Abfragen mit zu tun haben ? weis der Geier. Ich vermute das der Objektbereich nach dem Free noch initialisiert ist und der abgearbeitete Code noch irgendeinen Sinn macht. Nach größeren anderen Operationen ist der Speicher umgeschichtet und der alte, nicht mehr gültige Speicherbereich verursacht nun eine Speicherschutzverletzung. Der Debugger war bei diesem Fehler schlichtweg nicht zu gebrauchen und hat eher in die Irre geführt, als bei der Fehlersuche zu helfen. Gruß Peter |
Re: Wie Systemexception Ursache finden?
Delphi-Quellcode:
Das Problem ist, dass du Self als Owner übergibst.
With TAuswahlmodul.Create(Self {<=}) do
begin Showmodal; result := ID; Free; end; ![]() Hier ist ein englischer Artikel, der genau beschreibt, warum der Code "bad" ist. ![]() Ich kann jedem nur empfehlen, den Artikel zu lesen. Überaschende Erkenntnisse sind selbst für Fortgeschrittene garantiert. |
Re: Wie Systemexception Ursache finden?
Zitat:
Auf jeden Fall habe ich gerade so einige Dynamische-Formular-Erstellungs-Codes umgeändert :dp: Guter Aritkel! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 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-2025 by Thomas Breitkreuz