AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi ....Wo im Code befinde ich mich gerade?.....
Thema durchsuchen
Ansicht
Themen-Optionen

....Wo im Code befinde ich mich gerade?.....

Ein Thema von tommeier · begonnen am 7. Mai 2018 · letzter Beitrag vom 8. Mai 2018
Antwort Antwort
Seite 1 von 2  1 2      
tommeier

Registriert seit: 18. Jul 2015
7 Beiträge
 
#1

....Wo im Code befinde ich mich gerade?.....

  Alt 7. Mai 2018, 10:40
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 )

Hat einer eine Lösung für mich?

Vielen Dank
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 7. Mai 2018, 10:55
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;
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 7. Mai 2018 um 12:15 Uhr) Grund: ExceptAddr durch ReturnAddress ersetzt
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 7. Mai 2018, 11:04
Kommt da bei dir wirklich etwas sinnvolles heraus? Bei mir nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

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

  Alt 7. Mai 2018, 11:34
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 7. Mai 2018, 11:36
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 7. Mai 2018, 11:43
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.
{$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.
$2B or not $2B

Geändert von himitsu ( 7. Mai 2018 um 11:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 7. Mai 2018, 11:53
Starte Dein Programm mit der IDE über den Debugger, da kannst Du es Debuggen (Du siehst wo Du bist)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 7. Mai 2018, 12:16
Kommt da bei dir wirklich etwas sinnvolles heraus? Bei mir nicht.
Oh, richtig, Copy&Paste Syndrom... habe es korrigiert.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 7. Mai 2018, 14:54
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).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 7. Mai 2018, 15:27
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.
$2B or not $2B

Geändert von himitsu ( 7. Mai 2018 um 15:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 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