AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Systemexception Ursache finden?

Ein Thema von hanspeter · begonnen am 6. Apr 2009 · letzter Beitrag vom 6. Apr 2009
Antwort Antwort
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#1

Wie Systemexception Ursache finden?

  Alt 6. Apr 2009, 11:07
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:
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
Application.Processmessages in try except Block bringt nichts.

Hat wer eine Idee wo man noch suchen kann?
Für einen Tip dankbar.

Gruß
Peter
Miniaturansicht angehängter Grafiken
fehler_464.gif  
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Wie Systemexception Ursache finden?

  Alt 6. Apr 2009, 11:11
hast du FastMM im Einsatz/getestet? Empfehle ich um Speicherlücken und doppelte Verwendung etc. leichter zu finden.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Wie Systemexception Ursache finden?

  Alt 6. Apr 2009, 18:41
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:
With TAuswahlmodul,Create(Self) do
begin
  Showmodal;
  result := ID;
  Free;
end;
Das bekommt das Laufzeitsystem von Delphi wohl nicht mit und bei der erst besten Gelegenheit z.B. Application.Processmessages kommt der Absturz
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
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Wie Systemexception Ursache finden?

  Alt 6. Apr 2009, 19:34
Delphi-Quellcode:
With TAuswahlmodul.Create(Self {<=}) do
begin
  Showmodal;
  result := ID;
  Free;
end;
Das Problem ist, dass du Self als Owner übergibst.
http://z.about.com/d/delphi/1/5/c/A/baddynamic1.gif
Hier ist ein englischer Artikel, der genau beschreibt, warum der Code "bad" ist.
http://delphi.about.com/od/kbcurt/ss...iccreateno.htm
Ich kann jedem nur empfehlen, den Artikel zu lesen.
Überaschende Erkenntnisse sind selbst für Fortgeschrittene garantiert.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Wie Systemexception Ursache finden?

  Alt 6. Apr 2009, 20:11
Zitat von sx2008:
Das Problem ist, dass du Self als Owner übergibst.
Hier ist ein englischer Artikel, der genau beschreibt, warum der Code "bad" ist.
http://delphi.about.com/od/kbcurt/ss...iccreateno.htm
Ich kann jedem nur empfehlen, den Artikel zu lesen.
Überaschende Erkenntnisse sind selbst für Fortgeschrittene garantiert.
Oh, ich wußte einigermaßen bescheid über die Owner-Geschichte, aber dieser Artikel hat mich echt überrascht
Auf jeden Fall habe ich gerade so einige Dynamische-Formular-Erstellungs-Codes umgeändert
Guter Aritkel!
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:51 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