diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f3dc30c726..2fadb8cf39 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,19 @@ +2014-12-16 Joel Brobecker + + * nat/linux-ptrace.h (PTRACE_O_EXITKILL): Define if not + already defined. + (linux_enable_event_reporting): Add parameter "attached". + * nat/linux-ptrace.c (linux_test_for_exitkill): New forward + declaration. New function. + (linux_check_ptrace_features): Add linux_test_for_exitkill call. + (linux_enable_event_reporting): Add new parameter "attached". + Do not call ptrace with the PTRACE_O_EXITKILL if ATTACHED is + nonzero. + * linux-nat.c (linux_init_ptrace): Add parameter "attached". + Use it. Update function description. + (linux_child_post_attach, linux_child_post_startup_inferior): + Update call to linux_enable_event_reporting. + 2014-12-16 Yao Qi * NEWS: Move some entries to "Changes since GDB 7.8" section. diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 3269b3f014..a95bce547a 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2014-12-16 Joel Brobecker + + * linux-low.c (linux_low_filter_event): Update call to + linux_enable_event_reporting following the addition of + a new parameter to that function. + 2014-12-16 Catalin Udma PR server/17457 diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 5ea9200133..65f72a2dda 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -1878,7 +1878,9 @@ linux_low_filter_event (ptid_t filter_ptid, int lwpid, int wstat) if (WIFSTOPPED (wstat) && child->must_set_ptrace_flags) { - linux_enable_event_reporting (lwpid); + struct process_info *proc = find_process_pid (pid_of (thread)); + + linux_enable_event_reporting (lwpid, proc->attached); child->must_set_ptrace_flags = 0; } diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 29133f9465..845d56649d 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -321,25 +321,27 @@ pull_pid_from_list (struct simple_pid_list **listp, int pid, int *statusp) } /* Initialize ptrace warnings and check for supported ptrace - features given PID. */ + features given PID. + + ATTACHED should be nonzero iff we attached to the inferior. */ static void -linux_init_ptrace (pid_t pid) +linux_init_ptrace (pid_t pid, int attached) { - linux_enable_event_reporting (pid); + linux_enable_event_reporting (pid, attached); linux_ptrace_init_warnings (); } static void linux_child_post_attach (struct target_ops *self, int pid) { - linux_init_ptrace (pid); + linux_init_ptrace (pid, 1); } static void linux_child_post_startup_inferior (struct target_ops *self, ptid_t ptid) { - linux_init_ptrace (ptid_get_pid (ptid)); + linux_init_ptrace (ptid_get_pid (ptid), 0); } /* Return the number of known LWPs in the tgid given by PID. */ diff --git a/gdb/nat/linux-ptrace.c b/gdb/nat/linux-ptrace.c index 8bc3f1667a..a0e0c329b3 100644 --- a/gdb/nat/linux-ptrace.c +++ b/gdb/nat/linux-ptrace.c @@ -307,6 +307,7 @@ linux_child_function (gdb_byte *child_stack) static void linux_test_for_tracesysgood (int child_pid); static void linux_test_for_tracefork (int child_pid); +static void linux_test_for_exitkill (int child_pid); /* Determine ptrace features available on this target. */ @@ -338,6 +339,8 @@ linux_check_ptrace_features (void) linux_test_for_tracefork (child_pid); + linux_test_for_exitkill (child_pid); + /* Clean things up and kill any pending children. */ do { @@ -449,19 +452,44 @@ linux_test_for_tracefork (int child_pid) "(%d, status 0x%x)"), ret, status); } -/* Enable reporting of all currently supported ptrace events. */ +/* Determine if PTRACE_O_EXITKILL can be used. */ + +static void +linux_test_for_exitkill (int child_pid) +{ + int ret; + + ret = ptrace (PTRACE_SETOPTIONS, child_pid, (PTRACE_TYPE_ARG3) 0, + (PTRACE_TYPE_ARG4) PTRACE_O_EXITKILL); + + if (ret == 0) + current_ptrace_options |= PTRACE_O_EXITKILL; +} + +/* Enable reporting of all currently supported ptrace events. + ATTACHED should be nonzero if we have attached to the inferior. */ void -linux_enable_event_reporting (pid_t pid) +linux_enable_event_reporting (pid_t pid, int attached) { + int ptrace_options; + /* Check if we have initialized the ptrace features for this target. If not, do it now. */ if (current_ptrace_options == -1) linux_check_ptrace_features (); + ptrace_options = current_ptrace_options; + if (attached) + { + /* When attached to our inferior, we do not want the inferior + to die with us if we terminate unexpectedly. */ + ptrace_options &= ~PTRACE_O_EXITKILL; + } + /* Set the options. */ ptrace (PTRACE_SETOPTIONS, pid, (PTRACE_TYPE_ARG3) 0, - (PTRACE_TYPE_ARG4) (uintptr_t) current_ptrace_options); + (PTRACE_TYPE_ARG4) (uintptr_t) ptrace_options); } /* Disable reporting of all currently supported ptrace events. */ diff --git a/gdb/nat/linux-ptrace.h b/gdb/nat/linux-ptrace.h index 31a77cd958..588d38afb6 100644 --- a/gdb/nat/linux-ptrace.h +++ b/gdb/nat/linux-ptrace.h @@ -69,6 +69,11 @@ struct buffer; #endif /* PTRACE_EVENT_FORK */ +#ifndef PTRACE_O_EXITKILL +/* Only defined in Linux Kernel 3.8 or later. */ +#define PTRACE_O_EXITKILL 0x00100000 +#endif + #if (defined __bfin__ || defined __frv__ || defined __sh__) \ && !defined PTRACE_GETFDPIC #define PTRACE_GETFDPIC 31 @@ -85,7 +90,7 @@ struct buffer; extern void linux_ptrace_attach_fail_reason (pid_t pid, struct buffer *buffer); extern void linux_ptrace_init_warnings (void); -extern void linux_enable_event_reporting (pid_t pid); +extern void linux_enable_event_reporting (pid_t pid, int attached); extern void linux_disable_event_reporting (pid_t pid); extern int linux_supports_tracefork (void); extern int linux_supports_traceclone (void);