This is the mail archive of the
gdb-cvs@sourceware.org
mailing list for the GDB project.
[binutils-gdb/gdb-7.11-branch] Fix PR gdb/19676: Disable displaced stepping if /proc not mounted
- From: Pedro Alves <palves at sourceware dot org>
- To: gdb-cvs at sourceware dot org
- Date: 15 Mar 2016 16:39:42 -0000
- Subject: [binutils-gdb/gdb-7.11-branch] Fix PR gdb/19676: Disable displaced stepping if /proc not mounted
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4e57eb7028442f0e771c815d755b64daf7394e68
commit 4e57eb7028442f0e771c815d755b64daf7394e68
Author: Pedro Alves <palves@redhat.com>
Date: Tue Mar 15 16:33:04 2016 +0000
Fix PR gdb/19676: Disable displaced stepping if /proc not mounted
On GNU/Linux archs that support displaced stepping, if /proc is not
mounted, GDB gets stuck not able to step past breakpoints:
(gdb) c
Continuing.
dl_main (phdr=<optimized out>, phnum=<optimized out>, user_entry=<optimized out>, auxv=<optimized out>) at rtld.c:2163
2163 LIBC_PROBE (init_complete, 2, LM_ID_BASE, r);
Cannot find AT_ENTRY auxiliary vector entry.
(gdb) c
Continuing.
dl_main (phdr=<optimized out>, phnum=<optimized out>, user_entry=<optimized out>, auxv=<optimized out>) at rtld.c:2163
2163 LIBC_PROBE (init_complete, 2, LM_ID_BASE, r);
Cannot find AT_ENTRY auxiliary vector entry.
(gdb)
That's because GDB can't figure out where the scratch pad is.
This is a regression introduced by the earlier changes to make the
Linux native target always work in non-stop mode.
This commit makes GDB detect the case and fallback to stepping over
breakpoints in-line.
gdb/ChangeLog:
2016-03-15 Pedro Alves <palves@redhat.com>
PR gdb/19676
* infrun.c (displaced_step_prepare): Also disable displaced
stepping on NOT_SUPPORTED_ERROR.
* linux-tdep.c (linux_displaced_step_location): If reading auxv
fails, throw NOT_SUPPORTED_ERROR instead of generic error.
Diff:
---
gdb/ChangeLog | 8 ++++++++
gdb/infrun.c | 3 ++-
gdb/linux-tdep.c | 3 ++-
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8b83bf0..15a2c80 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2016-03-15 Pedro Alves <palves@redhat.com>
+
+ PR gdb/19676
+ * infrun.c (displaced_step_prepare): Also disable displaced
+ stepping on NOT_SUPPORTED_ERROR.
+ * linux-tdep.c (linux_displaced_step_location): If reading auxv
+ fails, throw NOT_SUPPORTED_ERROR instead of generic error.
+
2016-02-24 Joel Brobecker <brobecker@adacore.com>
* version.in: Set GDB version number to 7.11.0.DATE-git.
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 15210c9..04e7073 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -1894,7 +1894,8 @@ displaced_step_prepare (ptid_t ptid)
{
struct displaced_step_inferior_state *displaced_state;
- if (ex.error != MEMORY_ERROR)
+ if (ex.error != MEMORY_ERROR
+ && ex.error != NOT_SUPPORTED_ERROR)
throw_exception (ex);
if (debug_infrun)
diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c
index 555c302..f197aa7 100644
--- a/gdb/linux-tdep.c
+++ b/gdb/linux-tdep.c
@@ -2426,7 +2426,8 @@ linux_displaced_step_location (struct gdbarch *gdbarch)
location. The auxiliary vector gets us the PowerPC-side entry
point address instead. */
if (target_auxv_search (¤t_target, AT_ENTRY, &addr) <= 0)
- error (_("Cannot find AT_ENTRY auxiliary vector entry."));
+ throw_error (NOT_SUPPORTED_ERROR,
+ _("Cannot find AT_ENTRY auxiliary vector entry."));
/* Make certain that the address points at real code, and not a
function descriptor. */