aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-lang.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2020-07-08 07:16:59 -0600
committerTom Tromey <tromey@adacore.com>2020-07-08 07:16:59 -0600
commit15f3b07769c44d88a5015bd166c14a6cddc6c46a (patch)
tree1faf40e5da00bc92bb396d40b77af192070c987c /gdb/ada-lang.c
parenta7f987e8378830b181ce27359ca8bf115018db07 (diff)
downloadgdb-15f3b07769c44d88a5015bd166c14a6cddc6c46a.zip
gdb-15f3b07769c44d88a5015bd166c14a6cddc6c46a.tar.gz
gdb-15f3b07769c44d88a5015bd166c14a6cddc6c46a.tar.bz2
Use read_memory in ada_exception_message_1
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.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r--gdb/ada-lang.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 98508c1..cbcceba 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -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