Fix GDB hang with remote after error from resume
authorAndreas Arnez <arnez@linux.vnet.ibm.com>
Fri, 12 Jan 2018 18:52:39 +0000 (18:52 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 12 Jan 2018 18:52:39 +0000 (18:52 +0000)
Since this commit --

  Fix PR18360 - internal error when using "interrupt -a"
  (https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=c65d6b55)

-- the testsuite shows long delays on s390 with native-gdbserver when
executing certain tests, such as watchpoints.exp.  These hangs have been
discussed before in the context of buildbot problems, see here:

  https://sourceware.org/ml/gdb-patches/2017-12/msg00413.html

The problem can easily be triggered by stopping on a breakpoint, then
setting impossible watchpoints, and finally doing "continue".  Then, after
having set the step-over state (in keep_going_pass_signal in infrun.c),
GDB tries to insert breakpoints and watchpoints into the inferior.  This
fails, and the "continue" command is aborted.  But the step-over state is
not cleared in this case, which causes future step-over attempts to be
skipped since GDB thinks that "we already have an in-line step-over
operation ongoing" (see start_step_over in infrun.c).  Thus the next
"continue" just goes on to wait for events from the remote, which will
never occur.

The problem can also be reproduced on amd64 with native-gdbserver, using
the following change to watchpoints.exp:

 -- >8 --
 --- a/gdb/testsuite/gdb.base/watchpoints.exp
 +++ b/gdb/testsuite/gdb.base/watchpoints.exp
 @@ -61,2 +61,3 @@ with_test_prefix "before inferior start" {
      gdb_test "watch ival3" ".*" ""
 +    gdb_test "watch *(char \[256\] *) main"

 -- >8 --

To fix the hang, this patch clears the step-over info when
insert_breakpoints has failed.  Of course, with native-gdbserver the
watchpoints.exp test case still causes many FAILs on s390, because
gdbserver does not support watchpoints for that target.  This is a
separate issue.

gdb/ChangeLog:
2018-01-12  Andreas Arnez  <arnez@linux.vnet.ibm.com>

* infrun.c (keep_going_pass_signal): Clear step-over info when
insert_breakpoints fails.

gdb/ChangeLog
gdb/infrun.c

index 4f9bb8d86ae7262217de4859d82ba30036379f8f..66ca03d0ece2a21915a762398f0635ae6695635d 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-12  Andreas Arnez  <arnez@linux.vnet.ibm.com>
+
+       * infrun.c (keep_going_pass_signal): Clear step-over info when
+       insert_breakpoints fails.
+
 2018-01-11  Pedro Alves  <palves@redhat.com>
 
        PR gdb/22583
index 7d6aa7d0693ca3d8ad8320e74116ad17922be495..e1d11234e09f35b7a7d0fbbd686f7a91e493cafd 100644 (file)
@@ -7778,6 +7778,7 @@ keep_going_pass_signal (struct execution_control_state *ecs)
        {
          exception_print (gdb_stderr, e);
          stop_waiting (ecs);
+         clear_step_over_info ();
          return;
        }
       END_CATCH