Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Pedro Alves <pedro@codesourcery.com>
To: gdb-patches@sourceware.org
Subject: Refuse following the vfork parent if not letting the child run.
Date: Mon, 08 Jun 2009 13:30:00 -0000	[thread overview]
Message-ID: <200906081431.38913.pedro@codesourcery.com> (raw)

If you try to follow a vfork parent, without letting the
child run, GDB hangs.  E.g., gdb 6.8 or head:

 >gdb-6.8 ./testsuite/gdb.base/foll-vfork
 :
 (gdb) set detach-on-fork off
 (gdb) start
 Breakpoint 1 at 0x4005c0: file ../../../src/gdb/testsuite/gdb.base/foll-vfork.c, line 12.
 Starting program: /home/pedro/gdb/sspaces/build/gdb/testsuite/gdb.base/foll-vfork
 main () at ../../../src/gdb/testsuite/gdb.base/foll-vfork.c:12
 12        pid = vfork ();
 (gdb) c
 Continuing.
 <HANG>

No amount of ctrl-c will let you out of this.  Only going to another
terminal and killing gdb bails you out.

I've been keeping the patch below locally to prevent
getting myself in such situation.  (GNU make uses vfork, and much of
my multi-process testing involves running make.  How convenient :-) )

The manual already mentions that you can't debug the vfork parent
until the child execs in the forks section.

Comments?  (This applies on top the the patch that adds the
option to resume all threads of all processes.)

A patched GDB shows this:

 (gdb) set detach-on-fork off
 (gdb) start
 Temporary breakpoint 1 at 0x4005c0: file ../../../src/gdb/testsuite/gdb.base/foll-vfork.c, line 12.
 Starting program: /home/pedro/gdb/sspaces/build/gdb/testsuite/gdb.base/foll-vfork

 Temporary breakpoint 1, main () at ../../../src/gdb/testsuite/gdb.base/foll-vfork.c:12
 12        pid = vfork ();
 (gdb) n
 warning: Can not debug the parent of a vfork in the foreground if not letting
 the child run until it execs or exits, as it would deadlock the terminal.
 0x00007ffff789aee4 in vfork () from /lib/libc.so.6
 (gdb)      

-- 
Pedro Alves

2009-06-08  Pedro Alves  <pedro@codesourcery.com>

	* linux-nat.c (linux_child_follow_fork): Refuse to follow a vfork
	parent in the foreground if not letting the child run.

---
 gdb/linux-nat.c |   15 +++++++++++++++
 1 file changed, 15 insertions(+)

Index: src/gdb/linux-nat.c
===================================================================
--- src.orig/gdb/linux-nat.c	2009-06-08 13:22:47.000000000 +0100
+++ src/gdb/linux-nat.c	2009-06-08 14:27:05.000000000 +0100
@@ -596,6 +596,21 @@ linux_child_follow_fork (struct target_o
   if (!detach_fork)
     linux_enable_event_reporting (pid_to_ptid (child_pid));
 
+  if (has_vforked
+      && (!target_is_async_p () || sync_execution)
+      && !(follow_child || detach_fork || sched_multi))
+    {
+      /* The parent stays blocked inside the vfork syscall until the
+	 child execs or exits.  If we don't let the child run, then
+	 the parent stays blocked.  If we're telling the parent to run
+	 in the foreground, the user will not be able to ctrl-c to get
+	 back the terminal, effectively hanging the debug session.  */
+      warning (_("\
+Can not debug the parent of a vfork in the foreground if not letting \
+the child run until it execs or exits, as it would deadlock the terminal."));
+      return 1;
+    }
+
   if (! follow_child)
     {
       /* We're already attached to the parent, by default. */


             reply	other threads:[~2009-06-08 13:30 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-08 13:30 Pedro Alves [this message]
2009-06-08 14:31 ` Daniel Jacobowitz
2009-06-08 14:39   ` Pedro Alves
2009-06-08 15:03     ` Pedro Alves
2009-06-08 15:43       ` Daniel Jacobowitz
2009-06-08 17:44         ` Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200906081431.38913.pedro@codesourcery.com \
    --to=pedro@codesourcery.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox