Linux: No need to set ptrace event options in fork/clone children.
authorPedro Alves <palves@redhat.com>
Fri, 22 Mar 2013 14:52:26 +0000 (14:52 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 22 Mar 2013 14:52:26 +0000 (14:52 +0000)
Oleg Nesterov told me that the Linux kernel copies the parent's ptrace
options to fork/clone children, so there's no need for GDB to do that
manually.

I was actually a bit surprised, since I thought the ptracer had to
always set the ptrace options itself, and GDB is indeed calling
PTRACE_SETOPTIONS for each new fork child, if it'll stay attached.

Looking at the history of that code, I found that is was actually I
who added that set-ptrace-options-in-children bit, back in
http://sourceware.org/ml/gdb-patches/2009-05/msg00656.html.  But,
honestly, I don't recall why I needed that.  I think I may have just
blindly believed it was necessary.

I then looked back at the history of all the PTRACE_SETOPTIONS code we
have, and found that gdb never did copy the ptrace options before my
patch.  But, when gdbserver learnt to use PTRACE_EVENT_CLONE, at
http://sourceware.org/ml/gdb-patches/2007-10/msg00547.html, it was
made to do 'ptrace (PTRACE_SETOPTIONS, new_pid, 0,
PTRACE_O_TRACECLONE)' for all new clones.  Hmmm.  But, GDB itself
never did that, so it can't really ever have been necessary, I
believe, otherwise GDB should have been doing it too.

(GDBserver doesn't support following forks, and so naturally doesn't
do any PTRACE_SETOPTIONS on fork children.)

So this patch removes the -I believe- unnecessary ptrace syscalls.

Tested on x86_64 Fedora 17, native/gdbserver, and on x86_64 RHEL5
native/gdbserver (Linux 2.6.18, I think a ptrace-on-utrace kernel).
No regressions.

gdb/
2013-03-22  Pedro Alves  <palves@redhat.com>

* linux-nat.c (linux_child_follow_fork): Don't call
linux_enable_event_reporting.
(linux_handle_extended_wait): Don't call
linux_enable_event_reporting.

gdb/gdbserver/
2013-03-22  Pedro Alves  <palves@redhat.com>

* linux-low.c (handle_extended_wait): Don't call
linux_enable_event_reporting.

gdb/ChangeLog
gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c
gdb/linux-nat.c

index 7b5bb6c22ead5fe09bd4372a4f0745cf403231a2..13d061197ff5108b0ae9bcee7e2f746e156a2bde 100644 (file)
@@ -1,3 +1,10 @@
+2013-03-22  Pedro Alves  <palves@redhat.com>
+
+       * linux-nat.c (linux_child_follow_fork): Don't call
+       linux_enable_event_reporting.
+       (linux_handle_extended_wait): Don't call
+       linux_enable_event_reporting.
+
 2013-03-22  Pedro Alves  <palves@redhat.com>
 
        * hppa-hpux-tdep.c (hppa_hpux_push_dummy_code): Define INSN macro,
index 18355b4be7b060512c5968f113814e496763e570..b1f5f0f02ab1fe28de598e994d93959ab1abb6f3 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-22  Pedro Alves  <palves@redhat.com>
+
+       * linux-low.c (handle_extended_wait): Don't call
+       linux_enable_event_reporting.
+
 2013-03-15  Tony Theodore  <tonyt@logyst.com>
 
        PR build/9098:
index 523926d17907a78e833a984071973a0cafe9cf54..72c51e0e9cc3803edd38c926b6d3945009404b3d 100644 (file)
@@ -468,8 +468,6 @@ handle_extended_wait (struct lwp_info *event_child, int wstat)
            warning ("wait returned unexpected status 0x%x", status);
        }
 
-      linux_enable_event_reporting (new_pid);
-
       ptid = ptid_build (pid_of (event_child), new_pid, 0);
       new_lwp = (struct lwp_info *) add_lwp (ptid);
       add_thread (ptid, new_lwp);
index 3cbd126807e452d498af7ceb1cf335ea86634f74..5631e9ed635f1a1b3eb5f83de9c67d0bb6d98d78 100644 (file)
@@ -643,9 +643,6 @@ linux_child_follow_fork (struct target_ops *ops, int follow_child)
     parent_pid = ptid_get_pid (inferior_ptid);
   child_pid = PIDGET (inferior_thread ()->pending_follow.value.related_pid);
 
-  if (!detach_fork)
-    linux_enable_event_reporting (pid_to_ptid (child_pid));
-
   if (has_vforked
       && !non_stop /* Non-stop always resumes both branches.  */
       && (!target_is_async_p () || sync_execution)
@@ -2316,7 +2313,6 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
             this fork.  We're actually doing an infcall in
             linux-fork.c.  */
          ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
-         linux_enable_event_reporting (pid_to_ptid (new_pid));
 
          /* Report the stop to the core.  */
          return 0;