分类: C/C++
2011-04-07 11:06:55
You can use catchpoints to cause the debugger to stop for certain kinds of program events, such as C++ exceptions or the loading of a shared library. Use the catch
command to set a catchpoint.
catch event
throw
catch
exec
exec
. This is currently only available for HP-UX.fork
fork
. This is currently only available for HP-UX.vfork
vfork
. This is currently only available for HP-UX.load
load libname
unload
unload libname
tcatch event
Use the info break
command to list the current catchpoints.
There are currently some limitations to C++ exception handling (catch throw
and catch catch
) in GDB:
Sometimes catch
is not the best way to debug exception handling: if you need to know exactly where an exception is raised, it is better to stop before the exception handler is called, since that way you can see the stack before any unwinding takes place. If you set a breakpoint in an exception handler instead, it may not be easy to find out where the exception was raised.
To stop just before an exception handler is called, you need some knowledge of the implementation. In the case of GNU C++, exceptions are raised by calling a library function named __raise_exception
which has the following ANSI C interface:
/* addr is where the exception identifier is stored. id is the exception identifier. */ void __raise_exception (void **addr, void *id); |
To make the debugger catch all exceptions before any stack unwinding takes place, set a breakpoint on __raise_exception
(see section ).
With a conditional breakpoint (see section ) that depends on the value of id, you can stop your program when a specific exception is raised. You can use multiple conditional breakpoints to stop your program when any of a number of exceptions are raised.