aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2015-04-18 01:00:06 -0400
committerJohn Baldwin <jhb@FreeBSD.org>2015-04-27 19:27:04 -0400
commitd2b41ca0f9c5641a6b8f42c8013ba042cf5ba120 (patch)
treee4ec6214fd0de8bd6da6e22dccc084f07dbc6161
parente58e05d677d33da3646721bdd225ec6e90424000 (diff)
downloadgdb-d2b41ca0f9c5641a6b8f42c8013ba042cf5ba120.zip
gdb-d2b41ca0f9c5641a6b8f42c8013ba042cf5ba120.tar.gz
gdb-d2b41ca0f9c5641a6b8f42c8013ba042cf5ba120.tar.bz2
Add support for catching exec events on FreeBSD.
FreeBSD kernels that support fork tracing always stop a process to report events for exec. Such a process will have the PL_FLAG_EXEC flag set in the pl_flags field of the ptrace_lwpinfo struct returned by PT_LWPINFO. The structure does not include the pathname passed to exec, so use fbsd_pid_to_exec_file to query the pathname of the process' executable. gdb/ChangeLog: * fbsd-nat.c: (fbsd_wait) [PL_FLAG_EXEC]: Report TARGET_WAITKIND_EXECD event if PL_FLAG_EXEC is set. [PL_FLAG_EXEC] (fbsd_insert_exec_catchpoint): New function. [PL_FLAG_EXEC] (fbsd_remove_exec_catchpoint): New function. (fbsd_nat_add_target) [PL_FLAG_EXEC]: Set "to_insert_exec_catchpoint" to "fbsd_insert_exec_catchpoint". Set "to_remove_exec_catchpoint" to "fbsd_remove_exec_catchpoint".
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/fbsd-nat.c31
2 files changed, 41 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 220bc36..f21b358 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,15 @@
2015-04-27 John Baldwin <jhb@FreeBSD.org>
+ * fbsd-nat.c: (fbsd_wait) [PL_FLAG_EXEC]: Report TARGET_WAITKIND_EXECD
+ event if PL_FLAG_EXEC is set.
+ [PL_FLAG_EXEC] (fbsd_insert_exec_catchpoint): New function.
+ [PL_FLAG_EXEC] (fbsd_remove_exec_catchpoint): New function.
+ (fbsd_nat_add_target) [PL_FLAG_EXEC]: Set
+ "to_insert_exec_catchpoint" to "fbsd_insert_exec_catchpoint".
+ Set "to_remove_exec_catchpoint" to "fbsd_remove_exec_catchpoint".
+
+2015-04-27 John Baldwin <jhb@FreeBSD.org>
+
* fbsd-nat.c: [PT_LWPINFO] New variable super_wait.
[TDP_RFPPWAIT] New variable fbsd_pending_children.
[TDP_RFPPWAIT] (fbsd_remember_child): New function.
diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c
index 214f411..066e288 100644
--- a/gdb/fbsd-nat.c
+++ b/gdb/fbsd-nat.c
@@ -376,6 +376,16 @@ fbsd_wait (struct target_ops *ops,
continue;
}
#endif
+
+#ifdef PL_FLAG_EXEC
+ if (pl.pl_flags & PL_FLAG_EXEC)
+ {
+ ourstatus->kind = TARGET_WAITKIND_EXECD;
+ ourstatus->value.execd_pathname
+ = xstrdup (fbsd_pid_to_exec_file (NULL, pid));
+ return wptid;
+ }
+#endif
}
return wptid;
}
@@ -458,6 +468,23 @@ fbsd_post_attach (struct target_ops *self, int pid)
fbsd_enable_follow_fork (pid);
}
#endif
+
+#ifdef PL_FLAG_EXEC
+/* If the FreeBSD kernel supports PL_FLAG_EXEC, then traced processes
+ will always stop after exec. */
+
+static int
+fbsd_insert_exec_catchpoint (struct target_ops *self, int pid)
+{
+ return 0;
+}
+
+static int
+fbsd_remove_exec_catchpoint (struct target_ops *self, int pid)
+{
+ return 0;
+}
+#endif
#endif
void
@@ -477,6 +504,10 @@ fbsd_nat_add_target (struct target_ops *t)
t->to_post_startup_inferior = fbsd_post_startup_inferior;
t->to_post_attach = fbsd_post_attach;
#endif
+#ifdef PL_FLAG_EXEC
+ t->to_insert_exec_catchpoint = fbsd_insert_exec_catchpoint;
+ t->to_remove_exec_catchpoint = fbsd_remove_exec_catchpoint;
+#endif
#endif
add_target (t);
}