Nicht behandelte Exception loggen



  • Hallo zusammen,

    ich suche einen Code-Snippet, wo ich eine unbehandelte Exception
    auswerten und in eine Textdatei loggen kann.

    Mit der Komponente "ApplicationEvents" kann ich ja nicht behandelte Exceptions abfangen und auswerten.

    Event:
    void __fastcall TApp::ApplicationEvents1Exception(TObject *Sender, Exception *E)

    Die Klasse Exception hat verschiedene Methoden:
    E->ToString()
    E->Message()
    E->StackTrace()
    E->UnitName()
    E->ClassName()

    Der String StackTrace() ist aber immer leer.

    Ich brauche noch die Möglichkeit, den Stacktrace auszulesen und die Fehleradresse.

    Kann jemand helfen?

    Vielen Dank.



  • Mit der JCL, speziell JclDebug und JclHookExcept, ist das gut machbar. Ich kann mal sehen, ob ich ein einfaches Beispiel finde.

    Daß Exception::StackTrace leer ist, liegt daran, daß du keinen Stacktracer installiert hast. Ein solcher kann sich in SysUtils.pas registrieren und wird dann zu gegebener Zeit von der RTL aufgerufen. Die RTL hat nicht selbst die Fähigkeit, Stacktraces zu produzieren - die Infrastruktur dafür existiert aber.



  • Mit der aktuellen JCL-Revision sollte es sehr leicht sein.

    1. Lade die aktuelle Revision der JCL herunter ( svn co https://jcl.svn.sourceforge.net/svnroot/jcl/trunk/jcl . ). Wenn du RAD Studio XE hast, kannst du das auch über "Datei|Aus der Versionskontrolle öffnen..." machen.

    2. Installiere die JCL (Doppelklick auf install.bat) und stelle sicher, daß der Eintrag "JEDI Code Library|Packages|IDE experts|Exception dialog expert" ausgewählt ist.

    3. Öffne dein Projekt. Wähle "Datei|Neu|C++Builder-Projekte|C++Builder-Dateien|JCL Exception dialog for C++Builder".

    4. Wichtig: deaktiviere "Delayed stack frames" auf der dritten Seite des Wizards. Die restlichen Einstellungen wähle nach Bedarf.

    5. Aktiviere die JDBG-Generation für dein Projekt: wähle "Projekt|JCL Debug Expert|Generate .jdbg files|Enabled for this project" und "Projekt|JCL Debug Expert|Insert JDBG data into the binary|Enabled for this project" (alternativ: jeweils "Always enabled" wählen).

    6. Wenn du auch anstelle von "External Exception EEFFACE" eine schöne Meldung für unbehandelte C++-Exceptions willst, kannst du deine Projekt-Quelldatei folgendermaßen modifizieren:

    // MyProject.cpp
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include <tchar.h>
    
    + #include <JclHookExcept.hpp>
    + #include <JclCppException.hpp>
    
    //---------------------------------------------------------------------------
    USEFORM("MainUnit.cpp", FrmMain);
    USEFORMNS("ExceptionDialogUnit.pas", Exceptiondialogunit, ExceptionDialog);
    ...
    //---------------------------------------------------------------------------
    WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
    {
        try
        {
    +        JclHookExceptions ();
    +        JclInstallCppExceptionFilter ();
    
             Application->Initialize();
             Application->MainFormOnTaskBar = true;
             ...
    

    Was genau da passiert, hatte ich einstmals hier beschrieben. Mittlerweile ist SystemCppException.pas unter dem Namen JclCppException.pas Bestandteil der JCL.

    7. Es kann sein, daß die Funktion, die die Exception geworfen hat, in deinen Stacktraces nicht auftaucht, daß also die oberste Funktion im Stacktrace fehlt. Das kannst du umgehen, indem du folgende Datei zu deinem Projekt hinzufügst:
    http://mb.audacia-software.de/pfiles/snippets/CppExceptionLDTCHook.cpp


Anmelden zum Antworten