aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog16
-rw-r--r--gdb/gdbserver/ChangeLog6
-rw-r--r--gdb/gdbserver/linux-low.c4
-rw-r--r--gdb/linux-nat.c12
-rw-r--r--gdb/nat/linux-ptrace.c34
-rw-r--r--gdb/nat/linux-ptrace.h7
6 files changed, 69 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f3dc30c..2fadb8c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,19 @@
+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.
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 3269b3f..a95bce5 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,9 @@
+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
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 5ea9200..65f72a2 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 29133f9..845d566 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 8bc3f16..a0e0c32 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 31a77cd..588d38a 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);