![]() |
....Wo im Code befinde ich mich gerade?.....
Hallo,
ich suche eine Möglichkeit festzustellen, wo ich im laufendem Programm grade bin. Bei dem Fehlerbericht bei EurekaLog z.b. bekommt man genau gesagt/angezeigt, in welcher Form in der Funktion/Procedure und sogar die Zeilennummer im Code mit angezeigt. Geht das auch ohne einen Fehler zu erzeugen? (Die Zeilennummer, muß jetzt nicht unbedingt sein, schön wäre es aber :lol:) Hat einer eine Lösung für mich? Vielen Dank |
AW: ....Wo im Code befinde ich mich gerade?.....
Du kannst einen Stacktrace z.B. über die
![]()
Delphi-Quellcode:
uses
JclDebug; var StackList: TJclStackInfoList; CurrentStackList: TStringList; begin CurrentStackList := TStringList.Create; try StackList := JclCreateStackList(True, 0, ReturnAddress, False, nil, nil); StackList.AddToStrings(CurrentStackList, True, True, True, True); ShowMessage('Stacktrace:' + sLineBreak + CurrentStackList.Text); finally CurrentStackList.Free; end; end; |
AW: ....Wo im Code befinde ich mich gerade?.....
Kommt da bei dir wirklich etwas sinnvolles heraus? Bei mir nicht.
|
AW: ....Wo im Code befinde ich mich gerade?.....
Zitat:
Und die ist nur (sinnvoll) gefüllt wenn eine Exception auftritt. |
AW: ....Wo im Code befinde ich mich gerade?.....
Zitat:
Im Code selbst ist doch ziemlich offensichtlich, wo du dich gerade befindest, oder? Beschreib doch mal genauer, was du eigentlich vorhast. |
AW: ....Wo im Code befinde ich mich gerade?.....
Jupp, ExceptAddr ist nur während der Exception-Behandlung gesetzt.
ReturnAddress oder war's ReturnAddr gibt es auch seit paar Jahren im Delphi. Also die Zeile nach dem Aufruf der aktuellen Funktion/Methode. Notfalls einfach in einer Sub-Function abfragen. (diese sollte aber eventuell mit Stackframe compiliert worden sein) Die nötigen Debuginfos (inkl. Zeilennummern) müssen in der Anwendung enthalten sein oder daneben liegen. Eurekalog macht das über seinen ecc32.exe und auch beim Jedi mußt du das mit deren Compiler/PostCompiler erledigen. Oftmals wird dazu z.B. die *.MAP-Datei des Compilers/Linkers verwendet, geparst und diese Infos als Ressource in die EXE eingefügt. Leider kennt Delphi sowas wie __LINE__ und __FILE__ nicht, was man so ähnlich aus anderen Sprachen kennt. (z.B. ![]() Das Einzige, wo der Delphi-Compiler diese Informationen in den Code einbaut, ist beim ![]()
Delphi-Quellcode:
{$ASSERTIONS ON} try Assert(False) except on E: Exception do ShowMessage(E.Message) end;
Blöder weise hat ![]() Alternativ in System.AssertErrorProc reinhängen und eine eigene Exception werfen. (siehe SysUtils.AssertErrorHandler) Bzw. aus SysConst.SAssertError kann man sich einen RegEx basteln und auf E.Message anwenden. |
AW: ....Wo im Code befinde ich mich gerade?.....
Starte Dein Programm mit der IDE über den Debugger, da kannst Du es Debuggen (Du siehst wo Du bist)
|
AW: ....Wo im Code befinde ich mich gerade?.....
Zitat:
|
AW: ....Wo im Code befinde ich mich gerade?.....
Zitat:
|
AW: ....Wo im Code befinde ich mich gerade?.....
Bei ReturnAdress muß man nur beachten, dass es eben die Zeile der Befehl danach ist, während ExceptAddr die Fehlerzeile selber ist.
Selbes gilt für alle Adressen im Stacktrace, welche ebenfalls Rücksprungadressen sind. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 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