Fix PR remote/21852: Remote run without specifying a local binary crashes GDB
authorSergio Durigan Junior <sergiodj@redhat.com>
Tue, 22 Aug 2017 12:52:44 +0000 (08:52 -0400)
committerSergio Durigan Junior <sergiodj@redhat.com>
Wed, 23 Aug 2017 21:28:02 +0000 (17:28 -0400)
commit87215ad1651ca3094d813eae06233fd7259b37e5
tree5209b68c0f32d118625392055949a5f1eaa621aa
parentaab921adcb656e4eefcc7d0f14241f3d7504400e
Fix PR remote/21852: Remote run without specifying a local binary crashes GDB

There is an assertion that is triggering when we start GDB and
instruct it to debug a remote inferior, but don't provide a local
binary, like:

  ./gdb -nx -q --data-directory=data-directory -ex "tar ext :1234" \
    -ex "set remote exec-file /bin/ls" -ex r

In this case, when calling exec_file_locate_attach to locate the
inferior, GDB is incorrectly resetting the breakpoints without a
thread/inferior even running, which causes an assertion to be
triggered:

  binutils-gdb/gdb/thread.c:1609: internal-error: scoped_restore_current_thread::scoped_restore_current_thread(): Assertion `tp != NULL' failed.
  A problem internal to GDB has been detected,
  further debugging may prove unreliable.
  Quit this debugging session? (y or n)

This happens because add_current_inferior_and_thread (on remote.c) is
breaking an invariant: making inferior_ptid point to a non-existing
thread and then calling common code, which in this case is
breakpoint_re_set.  The fix is to make sure that inferior_ptid points
to null_ptid if there is no thread present.

A testcase is provided.  Regtested on buildbot.

gdb/ChangeLog:
2017-08-23  Pedro Alves  <palves@redhat.com>

PR remote/21852
* remote.c (add_current_inferior_and_thread): Set inferior_ptid
to null_ptid and switch to thread without reading the registers
after adding the inferior.

gdb/testsuite/ChangeLog:
2017-08-23  Sergio Durigan Junior  <sergiodj@redhat.com>

PR remote/21852
* gdb.server/normal.c: New file, copied from gdb.base.
* gdb.server/run-without-local-binary.exp: New file.
gdb/ChangeLog
gdb/remote.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.server/normal.c [new file with mode: 0644]
gdb/testsuite/gdb.server/run-without-local-binary.exp [new file with mode: 0644]