Use read_memory in ada_exception_message_1
authorTom Tromey <tromey@adacore.com>
Wed, 8 Jul 2020 13:16:59 +0000 (07:16 -0600)
committerTom Tromey <tromey@adacore.com>
Wed, 8 Jul 2020 13:16:59 +0000 (07:16 -0600)
Testing using the internal AdaCore test suite showed a regression from
the target string reading changes.  In particular, now
ada_exception_message_1 can get the wrong answer in some cases.  In
particular, when an Ada exception catchpoint is hit, sometimes the
exception name will be incorrect.  The case I was seeing changed from
the correct:

    Catchpoint 2, CONSTRAINT_ERROR (catch C_E) at [...]

to:

    Catchpoint 2, CONSTRAINT_ERROR (catch C_EE) at [...]

I was not able to reproduce this failure with the Fedora gnat.
Perhaps it is related to some local change to gnat; I do not know.

Meanwhile, because ada_exception_message_1 knows the length of the
string to read, we can use read_memory here.  This fixes the bug.

I've updated the test suite to at least exercise this code path.
However, as mentioned above, the new test does not actually provoke
the failure.

gdb/ChangeLog
2020-07-08  Tom Tromey  <tromey@adacore.com>

* ada-lang.c (ada_exception_message_1): Use read_memory.

gdb/testsuite/ChangeLog
2020-07-08  Tom Tromey  <tromey@adacore.com>

* gdb.ada/catch_ex/foo.adb: Pass string to raise.
* gdb.ada/catch_ex.exp: Examine catchpoint text.

gdb/ChangeLog
gdb/ada-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/catch_ex.exp
gdb/testsuite/gdb.ada/catch_ex/foo.adb

index c86d7e4647e45eb23919d3d3b5f37258f0d8ed0a..da904f16c2f5213364c0e171b133d12f9f483de3 100644 (file)
@@ -1,3 +1,7 @@
+2020-07-08  Tom Tromey  <tromey@adacore.com>
+
+       * ada-lang.c (ada_exception_message_1): Use read_memory.
+
 2020-07-06  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        PR python/22748
index 98508c168bc127d2c22dde4c6cb326da4ce6dfa4..cbcceba838de6b4d07f9343179c187be0a126158 100644 (file)
@@ -11894,7 +11894,12 @@ ada_exception_message_1 (void)
   if (e_msg_len <= 0)
     return NULL;
 
-  return target_read_string (value_address (e_msg_val), INT_MAX);
+  gdb::unique_xmalloc_ptr<char> e_msg ((char *) xmalloc (e_msg_len + 1));
+  read_memory (value_address (e_msg_val), (gdb_byte *) e_msg.get (),
+              e_msg_len);
+  e_msg.get ()[e_msg_len] = '\0';
+
+  return e_msg;
 }
 
 /* Same as ada_exception_message_1, except that all exceptions are
index 8eae1ab782add2eebda79611d5937c318878157a..6810ef682b0662e4f4c03a03dcb6e6aa200071ad 100644 (file)
@@ -1,3 +1,8 @@
+2020-07-08  Tom Tromey  <tromey@adacore.com>
+
+       * gdb.ada/catch_ex/foo.adb: Pass string to raise.
+       * gdb.ada/catch_ex.exp: Examine catchpoint text.
+
 2020-07-06  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        PR python/22748
index 7bb1c06f544d7817655d71b4c42b74b0d19fbbb1..68914139830ce0120f2a40d5a2d7d917ec154f0c 100644 (file)
@@ -62,7 +62,7 @@ gdb_test "info break" \
          "info break, catch all Ada exceptions"
 
 set catchpoint_msg \
-  "Catchpoint $any_nb, CONSTRAINT_ERROR (\\\(foo\\.adb:$decimal explicit raise\\\) )?at $any_addr in foo \\\(\\\).*at .*foo.adb:$any_nb"
+  "Catchpoint $any_nb, CONSTRAINT_ERROR (\\\(ignore C_E\\\) )?at $any_addr in foo \\\(\\\).*at .*foo.adb:$any_nb"
 gdb_test "continue" \
          "Continuing\.$eol$catchpoint_msg$eol.*SPOT1" \
          "continuing to first exception"
index bee394fc02f1c45d7b4612d0a76f6bd73da0e8fa..cdf0286beee13718a2fb42c419dd8b1ada4485b6 100644 (file)
@@ -17,7 +17,7 @@ procedure Foo is
 begin
 
    begin
-      raise Constraint_Error;  -- SPOT1
+      raise Constraint_Error with "ignore C_E";  -- SPOT1
    exception
       when others =>
          null;