This is the mail archive of the
archer@sourceware.org
mailing list for the Archer project.
Re: Simple exception use-case
- From: Daniel Jacobowitz <drow at false dot org>
- To: Phil Muldoon <pmuldoon at redhat dot com>
- Cc: Project Archer <archer at sourceware dot org>
- Date: Mon, 28 Jul 2008 09:12:05 -0400
- Subject: Re: Simple exception use-case
- References: <488DC109.3020902@redhat.com>
Some pointers for this topic... I've looked at it several times so I
may be able to give you a head start :-)
On Mon, Jul 28, 2008 at 01:52:25PM +0100, Phil Muldoon wrote:
> <snip useful info>
>
> Raised exceptions may be caught:
> catch throw - all exceptions, when thrown
> catch throw <exceptname> - a particular exception, when thrown
> catch catch - all exceptions, when caught
> catch catch <exceptname> - a particular exception, when caught
I suspect the named versions do not work for C++ (iirc they did for
HP-UX at one time, and/or do for Ada).
> Well I think it is "throw simple", that is the last line shown. But it
> would be neat if the catch would print the actual throw line, like a
> simple breakpoint. Shown below:
Making GDB do this is not too complicated. There is a caveat - the
last time I tried it, it broke Eclipse. Having the debugger stop with
a frame other than the innermost selected is a little tricky but there
may be a better way to do it than I tried; there's more state change
notifications in GDB than there were at the time.
> Catchpoint 1 (exception thrown), 0x000000333d0c3d70 in __cxa_throw ()
> from /usr/lib64/libstdc++.so.6
> (gdb) s
> Single stepping until exit from function __cxa_throw,
> which has no line number information.
> Exception: simple exception occurred
>
> Program exited normally.
>
> Well maybe not. I'm not sure why I lost control of the inferior.
GDB has this problem with both longjmp and longjmp-alikes. Pedro
nearly fixed the longjmp problem but was, in the end, defeated by some
complexities of glibc's pointer mangling; you can find discussion in
this spring's gdb-patches archives. DWARF unwinding uses a
longjmp-alike, GCC's __builtin_eh_return, which has the same problem.
GDB expects when you step over or out of a function that it can
shortcut by placing a breakpoint at the return address. So it has to
be taught about functions with abnormal control flow. Reference:
gcc/unwind-dw2.c:uw_install_context.
> gdb simple
> GNU gdb Fedora (6.8-11.fc9)
>
> (gdb) catch catch
> Function "__cxa_begin_catch" not defined.
> (gdb) catch throw
> Function "__cxa_throw" not defined.
IIRC this is because GDB does not (did not?) use pending breakpoints.
Try again after starting the program, so libstdc++ is loaded. If it's
still broken it's an easy fix.
--
Daniel Jacobowitz
CodeSourcery