| Index: gdb/inf-ttrace.c
|
| diff --git a/gdb/inf-ttrace.c b/gdb/inf-ttrace.c
|
| index 2c620d58fe5ba75365ff00de48e2f9a5c70c5829..eb0adcb2298c3de25167375bb31561a8433ac7af 100644
|
| --- a/gdb/inf-ttrace.c
|
| +++ b/gdb/inf-ttrace.c
|
| @@ -1,6 +1,6 @@
|
| /* Low-level child interface to ttrace.
|
|
|
| - Copyright (C) 2004-2012 Free Software Foundation, Inc.
|
| + Copyright (C) 2004-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -31,13 +31,14 @@
|
| #include "target.h"
|
|
|
| #include "gdb_assert.h"
|
| -#include "gdb_string.h"
|
| +#include <string.h>
|
| #include <sys/mman.h>
|
| #include <sys/ttrace.h>
|
| #include <signal.h>
|
|
|
| #include "inf-child.h"
|
| #include "inf-ttrace.h"
|
| +#include "common/filestuff.h"
|
|
|
|
|
|
|
| @@ -408,7 +409,8 @@ inf_ttrace_stopped_by_watchpoint (void)
|
| static pid_t inf_ttrace_vfork_ppid = -1;
|
|
|
| static int
|
| -inf_ttrace_follow_fork (struct target_ops *ops, int follow_child)
|
| +inf_ttrace_follow_fork (struct target_ops *ops, int follow_child,
|
| + int detach_fork)
|
| {
|
| pid_t pid, fpid;
|
| lwpid_t lwpid, flwpid;
|
| @@ -457,7 +459,7 @@ inf_ttrace_follow_fork (struct target_ops *ops, int follow_child)
|
| inf->pspace = parent_inf->pspace;
|
| inf->aspace = parent_inf->aspace;
|
| copy_terminal_info (inf, parent_inf);
|
| - detach_breakpoints (pid);
|
| + detach_breakpoints (ptid_build (pid, lwpid, 0));
|
|
|
| target_terminal_ours ();
|
| fprintf_unfiltered (gdb_stdlog,
|
| @@ -467,7 +469,11 @@ inf_ttrace_follow_fork (struct target_ops *ops, int follow_child)
|
| else
|
| {
|
| inferior_ptid = ptid_build (pid, lwpid, 0);
|
| - detach_breakpoints (fpid);
|
| + /* Detach any remaining breakpoints in the child. In the case
|
| + of fork events, we do not need to do this, because breakpoints
|
| + should have already been removed earlier. */
|
| + if (tts.tts_event == TTEVT_VFORK)
|
| + detach_breakpoints (ptid_build (fpid, flwpid, 0));
|
|
|
| target_terminal_ours ();
|
| fprintf_unfiltered (gdb_stdlog,
|
| @@ -554,6 +560,11 @@ do_cleanup_pfds (void *dummy)
|
| close (inf_ttrace_pfd1[1]);
|
| close (inf_ttrace_pfd2[0]);
|
| close (inf_ttrace_pfd2[1]);
|
| +
|
| + unmark_fd_no_cloexec (inf_ttrace_pfd1[0]);
|
| + unmark_fd_no_cloexec (inf_ttrace_pfd1[1]);
|
| + unmark_fd_no_cloexec (inf_ttrace_pfd2[0]);
|
| + unmark_fd_no_cloexec (inf_ttrace_pfd2[1]);
|
| }
|
|
|
| static void
|
| @@ -568,6 +579,11 @@ inf_ttrace_prepare (void)
|
| close (inf_ttrace_pfd2[0]);
|
| perror_with_name (("pipe"));
|
| }
|
| +
|
| + mark_fd_no_cloexec (inf_ttrace_pfd1[0]);
|
| + mark_fd_no_cloexec (inf_ttrace_pfd1[1]);
|
| + mark_fd_no_cloexec (inf_ttrace_pfd2[0]);
|
| + mark_fd_no_cloexec (inf_ttrace_pfd2[1]);
|
| }
|
|
|
| /* Prepare to be traced. */
|
| @@ -626,9 +642,6 @@ inf_ttrace_him (struct target_ops *ops, int pid)
|
|
|
| push_target (ops);
|
|
|
| - /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will
|
| - be 1 or 2 depending on whether we're starting without or with a
|
| - shell. */
|
| startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
|
|
|
| /* On some targets, there must be some explicit actions taken after
|
| @@ -785,7 +798,7 @@ inf_ttrace_attach (struct target_ops *ops, char *args, int from_tty)
|
| }
|
|
|
| static void
|
| -inf_ttrace_detach (struct target_ops *ops, char *args, int from_tty)
|
| +inf_ttrace_detach (struct target_ops *ops, const char *args, int from_tty)
|
| {
|
| pid_t pid = ptid_get_pid (inferior_ptid);
|
| int sig = 0;
|
|
|