Sie können versuchen, eine „Catchpoint“ (catch throw
) mit dem Debugger an dem Punkt zu stoppen, wo die Ausnahme erzeugt wird.
Die folgenden excerpt Aus dem Gdb-Handbuch beschreibt die Catchpoint-Funktion.
5.1.3 Einstellung Schutzweiche
Sie Schutzweiche verwenden können, um zu bewirken, das Debugger für bestimmte Arten von Programmereignissen zu stoppen, wie C++ Ausnahmen oder das Laden einer gemeinsam genutzten Bibliothek. Verwenden Sie den Fangbefehl, um einen Fangpunkt festzulegen.
Fang Ereignis
Stop, wenn Ereignis auftritt. Ereignis kann eine der folgenden sein:
tcatch Ereignis
ein Catchpoint Set, das für nur eine Station aktiviert ist. Der Catchpoint wird automatisch nach dem ersten Auffinden des Ereignisses gelöscht.
Verwenden Sie den Befehl info break
die aktuellen Schutzweiche aufzulisten.
Es liegen noch einige Einschränkungen C++ Ausnahmebehandlung (catch throw und Beifang) in GDB:
* If you call a function interactively, GDB normally returns control to you when the function has finished executing. If the call raises an exception, however, the call may bypass the mechanism that returns control to you and cause your program either to abort or to simply continue running until it hits a breakpoint, catches a signal that GDB is listening for, or exits. This is the case even if you set a catchpoint for the exception; catchpoints on exceptions are disabled within interactive calls.
* You cannot raise an exception interactively.
* You cannot install an exception handler interactively.
Manchmal fangen ist nicht der beste Weg, die Handhabung zu Debug-Ausnahme: Wenn Sie genau wissen müssen, wo ein Wenn die Exception ausgelöst wird, ist es besser anzuhalten, bevor der Exception-Handler aufgerufen wird, da Sie auf diese Weise den Stack sehen können, bevor ein Unwinding stattfindet. Wenn Sie stattdessen einen Haltepunkt in einem Ausnahmebehandler festlegen, ist es möglicherweise nicht einfach herauszufinden, wo die Ausnahme ausgelöst wurde.
Um kurz vor dem Aufruf eines Exception-Handlers zu stoppen, benötigen Sie Kenntnisse über die Implementierung. Im Falle der GNU C++, sind Ausnahmen durch den Aufruf einer Bibliotheksfunktion namens __raise_exception angehoben, die die folgenden ANSI-C-Schnittstelle:
/* addr is where the exception identifier is stored.
id is the exception identifier. */
void __raise_exception (void **addr, void *id);
Um den Debugger fangen alle Ausnahmen zu machen, bevor ein Stapel Abwickeln stattfindet, einen Haltepunkt setzen auf __raise_exception (siehe Abschnitt Breakpoints; Watchpoints und Ausnahmen).
Mit einem bedingten Breakpoint (siehe Abschnitt Break-Bedingungen), der vom Wert von id abhängt, können Sie Ihr Programm stoppen, wenn eine bestimmte Ausnahme ausgelöst wird. Sie können mehrere bedingte Haltepunkte verwenden, um Ihr Programm zu stoppen, wenn eine Anzahl von Ausnahmen ausgelöst wird.
Welches Signal meldet die GDB, wenn sie pausiert? Sie sollten in der Lage sein, einen Befehl wie 'handle SIGUSR1 pass noprint nostop' – Hasturkun