[RFC] Unexpected automatic language switch - get_frame_language()
Daniel Jacobowitz
drow@mvista.com
Wed Dec 10 18:20:00 GMT 2003
On Wed, Dec 10, 2003 at 01:10:30PM -0500, Joel Brobecker wrote:
> Before I start the discussion and maybe cause us to change our
> implementation, what is the feeling of the GDB maintainers in
> general. Suppose for instance that we would submit our current
> implementation for inclusion, would it be approved, or refused?
> Right now, here is our change against breakpoint.c relevant to this
> functionality:
>
> - At the begining of break_command_1, we do:
>
> +
> + /* Ada introduces some language-specific breakpoint syntax. Translate
> + to equivalent vanilla breakpoints. */
> + addr_start = arg = ada_breakpoint_rewrite (arg, &break_on_exception);
> +
>
> - There is also the special handling of this breakpoint. When such
> a breakpoint is hit, we print the exception name in the breakpoint
> message. Something like this:
>
> Breakpoint 1, CONSTRAINT_ERROR at file:line.
>
> So we added the following call in print_one_breakpoint() to
> that effect:
>
> + ada_print_exception_breakpoint_task (b);
> +
You may want to look in the archives for the breakpoint_ops and catch
exception patches I posted earlier this year; they're broader but do
essentially the same thing.
Personally I don't like this "language dependent breakpoint syntax"
idea. Here's one reason why: judging from your implementation I bet
that a breakpoint on the starting instruction of the exception raising
function will cause this magic to happen. With "catch exception" that
information is stored at a higher level, so you can break *0x08010102
and _not_ have GDB try to walk up a couple of frames.
Seems friendlier to me; I like to keep a line between GDB's
user-friendliness features and its abilities as a system debugger, for
when I'm trying to figure out why a language feature isn't working.
> > > For the user's convenience, when the breakpoint is hit, we automatically
> > > go up the call stack until we find a "user frame" (meaning a frame which
> > > has debug info and is not inside the GNAT runtime), and select that
> > > frame. So the user usually sees the location where the exception was
> > > raised, instead of the runtime machinery that triggers and handles the
> > > exception raise.
> >
> > Does the real frame show up in backtraces?
>
> Yes, here is what happens when hitting an exception breakpoint:
>
> Breakpoint 1, CONSTRAINT_ERROR at 0x08049457 in a () at a.adb:3
> 3 raise Constraint_Error;
> (gdb) bt
> #0 <__gnat_raise_nodefer_with_msg> (e=0x80548f8) at a-except.adb:863
> #1 0x0804bdce in ada.exceptions.raise_with_location_and_msg (e=0x80548f8,
> f=0x804fee7, l=3, m=0x80510cb) at a-except.adb:977
> #2 0x0804bc7d in <__gnat_raise_constraint_error_msg> (file=0x804fee7, line=3,
> msg=0x80510cb) at a-except.adb:853
> #3 0x0804bee9 in <__gnat_rcheck_04> (file=0x804fee7, line=3)
> at a-except.adb:1041
> #4 0x08049457 in a () at a.adb:3
> #5 0x0804942d in main (argc=1, argv=(system.address) 0xbffffa14,
> envp=(system.address) 0xbffffa1c) at b~a.adb:109
Hmm, that's quite nice.
> > What you're describing is what I tried to do for C++, but I couldn't
> > get it to work right. I'd love to unify this code.
>
> Me too. As a matter of fact, I think there is a lot that Ada & C++ have
> in common, but I know very little about C++, and I'd love to see the
> code being shared between the two. There is the symbol stuff (like name
> mangling, etc) that's currently under way, the handling of overloading, etc.
Time will tell :)
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
More information about the Gdb-patches
mailing list