From 16b4184277c4ad5b4a20278060fd3f6259d1ed49 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 15 Mar 2016 16:33:04 +0000 Subject: [PATCH] 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=, phnum=, user_entry=, auxv=) 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=, phnum=, user_entry=, auxv=) 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 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. --- 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 cb95a89d6a5..3e72420282f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2016-03-15 Pedro Alves + + 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-03-13 Marcin Kościelnicki * s390-linux-tdep.c (s390_gen_return_address): New function. diff --git a/gdb/infrun.c b/gdb/infrun.c index 3e8c9e0faf4..696105d0636 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 555c302bc88..f197aa76fab 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. */ -- 2.30.2