![]() |
XE7 Debugger hält bei Exception eine Funktion darüber an.
Hallo Community,
ich habe folgendes Problem: Wenn eine Exception geworfen wird und ich auf "Anhalten" klicke, lande ich mit dem Debugger in der Zeile, in der die Funktion aufgerufen wird, die die Exception auslöst, nicht aber in der Funktion selbst. Angenommen ich implementiere 2 Funktionen A() und B(). A() ruft in einer Zeile B() auf. B() greift in irgendeiner Zeile beispielsweise auf einen ungültigen Array-Index zu. Dann erhalte ich die Exception "Ungültiger Listenindex ..." (oder ähnlich). Klicke ich dann auf "Anhalten", stehe ich in Funktion A(), und zwar dort, wo B() aufgerufen wird. Es gibt dann leider keine Möglichkeit, herauszufinden, wo genau in Funktion B() die Exception ausgelöst wird. Ich kann das Programm abbrechen, einen Breakpoint zu Beginn von B() setzen, und dann Schritt für Schritt bis zur Exception debuggen. Das ist auf Dauer lästig, vor allem wenn die Exception nicht bei jedem Funktionsaufruf von B() ausgelöst wird. Ich habe den Verdacht, dass der Compiler bestimmte Funktionen automatisch "inlinen" tut aus Optimierungsgründen, also aus A() und B() eine Funktion macht. Merkwürdig ist aber, dass dieses Verhalten ausnahmslos immer auftritt. Bei jeder Exception, bei der ich anhalte, lande ich grundsätzlich nur in der aufrufenden Funktion. Wenn das tatsächlich eine Optimierung ist, kann ich das dann irgendwo abschalten? Für jegliche Hilfe bin ich sehr dankbar! Gruß, Sankt Rochus |
AW: XE7 Debugger hält bei Exception eine Funktion darüber an.
Wie wär's mit einem Breakpoint in der Funktion, in der der Fehler auftritt? Dann stepst du soweit durch, bis der Fehler kommt, und schon hast du ihn am Wickel :-D
|
AW: XE7 Debugger hält bei Exception eine Funktion darüber an.
Der Aufrufstack beinhaltet die Funktion B auch nicht?
|
AW: XE7 Debugger hält bei Exception eine Funktion darüber an.
Zitat:
Delphi-Quellcode:
procedure B;
var I: Extended; begin if true then begin I := 1; I := 1/(I-1); end; end; procedure A; begin B; end; |
AW: XE7 Debugger hält bei Exception eine Funktion darüber an.
Danke schon einmal für eure Hilfsbemühungen!
Zitat:
Zitat:
:7654c42d KERNELBASE.RaiseException + 0x58 :00426dca ConvertErrorFmt + $1E uSTDExport.TSTDExport.exportKData(... Verschiedene Parameter ...) ... Anhalten tut der Debugger in exportKData(...), die eigentliche Exception wurde aber von einer fehlerhaften Konvertierung in einer Funktion ausgelöst, die von exportKData(...) aufgerufen wird. Der Name dieser Funktion taucht im Aufrufstack nicht auf. Zitat:
|
AW: XE7 Debugger hält bei Exception eine Funktion darüber an.
Zitat:
|
AW: XE7 Debugger hält bei Exception eine Funktion darüber an.
Zitat:
|
AW: XE7 Debugger hält bei Exception eine Funktion darüber an.
Zitat:
|
AW: XE7 Debugger hält bei Exception eine Funktion darüber an.
Zitat:
Die Funktion exportMedikament(...) ruft TSTDUtils.LittleEndianDateStringToDate(aValue: string): TDateTime auf. Letztgenannte Funktion soll einen speziellen Datumsstring parsen, schlägt aber fehl, da der String dem Datumsformat nicht entspricht. Da die Funtkion exportMedikament(...) sehr umfassend ist, möchte ich nur den Ausschnitt hier zeigen: Hier die aufrufende Funktion:
Delphi-Quellcode:
Und hier die Funktion, in der die Exception kommt, in einer anderen Unit, wohlbemerkt:
if m_LicenseManager.License.IsLicensed('Patientendaten/Patient/Medikamente/Medikament/Absetzdatum') then
begin if ((i = 10) and not l_Zusatz.IsEmpty) then l_Medikament.Absetzdatum := TSTDUtils.LittleEndianDateStringToDate(l_Zusatz); // Hier wird die Funktion aufgerufen und genau hier hält der Debugger end;
Delphi-Quellcode:
Die Exception lautet:
class function TSTDUtils.LittleEndianDateStringToDate(aValue: string): TDateTime;
var l_CirculatedDateTime: string; begin l_CirculatedDateTime := Copy(aValue, 7, 2) + FormatSettings.DateSeparator + Copy(aValue, 5, 2) + FormatSettings.DateSeparator + Copy(aValue, 1, 4); if (Copy(l_CirculatedDateTime, 1, 5) = '00.00') then l_CirculatedDateTime := '01.01.' + Copy(l_CirculatedDateTime, 7, 4); result := StrToDate(l_CirculatedDateTime); // Hier tritt vermutlich die Exception auf end; ".04.2014" ist kein gültiges Datum. Und hier nochmals der Aufrufstack: :7654c42d KERNELBASE.RaiseException + 0x58 :00426dca ConvertErrorFmt + $1E uSTDExport.TSTDExport.exportMedikament(...) ... |
AW: XE7 Debugger hält bei Exception eine Funktion darüber an.
Schalt mal die Debug-DCUs ein.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:03 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