aboutsummaryrefslogtreecommitdiff
path: root/gdb/nat/linux-ptrace.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@adacore.com>2014-11-11 10:07:21 +0400
committerJoel Brobecker <brobecker@adacore.com>2014-12-16 07:56:46 -0500
commitbeed38b8273fa18be574a7e84d5d2ee1f563ed48 (patch)
treeacb445cc66a01354c72052c9231042b0096e8f79 /gdb/nat/linux-ptrace.c
parentbf330350c212fb8880faab663f5b3565319d0a95 (diff)
downloadgdb-beed38b8273fa18be574a7e84d5d2ee1f563ed48.zip
gdb-beed38b8273fa18be574a7e84d5d2ee1f563ed48.tar.gz
gdb-beed38b8273fa18be574a7e84d5d2ee1f563ed48.tar.bz2
[Linux] Ask kernel to kill inferior when GDB terminates
This patch enhances GDB on GNU/Linux systems in the situation where we are debugging an inferior that was created from GDB (as opposed to attached to), by asking the kernel to kill the inferior if GDB terminates without doing it itself. This would typically happen when GDB encounters a problem and crashes, or when it gets killed by an external process. This can be observed by starting a program under GDB, and then killing GDB with signal 9. After GDB is killed, the inferior still remains. This patch also fixes GDBserver similarly. This fix is conditional on the kernel supporting the PTRACE_O_EXITKILL feature. On older kernels, the behavior remains unchanged. gdb/ChangeLog: * 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. gdb/gdbserver/ChangeLog: * linux-low.c (linux_low_filter_event): Update call to linux_enable_event_reporting following the addition of a new parameter to that function. Tested on x86_64-linux, native and native-gdbserver. I also verified by hand that the inferior gets killed when killing GDB in the "run" case, while the inferior remains in the "attach" case. Same for GDBserver.
Diffstat (limited to 'gdb/nat/linux-ptrace.c')
-rw-r--r--gdb/nat/linux-ptrace.c34
1 files changed, 31 insertions, 3 deletions
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. */