Ich habe gerade mit C++ Ausnahmen begonnen und will es richtig machen. Ich möchte eine Art Backtrace-Information generieren, wenn Ausnahmen abgefangen werden. Anfangs hatte ich ähnliche Ideen wie Call-stack for exceptions in C++, aber letztendlich fand ich heraus, dass das nicht ganz gut ist.Kann gdb verwendet werden, um beim Auftreten von Exceptions zurückzuverfolgen?
Ich habe auch gelesen How to generate a stacktrace when my gcc C++ app crashes, aber möchte nicht mehr Komplexität zu meinem aktuellen Projekt hinzufügen. Da ich im Debug-Modus nur das Backtracing benötige, habe ich gehofft, ich könnte gdb für diesen Zweck verwenden.
Meine Strategie war es, Breakpoint in den catch
Block einzufügen und dann durch den Aufruf-Stack hinaufzugehen, um genau zu bestimmen, warum die Ausnahme an erster Stelle geworfen wurde (oder was sie verursacht hat)? Leider kann ich das anscheinend nicht mehr machen, denn wenn gdb den Breakpoint erreicht, löscht es den Callstack und ich kann nur main sehen (das ist, wo ich fange). Soll das passieren oder mache ich hier etwas falsch?
Edit: Ich mag nur die Methoden, die hier für andere Leute zusammenfassen:
1. Methode (durch paulsm4). Setze einen Fixpunkt über catch throw
zum Fangen auf Wurf oder catch catch
zum Fangen auf Fang! Dann rufen backtrace
2. Methode (durch aschepler) Setzen Sie einen Haltepunkt auf __cxa_throw
und dann backtrace
dritte Methode (in Qt Creator - wenn Sie geschehen, verwenden) Sie einfach einen Haltepunkt auf Wurf oder fangen festlegen können!
Edit_2: Mit Qt Creator Debugger, so scheint es, dass auf __cxa_begin_catch
einen Haltepunkt Einstellung ist auch ein Äquivalent zu catch catch
:)
Versuchen Sie einen Haltepunkt Einstellung der Antworten Check-out: http://stackoverflow.com/questions/2443135/how -do-i-find-wo-eine-ausnahme-wurde-geworfen-in-c – MCKapur
Ein schneller Test für g ++/Linux zeigt, es könnte nützlich sein, einen Haltepunkt bei der internen Funktion '__cxa_throw' zu setzen. – aschepler
... und jetzt, da ich die Antwort von @ paulsm4 gelesen habe, sieht es so aus, als ob der gdb-Befehl 'catch throw' im Wesentlichen das tut. (Wenn ich beides mache, "Pause" und "Fang", bemerkt gdb, dass beide dieselbe PC-Adresse verwenden.) – aschepler