[Debug] Exception fangen



  • Hi Leute

    an einer Stelle wirft meine Software eine Exception. Da ich unter Linux mit Eclipse + gcc arbeite, bekomm ich keinen Hinweis auf die Ort der Exception.

    Daher wollte ich mal mit try catch Blöcken nach und nach den Ort der Exception eingrenzen.

    Testweise hab ich mal so angefangen und künstlich eine Exception erzeugt:

    try { int j = 10 / 0; }
    catch ( exception &e ) { cout << "Error" << endl; }
    

    Das sollte ja eigentlich die Exception fangen und die Textausgabe vornehmen.
    Leider wird die Exception in dem Fall nicht gefangen.Warum?

    Habe es auch mit "catch( ... )" versucht. Funzt auch nicht. Wie kann ich denn Exceptions jedes Typs fangen? ( Ich weiß nämlich nicht, welcher Art meine Exception ist 🙂 ).



  • Eine Division durch 0 wirft keine std::exception.

    Unter Windos gibt das eine SEH (Structured Exception Handling) Exception.
    Unter Linux weiss ich es nicht, kann mir aber vorstellen, dass ein SIGXX kommt.

    Simon



  • Ich würde solche Fehler vorher abfragen und gegebenenfalls durch eigene Exceptions melden. Oder besser schauen, dass sie gar nicht erst vorkommen (wenn möglich). Denn es gibt keinen standardkonformen Weg, solche Fehler abzufangen.



  • Ok, sollte ja auch nur ein Test sein. Dennoch weiß ich nicht, wie ich am besten an solche unbekannten Exceptions rangehe.

    Ich weiß zwar in welcher Funktion es raucht, aber das ist immernoch ne Menge Code.
    Außerdem handelt es sich hier um eine Software die Multithreaded arbeitet. CURL ist auch noch mit im Spiel...

    Daher wollte ich auch erstmal alles abfangen was irgendwie geht und das dann nach und nach eingrenzen.



  • Kannst du die Fehler nicht bereits so eingrenzen? Du siehst ja, wo das Programm abstürzt...

    Denn einfach alles mit try -Blöcken zu umschliessen ist auch nicht gerade das Wahre. Da ist ein Absturz oft sogar besser als ein bewusstes Ignorieren.



  • Nee, die try catch blöcke sollen ja dann auch wieder raus, wenn ich die Ursache gefunden habe.


  • Administrator

    Wenn du mit Eclipse und gcc auf Linux arbeitest, dann verwende doch den gdb. Das ist der GNU Debugger. Es gibt auch Plugins für Eclipse, damit du ein GUI hast.

    Aber grundsätzlich auf Kommandozeileneben ist es ganz einfach:

    Du kompilierst den Code mit Debuginformationen (-g ist wichtig):
    g++ -g -o program program.cpp
    
    Nun führst du den gdb aus:
    gdb program
    Blablabla Copyright
    
    (gdb) catch throw
    Catchpoint 1 (throw)
    (gdb) run
    Blablabla Programm läuft
    
    ...
    
    Catchpoint 1 (exception thrown)
    0x004034fc in __cxa_throw ()
    (gdb) where
    ... Standortangabe ...
    

    Im Internet gibt es viele Tutorials 😉

    Grüssli



  • Cool, das klingt gut 🙂

    Ist vielleicht nicht der Debug-Luxus von CBuilder und MSVC, aber besser als nix 😉

    Habe mal die Executable gestartet und die hat mir zumindest einen weiteren Hinweis gegeben: "Segmentation fault" 😃



  • Scheinbar liegt das Problem bei der CURL.

    Ich habe mehrere Datapools. Jeder davon hat einen eigenen Thread und ein eigenes CURL-objekt.Ich war eigentlich der Meinung gelesen zu haben, dass CURL threadsafe ist...

    Daher bin ich jetzt ein wenig verwundert. 🙄


Anmelden zum Antworten