Go to file
Andrew Burgess 8f66807b98 gdb: better handling of 'S' packets
This commit builds on work started in the following two commits:

  commit 24ed6739b6
  Date:   Thu Jan 30 14:35:40 2020 +0000

      gdb/remote: Restore support for 'S' stop reply packet

  commit cada5fc921
  Date:   Wed Mar 11 12:30:13 2020 +0000

      gdb: Handle W and X remote packets without giving a warning

This is related to how GDB handles remote targets that send back 'S'
packets.

In the first of the above commits we fixed GDB's ability to handle a
single process, single threaded target that sends back 'S' packets.
Although the 'T' packet would always be preferred to 'S' these days,
there's nothing really wrong with 'S' for this situation.

The second commit above fixed an oversight in the first commit, a
single-process, multi-threaded target can send back a process wide
event, for example the process exited event 'W' without including a
process-id, this also is fine as there is no ambiguity in this case.

In PR gdb/26819 we run into yet another problem with the above
commits.  In this case we have a single process with two threads, GDB
hits a breakpoint in thread 2 and then performs a stepi:

  (gdb) b main
  Breakpoint 1 at 0x1212340830: file infinite_loop.S, line 10.
  (gdb) c
  Continuing.

  Thread 2 hit Breakpoint 1, main () at infinite_loop.S:10
  10    in infinite_loop.S
  (gdb) set debug remote 1
  (gdb) stepi
  Sending packet: $vCont;s:2#24...Packet received: S05
  ../binutils-gdb/gdb/infrun.c:5807: internal-error: int finish_step_over(execution_control_state*): Assertion `ecs->event_thread->control.trap_expected' failed.

What happens in this case is that on the RISC-V target displaced
stepping is not supported, so when the stepi is issued GDB steps just
thread 2.  As only a single thread was set running the target decides
that is can get away with sending back an 'S' packet without a
thread-id.  GDB then associates the stop with thread 1 (the first
non-exited thread), but as thread 1 was not previously set executing
the assertion seen above triggers.

As an aside I am surprised that the target sends pack 'S' in this
situation.  The target is happy to send back 'T' (including thread-id)
when multiple threads are set running, so (to me) it would seem easier
to just always use the 'T' packet when multiple threads are in use.
However, the target only uses 'T' when multiple threads are actually
executing, otherwise an 'S' packet it used.

Still, when looking at the above situation we can see that GDB should
be able to understand which thread the 'S' reply is referring too.

The problem is that is that in commit 24ed6739b6 (above) when a stop
reply comes in with no thread-id we look for the first non-exited
thread and select that as the thread the stop applies too.

What we should really do is select the first non-exited, resumed thread,
and associate the stop event with this thread.  In the above example
both thread 1 and 2 are non-exited, but only thread 2 is resumed, so
this is what we should use.

There's a test for this issue included which works with stock
gdbserver by disabling use of the 'T' packet, and enabling
'scheduler-locking' within GDB so only one thread is set running.

gdb/ChangeLog:

	PR gdb/26819
	* remote.c
	(remote_target::select_thread_for_ambiguous_stop_reply): New
	member function.
	(remote_target::process_stop_reply): Call
	select_thread_for_ambiguous_stop_reply.

gdb/testsuite/ChangeLog:

	PR gdb/26819
	* gdb.server/stop-reply-no-thread-multi.c: New file.
	* gdb.server/stop-reply-no-thread-multi.exp: New file.

Change-Id: I9b49d76c2a99063dcc76203fa0f5270a72825d15
2021-01-13 20:26:58 -05:00
bfd Automatic date update in version.in 2021-01-14 00:00:14 +00:00
binutils Regen Makefile.in for jobserver.m4 aclocal.m4 dependency 2021-01-13 22:06:02 +10:30
config Implement a workaround for GNU mak jobserver 2021-01-12 05:45:44 -08:00
contrib Import mklog.py from gcc repo 2020-09-25 10:24:44 -04:00
cpu Add Changelog entries and NEWS entries for 2.36 branch 2021-01-09 10:40:28 +00:00
elfcpp Add Changelog entries and NEWS entries for 2.36 branch 2021-01-09 10:40:28 +00:00
etc Update year range in copyright notice of binutils files 2021-01-01 10:31:05 +10:30
gas x86: Don't generate GOT_symbol for PLT relocations 2021-01-13 05:42:27 -08:00
gdb gdb: better handling of 'S' packets 2021-01-13 20:26:58 -05:00
gdbserver [gdb/build] Fix gdbserver build with -fsanitize=address 2021-01-07 10:37:51 +01:00
gdbsupport gdb: check for empty strings in get_standard_cache_dir/get_standard_config_dir 2021-01-08 13:46:56 -05:00
gnulib Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
gold Updated translations for multiple subdirectories 2021-01-11 12:55:33 +00:00
gprof Regen Makefile.in for jobserver.m4 aclocal.m4 dependency 2021-01-13 22:06:02 +10:30
include aarch64: Remove support for CSRE 2021-01-11 15:01:09 +00:00
intl Regen with blessed automake-1.15.1 2020-02-20 13:02:24 +10:30
ld Re: SHF_LINK_ORDER fixup_link_order in ld 2021-01-14 08:51:29 +10:30
libctf Regen Makefile.in for jobserver.m4 aclocal.m4 dependency 2021-01-13 22:06:02 +10:30
libdecnumber Run autoreconf -vf throughout 2020-07-29 16:03:55 -04:00
libiberty GCC: Check if AR works with --plugin and rc 2021-01-11 16:26:51 -08:00
opcodes Regen Makefile.in for jobserver.m4 aclocal.m4 dependency 2021-01-13 22:06:02 +10:30
readline Update readline/README to mention patchlevel 2020-06-30 15:17:07 -06:00
sim sim: watch: fix range expression processing 2021-01-13 05:52:51 -05:00
texinfo
zlib GCC: Check if AR works with --plugin and rc 2021-01-11 16:26:51 -08:00
.cvsignore
.gitattributes
.gitignore Add gnu global outputs to .gitignore 2020-12-02 10:00:27 -05:00
ar-lib
ChangeLog src-release: fix indentation 2021-01-12 18:19:20 -05:00
compile
config-ml.in
config.guess Update config.sub and config.guess 2021-01-05 15:55:59 +10:30
config.rpath
config.sub config.sub update broke powerpc-eabivle 2021-01-07 08:56:28 +10:30
configure binuitils: Check if AR is usable for LTO build 2021-01-11 16:37:13 -08:00
configure.ac binuitils: Check if AR is usable for LTO build 2021-01-11 16:37:13 -08:00
COPYING
COPYING3
COPYING3.LIB
COPYING.LIB
COPYING.LIBGLOSS
COPYING.NEWLIB
depcomp
djunpack.bat
install-sh
libtool.m4 GCC: Check if AR works with --plugin and rc 2021-01-11 16:26:51 -08:00
lt~obsolete.m4
ltgcc.m4
ltmain.sh
ltoptions.m4
ltsugar.m4
ltversion.m4
MAINTAINERS Move gdbserver to top level 2020-02-07 08:42:25 -07:00
Makefile.def libctf: new testsuite 2021-01-05 14:53:40 +00:00
Makefile.in Support the PGO build for binutils+gdb 2021-01-09 06:51:51 -08:00
Makefile.tpl Support the PGO build for binutils+gdb 2021-01-09 06:51:51 -08:00
makefile.vms
missing
mkdep
mkinstalldirs
move-if-change
multilib.am
README
README-maintainer-mode
setup.com
src-release.sh src-release: fix indentation 2021-01-12 18:19:20 -05:00
symlink-tree
test-driver
ylwrap

		   README for GNU development tools

This directory contains various GNU compilers, assemblers, linkers, 
debuggers, etc., plus their support routines, definitions, and documentation.

If you are receiving this as part of a GDB release, see the file gdb/README.
If with a binutils release, see binutils/README;  if with a libg++ release,
see libg++/README, etc.  That'll give you info about this
package -- supported targets, how to use it, how to report bugs, etc.

It is now possible to automatically configure and build a variety of
tools with one command.  To build all of the tools contained herein,
run the ``configure'' script here, e.g.:

	./configure 
	make

To install them (by default in /usr/local/bin, /usr/local/lib, etc),
then do:
	make install

(If the configure script can't determine your type of computer, give it
the name as an argument, for instance ``./configure sun4''.  You can
use the script ``config.sub'' to test whether a name is recognized; if
it is, config.sub translates it to a triplet specifying CPU, vendor,
and OS.)

If you have more than one compiler on your system, it is often best to
explicitly set CC in the environment before running configure, and to
also set CC when running make.  For example (assuming sh/bash/ksh):

	CC=gcc ./configure
	make

A similar example using csh:

	setenv CC gcc
	./configure
	make

Much of the code and documentation enclosed is copyright by
the Free Software Foundation, Inc.  See the file COPYING or
COPYING.LIB in the various directories, for a description of the
GNU General Public License terms under which you can copy the files.

REPORTING BUGS: Again, see gdb/README, binutils/README, etc., for info
on where and how to report problems.