![]() |
....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. |
AW: ....Wo im Code befinde ich mich gerade?.....
Zitat:
Zitat:
Also was hast Du vor? Gruß K-H |
AW: ....Wo im Code befinde ich mich gerade?.....
Also,
ich will so eine Art LogFile bauen. Damit ich sehen kann, wo das Programm ist/war wenn ein Fehler oder eine Endlosschleife (Programm macht nicht mehr) beim Kunden läuft. In der Entwicklungsumgebung ist ja fast immer alles OK und läuft super. Beim Kunden sieht das schon ganz anders aus. Und echte Daten bekommt man vom Kunden (verständlicherweise) nicht. Im Log File kann ich so sehen, wo man suchen muß. Ich hoffe es ist verständlich. :!::?: |
AW: ....Wo im Code befinde ich mich gerade?.....
Zitat:
![]() |
AW: ....Wo im Code befinde ich mich gerade?.....
Als ich mit so etwas Anfing hab ich es mir simpel, aber falsch gemacht.
Im Form.Create() Event eine Globale variable TStringList initialisieren. Vor jedem Codeblock eine Zeile mit Infos in die TStringList, nach jedem Codeblock eine Zeile mit Infos in die TStringList, bei bedarf Inhalt in eine Memobox oder direkt in Datei speichern. Kann bei Programmabstürzen sehr fehlerbehaftet sein um es als Datei-Log zu verwenden. Mittlerweile bin ich auf eine andere Methode umgesattelt auf die mich EWeiss gebracht hat, Danke nochmal dafür :thumb: Ich erstelle nach wie vor meine Log-Strings, nur diesmal einzeln und nicht mehr als TStringList, ein zweites Programm wartet im Hintergrund auf bestimmte Message Ereignisse und protokolliert so alles, bei Haupt-Programm Absturz bleiben die Infos erhalten und gespeichert wird nach einer von mir festgelegten Zeilennummer bzw bei regulärem Haupt-Programm beenden. Falls Dich so etwas interessieren sollte lege ich Dir ans Herz ein paar Chat-Programme oder Client/Server Beispiele Dir anzuschauen, da wird Dir gezeigt wie man Strings von Programm A nach Programm B bekommt, in Echtzeit. |
AW: ....Wo im Code befinde ich mich gerade?.....
Ich hatte mir mal überlegt die Technik ala AQTime zu nutzen, also bei Bedarf sich ins Programm hocken (ginge auch innerhalb des eigenen Programms)
und darüber die Prozedur-Eintritts- und Austrittspunkte je Thread ins Log schreiben. Leider hat Delphi ja keinen Precompiler/Preprocessor, wo man sich reinhängen könnte, um dort den LogCode direkt einzufügen, vor dem Compilieren. Jemand hatte da zwar mal was gebastelt, aber das funktionierte nur in alten Delphis bis 7. (wenn ich mich richtig erinner) Der C++Builder kennt das zwar ![]() und FreePascal hat auch was parat ![]() aber Delphi leider nach Jahrzehnten immernoch nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 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