This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Add support for catching exec events on FreeBSD.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d2b41ca0f9c5641a6b8f42c8013ba042cf5ba120

commit d2b41ca0f9c5641a6b8f42c8013ba042cf5ba120
Author: John Baldwin <jhb@FreeBSD.org>
Date:   Sat Apr 18 01:00:06 2015 -0400

    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".

Diff:
---
 gdb/ChangeLog  | 10 ++++++++++
 gdb/fbsd-nat.c | 31 +++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)

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);
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]