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 Exception in Destroy (https://www.delphipraxis.net/106659-exception-destroy.html)

Gruber_Hans_12345 14. Jan 2008 18:12


Exception in Destroy
 
Hallo

Ich bin beim Umstieg von Delphi 6 auf Delphi 2007, und habe nun noch ein Problem. Und zwar, wird beim zumachen der Anwendung (im speziellen im Destroy Event des Hauptformulares) eine Exception ausgelöst.
Diese ist jedesmal etwas anderes, manchmal kommt einfach ein Fehler mit nur Adresse (anscheinend irgendwo im VMT FreeObject, manchmal, im DestroyComponents)

Ich vermute, das da einfach nur noch irgendwo eine Componente herumschwiert, die noch in der Liste des Forms ist, aber schon mal freigegeben wurde.

Ich habe auch den FastMM4 drauf, aber der meldet leider meist keinen Fehler bzw keinen sinnvollen log eintrag

Wie komme ich so einen Bug am besten auf die Schliche? In dem Form werden leider viele Komponenten zur Laufzeit erzeugt, teilweise aus einer Scriptsprache heruas ....

ich habe schon probiert vor dem Destroy.inherited alle Components[ComponentCount] zu prüfen (einfach ein zugriff auf Name bzw ClassName) um zu sehen, ob da schon eine Componente "kaputt" ist, aber da funktioniert noch alles ...

mkinzler 14. Jan 2008 18:15

Re: Exception in Destroy
 
Wie sieht dein Code aus? Wird irgendwas dynamisch erzeugt?

Gruber_Hans_12345 14. Jan 2008 18:25

Re: Exception in Destroy
 
Zitat:

Zitat von mkinzler
Wie sieht dein Code aus? Wird irgendwas dynamisch erzeugt?

ja, haufenweise

da werden sicher zig hundert componenten an ganz unterscheidlichen stellen neu erzeugt

ich bin mir auch sehr sicher, das es sich "nur" um eine componente handelt, die als Owner das Form hat, und von mir manuelle freigegben wurde/wird.
nur das problem ist, wie finde ich das?

Im D6 hatte ich unter anderen den memcheck drauf, der hat mir sowas immer angezeigt. (Hat auch mitgespeichert, wo das Objekt, das ich versuche ein zweites mal freizugeben, erzeugt wurde)

unter D2007 funkt das ja leider nicht mehr, und das FastMM4 zeigt mir nicht wirklich was an.

mkinzler 14. Jan 2008 18:29

Re: Exception in Destroy
 
Zitat:

ich bin mir auch sehr sicher, das es sich "nur" um eine componente handelt, die als Owner das Form hat, und von mir manuelle freigegben wurde/wird.
Und wie gibst du diese dann frei? FreeAndNil()?

Gruber_Hans_12345 14. Jan 2008 18:33

Re: Exception in Destroy
 
Zitat:

Zitat von mkinzler
Zitat:

ich bin mir auch sehr sicher, das es sich "nur" um eine componente handelt, die als Owner das Form hat, und von mir manuelle freigegben wurde/wird.
Und wie gibst du diese dann frei? FreeAndNil()?

das weiss ich leider nicht genau, kann beides sein, da ich nicht genau weiss, welche komponente das ist die da probleme macht.

normalerweise verwende ich ein FreeAndNil, wo ich zugriff auf die variable habe, und ein Free, wenn ich nur ein property habe ...

sirius 14. Jan 2008 18:34

Re: Exception in Destroy
 
Zitat:

Zitat von Gruber_Hans_12345
ich bin mir auch sehr sicher, das es sich "nur" um eine componente handelt, die als Owner das Form hat, und von mir manuelle freigegben wurde/wird.

Die meldet sich im Destructor ordnungsgemäß vom Owner ab.

Gruber_Hans_12345 14. Jan 2008 18:39

Re: Exception in Destroy
 
Zitat:

Zitat von sirius
Zitat:

Zitat von Gruber_Hans_12345
ich bin mir auch sehr sicher, das es sich "nur" um eine componente handelt, die als Owner das Form hat, und von mir manuelle freigegben wurde/wird.

Die meldet sich im Destructor ordnungsgemäß vom Owner ab.

ja, das weiss ich, und weiss auch, das es ein Bug von meiner Seite ist, nur muß es doch auch unter Delphi2007 irgendwie eine Möglichkeit geben, diesem Bug auf die Schliche zu kommen?

mkinzler 14. Jan 2008 18:44

Re: Exception in Destroy
 
Schau dir das Ganze doch im Debugger Schritt für Schritt an.

Gruber_Hans_12345 14. Jan 2008 19:04

Re: Exception in Destroy
 
Zitat:

Zitat von mkinzler
Schau dir das Ganze doch im Debugger Schritt für Schritt an.

Also, zur Not muß ich es eh so machen, nur möchte ich es eigetnlich vermeiden

Da das ganze im TCustomForm.Destroy bzw im TWinControl.Destroy auftritt

und dieses Form hat einige hundert Komponenten, die da freigegeben werden, und wenn ich da schritt für schritt durchgehen muß :(

mkinzler 14. Jan 2008 19:05

Re: Exception in Destroy
 
Dann setzte doch den Breakpoint dort.

Gruber_Hans_12345 14. Jan 2008 19:14

Re: Exception in Destroy
 
Zitat:

Zitat von mkinzler
Dann setzte doch den Breakpoint dort.

und wo?

ich weiss ja nicht, bei welchen Free der Fehler auftritt, wenn ich das wüsste, wäre der Bug schon geschichte

der fehler tritt irgendwo innerhalb von TForm.Destroy auf, und dort werden hunderte komponenten rekursiv freigegeben, eben wie die als Controls im Formular und deren Childkontrols erzeugt worden sind.

Daher wüßte ich nicht, wo ich einen Breakpoint setzen sollte ...

mkinzler 14. Jan 2008 19:16

Re: Exception in Destroy
 
und wo? TForm.Destroy oder schau mal, wo du manuell freigibst

Gruber_Hans_12345 14. Jan 2008 19:29

Re: Exception in Destroy
 
Zitat:

Zitat von mkinzler
und wo? TForm.Destroy oder schau mal, wo du manuell freigibst

ja, im TForm.Destroy ist der Fehler, da wird irgendwo eine Komponente von mir freigegeben, die einen Fehler hat.
und diese Komponente suche ich nun ...

da werden leider zig verschiedene komponenten verwendet in diesem form, und jede ist der potentielle bug verursacher.

und meine frage ist nun, gibt es unter D2007 so etwas ähnliches wie memcheck, das mir alle erzeugten Objekte merkt, und bei einem erneuten versuch diese freizugeben einen logeintrag erzeugt, mit dem Callstack wie dieses Objekt ERZEUGT wurde

mkinzler 14. Jan 2008 19:38

Re: Exception in Destroy
 
madExcept. Aber du kannst ja an der Stelle, wo der Fehler auftritt einen Breakpoint setzten und sehen welches Objekt es ist. Oder halt im Code suchen, welche Objekte du manuell freigibst.

Andy090778 14. Jan 2008 19:50

Re: Exception in Destroy
 
omg, kann ja wohl nicht so schwer sein, eine paar haltepunkte sinnvoll zu setzen.

Sei froh, dass Du keine µ-Prozessoren einer Hardware programmierst. Da geht das mit dem Debuggen nämlich nicht so einfach...

Gruber_Hans_12345 15. Jan 2008 12:10

Re: Exception in Destroy
 
Zitat:

Zitat von mkinzler
madExcept. Aber du kannst ja an der Stelle, wo der Fehler auftritt einen Breakpoint setzten und sehen welches Objekt es ist. Oder halt im Code suchen, welche Objekte du manuell freigibst.

Ja, wenn es so einfach wäre, ich sehe leider nicht, wo die Exception auftritt ...

bekomme nur eine Exception "Ungültige Zeigeroperation"
nach dem Anhalten ist der Cursor nicht in einer Code zeile, und der Stack zeigt an :

kernel32.RaiseException
HookedRaiseException
TObject.FreeInstance
TObject.Free
TComponent.DestroyComponents


und das wars

und wenn ich einen Breakpoint in die FreeInstance stekce, dann muß ich mal so 1000 mal auf F8 klicken, da es sich hier um ein Projekt handelt, und da sich der Fehler auch in eine der ca 1500 units verstecken kann sehe ich es mit dem Breakpoint etwas ungünstig.

und wenn ich nach der Exception mit F7 weitergehe, dann bin ich sofort im TCustomForm.Destroy

werde mir mal wieder das madExecept angucken (ob es diesen Fehler abfangen kann ...)

Zitat:

Zitat von Andy090778
omg, kann ja wohl nicht so schwer sein, eine paar haltepunkte sinnvoll zu setzen.

Sei froh, dass Du keine µ-Prozessoren einer Hardware programmierst. Da geht das mit dem Debuggen nämlich nicht so einfach...

Tja, auch wenn es dich wundern wird, ich programmiere sogar auf 3 verschiedenen µControllern, nur habe ich dort keine 2 Millionen Zeilen Sourcecode, aber auch bei den µControllern ist das Debuggen möglich, wenn man es kann ;)

sirius 15. Jan 2008 12:14

Re: Exception in Destroy
 
Oder du änderst/überschreibst/hookst die FreeInstance und zählst einen Zähler in einer Datei hoch. Dann kannst du einen Breakpoint mit Zähler einsetzen. vielleicht hilft das.

Gruber_Hans_12345 22. Jan 2008 08:40

Re: Exception in Destroy
 
so, nach zwei tagen suchzeit, habe ich nun meinen Fehler gefunden ...

Ich habe mir mal ein neues Objekt von einem TCanvas abgeleitet, das mir mehr funktionen zur Verfügung stellt.
und damit ich die nutzen kann habe ich überall

Delphi-Quellcode:
TmyCanvas(Canvas).TextOutAngle ...
das ging alles ohne probleme, nur kam dann irgendwann auch ein ClipRect dazu, das sich das alte HRGN in einer variable merkt.
und da der systemeigene erzeugete Canvas natürlich zuwenig platz dafür hat, hat das
Delphi-Quellcode:
TmyCanvas(Canvas).OldRgn := ....
zu großen problemen geführt.

Komischerweise aber nur mit D2007, unter D6 lief bzw läuft das alles noch immer ohne Probleme ... warum auch immer



Gibt es eigentlich irgendeine Möglichkeit, irgendein Tool, irgendetwas, um soetwas zu finden?
Ich habe hier Stunden um Stunden verbracht, um diesen sehr dummen Fehler zu finden, habe auch Tools wie madExcept und AQTime und co probiert, aber die zeigen entweder gar nichts an, oder den Fehler halt dann irgendwo an der falschen Stelle ...

ralfschwalbe 22. Jan 2008 08:48

Re: Exception in Destroy
 
Hallo,

ich habe zwar in meinen Projekten "nur" ca. 600.000 Zeilen Code, aber ich bin von der Leistung von Eurekalog schwer begeistert!

Ich habe damit schon Fehler an fast unmöglichen Stellen (z.B.: im eigenen OLEDB-Provider) gefunden.

Einfach mal ausprobieren...

Gruber_Hans_12345 22. Jan 2008 09:12

Re: Exception in Destroy
 
das problem ist halt nur, das es einfach zu spät ist, wenn die Exception auftritt, da kann halt niemand mehr sagen, wo der Fehler auftrat, da es eigentlich beim überschreiben des Speicherblockes (durch das falsche typecasten des Objektes) auftritt.
Und der nebeneffekt ist das dann das freigeben, von ganz anderen Objekten Fehler wirft.

ralfschwalbe 22. Jan 2008 09:24

Re: Exception in Destroy
 
In diesem Fall wird kein Tool etwas sinnvolles liefern, da hast Du völlig recht!

Aber gut ist es trotzdem... :zwinker:


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