Go to file
Pedro Alves 56f4dea207 gdb/Windows: Fix detach while running
While testing a WIP Cygwin GDB that supports non-stop, I noticed that
gdb.threads/attach-non-stop.exp exposes that this:

 (gdb) attach PID&
 ...
 (gdb) detach

... hangs.

And it turns out that it hangs in all-stop as well.  This commits
fixes that.

After "attach &", the target is set running, we've called
ContinueDebugEvent and the process_thread thread is waiting for
WaitForDebugEvent events.  It is the equivalent of "attach; c&".

In windows_nat_target::detach, the first thing we do is
unconditionally call windows_continue (for ContinueDebugEvent), which
blocks in do_synchronously, until the process_thread sees an event out
of WaitForDebugEvent.  Unless the inferior happens to run into a
breakpoint, etc., then this hangs indefinitely.

If we've already called ContinueDebugEvent earlier, then we shouldn't
be calling it again in ::detach.

Still in windows_nat_target::detach, we have an interesting issue that
ends up being the bulk of the patch -- only the process_thread thread
can call DebugActiveProcessStop, but if it is blocked in
WaitForDebugEvent, we need to somehow force it to break out of it.
The only way to do that, is to force the inferior to do something that
causes WaitForDebugEvent to return some event.

This patch uses CreateRemoteThread to do it, which results in
WaitForDebugEvent reporting CREATE_THREAD_DEBUG_EVENT.  We then
terminate the injected thread before it has a chance to run any
userspace code.

Note that Win32 functions like DebugBreakProcess and
GenerateConsoleCtrlEvent would also inject a new thread in the
inferior.  I first used DebugBreakProcess, but that is actually more
complicated to use, because we'd have to be sure to consume the
breakpoint event before detaching, otherwise the inferior would likely
die due a breakpoint exception being raised with no debugger around to
intercept it.

See the new break_out_process_thread method.

So the fix has two parts:

 - Keep track of whether we've called ContinueDebugEvent and the
   process_thread thread is waiting for events, or whether
   WaitForDebugEvent already returned an event.

 - In windows_nat_target::detach, if the process_thread thread is
   waiting for events, unblock out of its WaitForDebugEvent, before
   proceeding with the actual detach.

New test included.  Passes cleanly on GNU/Linux native and gdbserver,
and also passes cleanly on Cygwin and MinGW, with the fix.  Before the
fix, it would hang and fail with a timeout.

Tested-By: Hannes Domani <ssbssa@yahoo.de>
Reviewed-By: Tom Tromey <tom@tromey.com>
Change-Id: Ifb91c58c08af1a9bcbafecedc93dfce001040905
2024-04-17 18:57:01 +01:00
bfd elf: Skip the archive if the symbol isn't referenced 2024-04-16 17:45:23 -07:00
binutils aarch64: Remove asserts from operand qualifier decoders [PR31595] 2024-04-17 11:18:55 +01:00
config mmap: Avoid the sanitizer configure check failure 2024-04-10 03:57:02 -07:00
contrib
cpu
elfcpp
etc
gas x86: Fix a memory leak in md_assemble 2024-04-16 06:32:33 -07:00
gdb gdb/Windows: Fix detach while running 2024-04-17 18:57:01 +01:00
gdbserver gdb+gdbserver/Linux: Remove USE_SIGTRAP_SIGINFO fallback 2024-04-17 18:21:30 +01:00
gdbsupport gdbsupport, gdbserver, gdb: use -Wno-vla-cxx-extension 2024-04-17 10:49:32 -04:00
gnulib
gold Add missing install-dvi and install-ps Makefie targets. 2024-04-05 07:02:56 +00:00
gprof Add missing install-dvi and install-ps Makefie targets. 2024-04-05 07:02:56 +00:00
gprofng gprofng: Fix dvi documentation build rule 2024-04-15 09:51:19 +00:00
include aarch64: Remove asserts from operand qualifier decoders [PR31595] 2024-04-17 11:18:55 +01:00
ld elf: Skip the archive if the symbol isn't referenced 2024-04-16 17:45:23 -07:00
libbacktrace
libctf libctf warnings 2024-04-17 09:24:36 +09:30
libdecnumber
libiberty mmap: Avoid the sanitizer configure check failure 2024-04-10 03:57:02 -07:00
libsframe mmap: Avoid the sanitizer configure check failure 2024-04-10 03:57:46 -07:00
opcodes aarch64: Remove asserts from operand qualifier decoders [PR31595] 2024-04-17 11:18:55 +01:00
readline
sim sim: riscv: Fix confusion with c.jal vs. c.addiw 2024-04-15 11:04:07 +02:00
texinfo
zlib mmap: Avoid the sanitizer configure check failure 2024-04-10 03:57:02 -07:00
.cvsignore
.editorconfig
.gitattributes
.gitignore
.pre-commit-config.yaml Add flake8 and isort to .pre-commit-config.yaml 2024-04-04 06:43:39 -06:00
ar-lib
ChangeLog
compile
config-ml.in
config.guess
config.rpath
config.sub
configure
configure.ac
COPYING
COPYING3
COPYING3.LIB
COPYING.LIB
COPYING.LIBGLOSS
COPYING.NEWLIB
depcomp
djunpack.bat
install-sh
libtool.m4
lt~obsolete.m4
ltgcc.m4
ltmain.sh
ltoptions.m4
ltsugar.m4
ltversion.m4
MAINTAINERS
Makefile.def
Makefile.in
Makefile.tpl
makefile.vms
missing
mkdep
mkinstalldirs
move-if-change
multilib.am
README
README-maintainer-mode
SECURITY.txt
setup.com
src-release.sh
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.