2012-05-15 17 views
15

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 :)

+0

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

+0

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

+2

... 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

Antwort

14

Dies folgt aus:

http://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html

können Sie verwenden catchpoints, um den Debugger für bestimmte Arten von Programmereignissen wie C++ - Ausnahmen oder das Laden eines zu stoppen gemeinsame Bibliothek. Verwenden Sie den Fangbefehl, um einen Fangpunkt festzulegen.

Also sollte die Antwort "ja" sein, und es sollte die Probleme mit den zwei Links, die Sie zitiert haben, vermeiden.

Bitte post zurück, wenn es geholfen hat! Ich persönlich habe nie versucht, diese GDB selbst verfügen :)

+2

JA: D Es scheint zu funktionieren. Jetzt kann ich einen Fangpunkt mit 'catch throw' einfügen. Sobald die Ausnahme ausgelöst wird, kann ich 'backtrace' verwenden, um den vollständigen Aufruf-Stack zu erhalten: D: D. Ich danke dir sehr – GradGuy

0

Zusammenfassung der Antworten aus den Kommentaren:

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!

Mit Qt Creator Debugger, wie es scheint, dass diese Frage auf __cxa_begin_catch ist auch ein Äquivalent zu catch catch

Verwandte Themen