+2014-12-16 Joel Brobecker <brobecker@adacore.com>
+
+ * 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 <yao@codesourcery.com>
* NEWS: Move some entries to "Changes since GDB 7.8" section.
+2014-12-16 Joel Brobecker <brobecker@adacore.com>
+
+ * 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 <catalin.udma@freescale.com>
PR server/17457
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;
}
}
/* 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. */
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. */
linux_test_for_tracefork (child_pid);
+ linux_test_for_exitkill (child_pid);
+
/* Clean things up and kill any pending children. */
do
{
"(%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. */
#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
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);