Fix PR gdb/19676: Disable displaced stepping if /proc not mounted
authorPedro Alves <palves@redhat.com>
Tue, 15 Mar 2016 16:33:04 +0000 (16:33 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 15 Mar 2016 16:33:04 +0000 (16:33 +0000)
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.

gdb/ChangeLog
gdb/infrun.c
gdb/linux-tdep.c

index cb95a89..3e72420 100644 (file)
@@ -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-03-13  Marcin Koƛcielnicki  <koriakin@0x04.net>
 
        * s390-linux-tdep.c (s390_gen_return_address): New function.
index 3e8c9e0..696105d 100644 (file)
@@ -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)
index 555c302..f197aa7 100644 (file)
@@ -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 (&current_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.  */