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
Assert.
{$ASSERTIONS ON} try Assert(False) except on E: Exception do ShowMessage(E.Message) end;
Blöder weise hat
EAssertionFailed 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.