public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [commit/Ada] crash evaluating bogus exception condition expression (sparc-solaris)
@ 2013-12-03 11:44 Joel Brobecker
  0 siblings, 0 replies; only message in thread
From: Joel Brobecker @ 2013-12-03 11:44 UTC (permalink / raw)
  To: gdb-patches

Hello,

With a program raising an exception, trying to debug that program
in GDB/MI mode can yield a crash:

    % gdb -i=mi foo
    (gdb)
    -catch-exception -e "Program_Error"
    ^done,bkptno="2",bkpt={number="2",type="breakpoint",[...]
    (gdb)
    -exec-continue
    ^running
    *running,thread-id="all"
    (gdb)
    =library-loaded,id=[...]
    &"warning: failed to reevaluate internal exception condition for catchpoint 2: Error in expression, near `'.\n"
    zsh: 22956 bus error (core dumped)  gdb -q -i=mi foo

The problem is triggered by a problem in the compiler which causes
EXP in the following TRY_CATCH block to change unexpectedly when
parse_exp_1 throws an error :

   |      TRY_CATCH (e, RETURN_MASK_ERROR)
   |        {
   |          exp = parse_exp_1 (&s, bl->address,
   |                             block_for_pc (bl->address), 0);
   |        }

In ada-lang.c:create_excep_cond_exprs, EXP is initialized to NULL,
and is expected to remain NULL if parse_exp_1 throws.  Instead,
its value gets changed to something invalid.  This later crashes
the debugger, when trying to evaluate the bogus expression.

This patch works around the issue by simply forcing EXP back to NULL
when an exception was thrown. A comment explaining why, and the sort
of timeline we're looking at for a fix, is also added.

gdb/ChangeLog:

        * ada-lang.c (create_excep_cond_exprs): Force EXP to NULL
        when parse_exp_1 threw an error.  Add comment.

Tested on sparc-solaris with AdaCore's testsuite (the official testsuite
badly crashes the host), and on x86_64-linux (with both testsuites).

Checked in.

Thanks,
-- 
Joel

---
 gdb/ada-lang.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 417232c..786ca7a 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -11461,9 +11461,18 @@ create_excep_cond_exprs (struct ada_catchpoint *c)
 				 block_for_pc (bl->address), 0);
 	    }
 	  if (e.reason < 0)
-	    warning (_("failed to reevaluate internal exception condition "
-		       "for catchpoint %d: %s"),
-		     c->base.number, e.message);
+	    {
+	      warning (_("failed to reevaluate internal exception condition "
+			 "for catchpoint %d: %s"),
+		       c->base.number, e.message);
+	      /* There is a bug in GCC on sparc-solaris when building with
+		 optimization which causes EXP to change unexpectedly
+		 (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56982).
+		 The problem should be fixed starting with GCC 4.9.
+		 In the meantime, work around it by forcing EXP back
+		 to NULL.  */
+	      exp = NULL;
+	    }
 	}
 
       ada_loc->excep_cond_expr = exp;
-- 
1.8.1.2

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

only message in thread, other threads:[~2013-12-03 11:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-12-03 11:44 [commit/Ada] crash evaluating bogus exception condition expression (sparc-solaris) Joel Brobecker

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).