Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ....Wo im Code befinde ich mich gerade?..... (https://www.delphipraxis.net/196277-wo-im-code-befinde-ich-mich-gerade.html)

tommeier 7. Mai 2018 09:40

....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

jaenicke 7. Mai 2018 09:55

AW: ....Wo im Code befinde ich mich gerade?.....
 
Du kannst einen Stacktrace z.B. über die JEDI JCL erzeugen:
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;

Der schöne Günther 7. Mai 2018 10:04

AW: ....Wo im Code befinde ich mich gerade?.....
 
Kommt da bei dir wirklich etwas sinnvolles heraus? Bei mir nicht.

Neutral General 7. Mai 2018 10:34

AW: ....Wo im Code befinde ich mich gerade?.....
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1401488)
Kommt da bei dir wirklich etwas sinnvolles heraus? Bei mir nicht.

Ich glaube der Code funktioniert nur in einem except, da die globale Variable ExceptAddr benutzt wird.
Und die ist nur (sinnvoll) gefüllt wenn eine Exception auftritt.

Uwe Raabe 7. Mai 2018 10:36

AW: ....Wo im Code befinde ich mich gerade?.....
 
Zitat:

Zitat von tommeier (Beitrag 1401486)
ich suche eine Möglichkeit festzustellen, wo ich im laufendem Programm grade bin.

An welcher Stelle bzw. zu welchem Zeitpunkt willst du das denn wissen?

Im Code selbst ist doch ziemlich offensichtlich, wo du dich gerade befindest, oder? Beschreib doch mal genauer, was du eigentlich vorhast.

himitsu 7. Mai 2018 10:43

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. PHP)

Das Einzige, wo der Delphi-Compiler diese Informationen in den Code einbaut, ist beim Delphi-Referenz durchsuchenAssert.
Delphi-Quellcode:
{$ASSERTIONS ON} try Assert(False) except on E: Exception do ShowMessage(E.Message) end;

Blöder weise hat Delphi-Referenz durchsuchenEAssertionFailed dieses ausschließlich im Text und nicht als eigenständige Property.
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.

KodeZwerg 7. Mai 2018 10:53

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)

jaenicke 7. Mai 2018 11:16

AW: ....Wo im Code befinde ich mich gerade?.....
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1401488)
Kommt da bei dir wirklich etwas sinnvolles heraus? Bei mir nicht.

Oh, richtig, Copy&Paste Syndrom... habe es korrigiert.

TiGü 7. Mai 2018 13:54

AW: ....Wo im Code befinde ich mich gerade?.....
 
Zitat:

Zitat von jaenicke (Beitrag 1401487)
Du kannst einen Stacktrace z.B. über die JEDI JCL erzeugen:
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;

Funktioniert ganz hervorragend in der Debug-Version. Für die Release-Version muss der Entwickler aber Project Options -> Delphi Compiler -> Linking -> Debug Information anhaken (oder entsprechende Option im Quelltext, wenn es eine gibt).

himitsu 7. Mai 2018 14:27

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.

p80286 7. Mai 2018 18:14

AW: ....Wo im Code befinde ich mich gerade?.....
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1401492)
Im Code selbst ist doch ziemlich offensichtlich, wo du dich gerade befindest, oder? Beschreib doch mal genauer, was du eigentlich vorhast.

Zitat:

Zitat von KodeZwerg (Beitrag 1401500)
Starte Dein Programm mit der IDE über den Debugger, da kannst Du es Debuggen (Du siehst wo Du bist)

Dem ist erst einmal wenig hinzu zu fügen.
Also was hast Du vor?

Gruß
K-H

tommeier 8. Mai 2018 10:19

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. :!::?:

Uwe Raabe 8. Mai 2018 10:54

AW: ....Wo im Code befinde ich mich gerade?.....
 
Zitat:

Zitat von tommeier (Beitrag 1401670)
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.

Da würde ich dir CodeSite empfehlen. Damit kannst du an allen gewünschten Stellen entsprechende Log-Calls einbauen. Du kannst das dann sowohl Live verfolgen als auch als Log-File abspeichern.

KodeZwerg 8. Mai 2018 11:59

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.

himitsu 8. Mai 2018 13:08

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 http://docwiki.embarcadero.com/RADSt...inierte_Makros
und FreePascal hat auch was parat https://www.freepascal.org/docs-html...47-460001.1.41 ,
aber Delphi leider nach Jahrzehnten immernoch nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz