Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr.
Seite 1 von 2  1 2      

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