public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [RFC] Add support for stopping in Ada exception handler
@ 2017-11-21 11:32 Xavier Roirand
  0 siblings, 0 replies; only message in thread
From: Xavier Roirand @ 2017-11-21 11:32 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 3387 bytes --]

Hello,

I'm working on a patch that adds support for stopping on Ada exceptions 
handling using Ada catchpoint.

This command is:

   - catch handle [exception name]
     If the exception name is omitted, then all Ada exception handlers 
are used.

This command will stop if the program handles an Ada exception which has 
been raised or on all Ada exception handlers if not exception name has 
been specified.

Here is a typical GDB session debugging a program that does the
following:

     1. Raise exception Constraint_Error (and catch it)
     2. Raise exception Program_Error (and catch it)
     3. Raise exception Storage_Error (and catch all exceptions)

We'll first stop on Constraint_Error exception handle, and see how it 
catches it for the first exception:

     (gdb) catch handle Constraint_Error
     Catchpoint 1: `Constraint_Error' Ada exception handler
     (gdb) info break
     Num     Type           Disp Enb Address            What
     1       breakpoint     keep y   0x00000000004030f8 
`Constraint_Error' Ada exception handler
     Starting program: /tmp/foo

     Catchpoint 1, exception at 0x0000000000402553 in foo () at foo.adb:24
     24          when Constraint_Error => -- SPOT1

Now we add a Program_Error exception handling:

     (gdb) catch handle Program_Error
     Note: breakpoint 1 also set at pc 0x4030f8.
     Catchpoint 2: `Program_Error' Ada exception handler
     (gdb) info b
     Num     Type           Disp Enb Address            What
     1       breakpoint     keep y   0x00000000004030f8 
`Constraint_Error' Ada exception handler
         breakpoint already hit 1 time
     2       breakpoint     keep y   0x00000000004030f8 `Program_Error' 
Ada exception handler
     (gdb) c
     Continuing.

     Catchpoint 2, exception at 0x00000000004025a5 in foo () at foo.adb:33
     33          when Program_Error => -- SPOT2

Then we finally add a global exception handling catchpoint for all 
exceptions type:

     (gdb) catch handle
     Note: breakpoints 1 and 2 also set at pc 0x4030f8.
     Catchpoint 3: all Ada exceptions handler
     (gdb) info b
     Num     Type           Disp Enb Address            What
     1       breakpoint     keep y   0x00000000004030f8 
`Constraint_Error' Ada exception handler
         breakpoint already hit 1 time
     2       breakpoint     keep y   0x00000000004030f8 `Program_Error' 
Ada exception handler
         breakpoint already hit 1 time
     3       breakpoint     keep y   0x00000000004030f8 all Ada 
exceptions handler
     (gdb) c
     Continuing.

     Catchpoint 3, exception at 0x00000000004025f7 in foo () at foo.adb:42
     42          when others => -- SPOT3
     (gdb)

In terms of implementation, these catchpoints are implemented using
breakpoints inside known functions of the GNAT runtime. However,
when we stop at these breakpoints, it would be confusing to the user
to leave them there. This is why, after the catchpoint hit, we go up
the stack automatically, and find the first "printable" frame, that
is a frame that is not part of the GNAT runtime and that has debugging
info (see ada_find_printable_frame).

I already have a small testcase that tests the general functioning
of these handler catchpoints. I will write some documentation, but I 
want to make sure that no one has any objection, that is, at least the 
user-interface is agreed on before
I start this work.

[-- Attachment #2: foo.adb --]
[-- Type: text/plain, Size: 1144 bytes --]

--  Copyright 2017 Free Software Foundation, Inc.
--
--  This program is free software; you can redistribute it and/or modify
--  it under the terms of the GNU General Public License as published by
--  the Free Software Foundation; either version 3 of the License, or
--  (at your option) any later version.
--
--  This program is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--  GNU General Public License for more details.
--
--  You should have received a copy of the GNU General Public License
--  along with this program.  If not, see <http://www.gnu.org/licenses/>.

procedure Foo is
begin

   begin
      raise Constraint_Error;
   exception
      when Constraint_Error => -- SPOT1
         null;
      when others =>
         null;
   end;

   begin
      raise Program_Error;
   exception
      when Program_Error => -- SPOT2
         null;
      when others =>
         null;
   end;

   begin
      raise Storage_Error;
   exception
      when others => -- SPOT3
         null;
   end;

end Foo;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2017-11-21 11:32 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-21 11:32 [RFC] Add support for stopping in Ada exception handler Xavier Roirand

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).