binutils-gdb/gdb/testsuite/gdb.threads
Tom de Vries b73715df01 [gdb] Handle vfork in thread with follow-fork-mode child
When debugging any of the testcases added by this commit, which do a
vfork in a thread with "set follow-fork-mode child" + "set
detach-on-fork on", we run into this assertion:

...
src/gdb/nat/x86-linux-dregs.c:146: internal-error: \
  void x86_linux_update_debug_registers(lwp_info*): \
  Assertion `lwp_is_stopped (lwp)' failed.
...

The assert is caused by the following: the vfork-child exit or exec
event is handled by handle_vfork_child_exec_or_exit, which calls
target_detach to detach from the vfork parent.  During target_detach
we call linux_nat_target::detach, which:

#1 - stops all the threads
#2 - waits for all the threads to be stopped
#3 - detaches all the threads

However, during the second step we run into this code in
stop_wait_callback:

...
  /* If this is a vfork parent, bail out, it is not going to report
     any SIGSTOP until the vfork is done with.  */
  if (inf->vfork_child != NULL)
    return 0;
...

and we don't wait for the threads to be stopped, which results in this
assert in x86_linux_update_debug_registers triggering during the third
step:

...
  gdb_assert (lwp_is_stopped (lwp));
...

The fix is to reset the vfork parent's vfork_child field before
calling target_detach in handle_vfork_child_exec_or_exit.  There's
already similar code for the other paths handled by
handle_vfork_child_exec_or_exit, so this commit refactors the code a
bit so that all paths share the same code.

The new tests cover both a vfork child exiting, and a vfork child
execing, since both cases would trigger the assertion.

The new testcases also exercise following the vfork children with "set
detach-on-fork off", since it doesn't seem to be tested anywhere.

Tested on x86_64-linux, using native and native-gdbserver.

gdb/ChangeLog:
2019-04-18  Tom de Vries  <tdevries@suse.de>
	    Pedro Alves  <palves@redhat.com>

	PR gdb/24454
	* infrun.c (handle_vfork_child_exec_or_exit): Reset vfork parent's
	vfork_child field before calling target_detach.

gdb/testsuite/ChangeLog:
2019-04-18  Tom de Vries  <tdevries@suse.de>
	    Pedro Alves  <palves@redhat.com>

	PR gdb/24454
	* gdb.threads/vfork-follow-child-exec.c: New file.
	* gdb.threads/vfork-follow-child-exec.exp: New file.
	* gdb.threads/vfork-follow-child-exit.c: New file.
	* gdb.threads/vfork-follow-child-exit.exp: New file.
2019-04-18 17:05:43 +01:00
..
attach-into-signal.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
attach-into-signal.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
attach-many-short-lived-threads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
attach-many-short-lived-threads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
attach-slow-waitpid.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
attach-slow-waitpid.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
attach-stopped.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
attach-stopped.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
bp_in_thread.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
bp_in_thread.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
break-while-running.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
break-while-running.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
check-libthread-db.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
check-libthread-db.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
clone-attach-detach.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
clone-attach-detach.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
clone-new-thread-event.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
clone-new-thread-event.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
clone-thread_db.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
clone-thread_db.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
continue-pending-after-query.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
continue-pending-after-query.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
continue-pending-status.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
continue-pending-status.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
corethreads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
corethreads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
create-fail.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
create-fail.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
current-lwp-dead.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
current-lwp-dead.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
dlopen-libpthread-lib.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
dlopen-libpthread.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
dlopen-libpthread.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
execl1.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
execl.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
execl.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
fork-child-threads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
fork-child-threads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
fork-plus-threads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
fork-plus-threads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
fork-thread-pending.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
fork-thread-pending.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
forking-threads-plus-breakpoint.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
forking-threads-plus-breakpoint.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
gcore-stale-thread.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
gcore-stale-thread.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
gcore-thread.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
hand-call-in-threads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
hand-call-in-threads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
hand-call-new-thread.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
hand-call-new-thread.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
ia64-sigill.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
ia64-sigill.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
info-threads-cur-sal-2.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
info-threads-cur-sal.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
info-threads-cur-sal.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
interrupt-while-step-over.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
interrupt-while-step-over.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
interrupted-hand-call.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
interrupted-hand-call.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
kill.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
kill.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
killed.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
killed.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
leader-exit.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
leader-exit.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
linux-dp.c
linux-dp.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
local-watch-wrong-thread.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
local-watch-wrong-thread.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
manythreads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
manythreads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
multi-create-ns-info-thr.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
multi-create.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
multi-create.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
multiple-step-overs.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
multiple-step-overs.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
multiple-successive-infcall.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
multiple-successive-infcall.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
names.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
names.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
next-bp-other-thread.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
next-bp-other-thread.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
next-while-other-thread-longjmps.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
next-while-other-thread-longjmps.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
no-unwaited-for-left.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
no-unwaited-for-left.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-ldr-exc-1.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-ldr-exc-1.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-ldr-exc-2.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-ldr-exc-2.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-ldr-exc-3.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-ldr-exc-3.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-ldr-exc-4.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-ldr-exc-4.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-ldr-exit.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-ldr-exit.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-stop-fair-events.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
non-stop-fair-events.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
pending-step.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
pending-step.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
print-threads.c
print-threads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
process-dies-while-detaching.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
process-dies-while-detaching.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
process-dies-while-handling-bp.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
process-dies-while-handling-bp.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
pthread_cond_wait.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
pthread_cond_wait.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
pthreads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
pthreads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
queue-signal.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
queue-signal.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
reconnect-signal.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
reconnect-signal.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
schedlock.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
schedlock.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
siginfo-threads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
siginfo-threads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
signal-command-handle-nopass.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
signal-command-handle-nopass.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
signal-command-multiple-signals-pending.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
signal-command-multiple-signals-pending.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
signal-delivered-right-thread.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
signal-delivered-right-thread.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
signal-sigtrap.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
signal-sigtrap.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
signal-while-stepping-over-bp-other-thread.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
signal-while-stepping-over-bp-other-thread.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
sigstep-threads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
sigstep-threads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
sigthread.c
sigthread.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
slow-waitpid.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
staticthreads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
staticthreads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
step-bg-decr-pc-switch-thread.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
step-bg-decr-pc-switch-thread.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
step-over-lands-on-breakpoint.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
step-over-lands-on-breakpoint.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
step-over-trips-on-watchpoint.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
step-over-trips-on-watchpoint.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
stepi-random-signal.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
stepi-random-signal.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
switch-threads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
switch-threads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread_check.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread_check.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread_events.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread_events.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread-execl.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread-execl.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread-find.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread-specific-bp.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread-specific-bp.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread-specific.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread-specific.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
thread-unwindonsignal.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
threadapply.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
threadapply.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
threxit-hop-specific.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
threxit-hop-specific.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tid-reuse.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tid-reuse.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls2.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-core.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-core.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-main.c
tls-nodebug-pie.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-nodebug-pie.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-nodebug.c
tls-nodebug.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-shared.c
tls-shared.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-so_extern_main.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-so_extern.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-so_extern.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-var-main.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-var.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls-var.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
tls.c
tls.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
vfork-follow-child-exec.c [gdb] Handle vfork in thread with follow-fork-mode child 2019-04-18 17:05:43 +01:00
vfork-follow-child-exec.exp [gdb] Handle vfork in thread with follow-fork-mode child 2019-04-18 17:05:43 +01:00
vfork-follow-child-exit.c [gdb] Handle vfork in thread with follow-fork-mode child 2019-04-18 17:05:43 +01:00
vfork-follow-child-exit.exp [gdb] Handle vfork in thread with follow-fork-mode child 2019-04-18 17:05:43 +01:00
watchpoint-fork-child.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
watchpoint-fork-mt.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
watchpoint-fork-parent.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
watchpoint-fork-st.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
watchpoint-fork.exp Fix stepping past unwritable kernel helper on nios2-linux-gnu. 2019-03-28 09:29:22 -07:00
watchpoint-fork.h Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
watchthreads2.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
watchthreads2.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
watchthreads-reorder.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
watchthreads-reorder.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
watchthreads.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
watchthreads.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
wp-replication.c Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00
wp-replication.exp Update copyright year range in all GDB files. 2019-01-01 10:01:51 +04:00