![]() |
Schutzverletzung bei Programmende
Hallo,
ich bekommen manchmal Schutzverletzung beim Programmende. Programmausführung aus Delphi XE2. Der Debugger hängt in unit FastMM4, Methode "RemoveMediumFreeBlock" bei Zeile "mov TMediumFreeBlock[edx].NextFreeBlock, ecx". CallStack:
Code:
Danach kann ich in der Methode procedure FinalizeUnits auf die Zeile nach except einen breakpoint setzen.
FastMM4.RemoveMediumFreeBlock(???)
FastMM4.FastFreeMem(???) :00414f89 RemoveMediumFreeBlock + $9 System.FinalizeUnits :004d4bc2 InterceptFinalizeUnits + $5A :766e8654 KERNEL32.BaseThreadInitThunk + 0x24 :77394a47 ; :77394a17 ; Wenn ich weiterlaufen lasse, dann steht der Debugger dort. Dort gibt es ein "InitContext". Die Daten darin sagen mir nicht saußer InitContext.Module.TypeInfo.Unitnames welches ein unitname enthält. An der unit habe ich auch gearbeitet. Die unit enthält kein finalization Abschnitt. Ein finalization habe ich nun hinzugefügt und ein Aufruf einer leeren Methode. Nun tritt der Fehler nicht mehr auf. Trotzdem würde ich gerne wissen was da schief lief. |
AW: Schutzverletzung bei Programmende
Zitat:
Die werden ebenfall in der Unit-Finalization freigegeben. |
AW: Schutzverletzung bei Programmende
Hallo,
Benutzt du Generics? Diese leere Methode verschiebt Dein Problem jetzt nur ein bisschen. Es kann auch wieder auftauschen, wenn z.B. die Unit-Reihenfolge geändert wird. |
AW: Schutzverletzung bei Programmende
Hallo,
Danke für die Antworten. Ja ich fürchte auch, dass das Problem nur verschoben ist. Globale Variablen oder Klassenvariablen verwende ich nicht. Derzeit sind nur drei Methoden drin. Generics dagegen verwende ich und zwar ein Typ der abstammt von IList<> aus Spring.Collections. |
AW: Schutzverletzung bei Programmende
Hallo,
1. nimm mal FastMM4, vielleicht wird irgendwo Speicher überschrieben 2. klammer den ganzen Code aus und nimm ihn dann schrittweise wieder rein, bis der Fehler auftritt. Der 2. Punkt heißt, dass du die leere Methode wieder deaktivierst, um den Fehler wieder zu bekommen. |
AW: Schutzverletzung bei Programmende
Ich hatte ähnliche Fehlermeldungen immer mal wieder in meiner Anfangszeit mit TVirtualTreeView. Damals hatte ich das Konzept der Speicherverwaltung noch nicht ganz verstanden. Es kam immer wieder vor, dass ich dynamisch mit New(PRecord) erzeugte Records doppelt freigeben wollte (einmal mit FreeNode, einmal mit Dispose), was dann zu den eingangs beschriebenen Fehlern führte.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 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