Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kann man mit JclDebug an Exceptions in Indy-Threads herankommen? (https://www.delphipraxis.net/176360-kann-man-mit-jcldebug-exceptions-indy-threads-herankommen.html)

Der schöne Günther 30. Aug 2013 13:17

Kann man mit JclDebug an Exceptions in Indy-Threads herankommen?
 
Auch wenn mir die Jedis komischerweise die Möglichkeit, Zeilen mittels STRG+# auszukommentieren, nehmen, habe ich sie nun eingebunden und bin begeistert:

Leite ich meinen Thread nicht von
Delphi-Quellcode:
TThread
sondern von
Delphi-Quellcode:
TJclDebugThread = class(TThread)
ab, habe ich im Fall einer Exception den gesamten Stack Trace in Form einer
Delphi-Quellcode:
TStringList
. :-)

Jetzt werde ich gierig und würde gerne auch an den Stacktrace einer onExecute-Methode eines Indy-Servers (TIdTCPServer) herankommen. Ich kann ja jetzt nicht in die Indy-Sourcen gehen und deren Threads nun alle von
Delphi-Quellcode:
JclDebugThread
ableiten.

Was tue ich? Aufgeben? Kann ich irgendwie über den Threadpool eines Indyservers drübergehen und die Threads alle manuell irgendwie umbiegen? Vielleicht gibt es auch einen ganz anderen Weg ohne Jedis? Die Standard Delphi-Klasse EException gibt mir in ihrer
Delphi-Quellcode:
StackTrace
-Eigenschaft ja immer nur einen leeren String :-(

mjustin 30. Aug 2013 16:42

AW: Kann man mit JclDebug an Exceptions in Indy-Threads herankommen?
 
Kann man JclDebug auch einfach die Exception übergeben um den Stacktrace zu erhalten? Ich mache das in meinem Indy-basierten Web Framework, allerdings mit madExcept.

Man muss nur im OnExecute Handler schreiben:

Delphi-Quellcode:
try

  ... werte Request aus, erzeuge die Response

except

  on E: Exception do

    begin
      Response.ContentText := '<!DOCTYPE html>' + #10
        + '<html>' + #10
        + ' <head>' + #10
        + '   <title>500 Internal Error</title>' + #10
        + ' </head>' + #10
        + ' <body>' + #10
        + '   <h1>' + E.ClassName + '</h1>' + #10
        + '   <h2>Exception message: ' + E.Message + '</h2>' + #10
        + '   <hr />' + #10
        + '   <h2>Stack trace:</h2>' + #10
        + '   <pre>' + #10
        + string(madStackTrace.StackTrace) + #10
        + '   </pre>' + #10
        + ' </body>' + #10
        + '</html>';


      // nicht vergessen!
      raise;
    end;
end;
Die Funktion madStackTrace.StackTrace erzeugt dabei den StackTrace. (Der Code oben ist leicht modifiziert, nicht 100% wie in meinem Framework, nur zur Illustration).

Der schöne Günther 30. Aug 2013 17:01

AW: Kann man mit JclDebug an Exceptions in Indy-Threads herankommen?
 
Ich kenne keine JclDebug-Methode, in welche man eine Exception reinstecken kann. Das muss allerdings nichts heißen, denn entweder bin ich zu dumm, oder es existiert sowieso praktisch Null Dokumentation.

Ich kann zwar in meinem
Delphi-Quellcode:
except
-Block sagen

Delphi-Quellcode:
JclLastExceptStackList().AddToStrings(
   stringList,
   False,
   True,
   True
);

for stringLine in stringList do
   loggeIrgendwohin(stringLine);
aber da kommt nur Quatsch heraus: Ich werfe in meinem Indy onExecute-Thread manuell eine Exception. Da bin ich mir sicher, dass weder MSXML noch TeeChart Pro damit etwas zu tun hat.

Der schöne Günther 9. Sep 2013 19:11

AW: Kann man mit JclDebug an Exceptions in Indy-Threads herankommen?
 
*stößchen*

Der schöne Günther 27. Sep 2016 10:09

AW: Kann man mit JclDebug an Exceptions in Indy-Threads herankommen?
 
Besser spät als nie, für alle nachfolgenden Generationen:

Konkrete Lösung:
Delphi-Quellcode:
JclHookExcept.JclAddExceptNotifier(meineMethode)
.

Anhaltspunkt ganz allgemein ohne Jcl:
Delphi-Quellcode:
System.ExceptProc
lässt sich ersetzen (Zitat "Zeigt auf die Exception-Behandlungsroutine auf der untersten Ebene.")


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 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