diff options
author | John Baldwin <jhb@FreeBSD.org> | 2015-04-18 01:00:06 -0400 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2015-04-27 19:27:04 -0400 |
commit | d2b41ca0f9c5641a6b8f42c8013ba042cf5ba120 (patch) | |
tree | e4ec6214fd0de8bd6da6e22dccc084f07dbc6161 /gdb | |
parent | e58e05d677d33da3646721bdd225ec6e90424000 (diff) | |
download | binutils-gdb-d2b41ca0f9c5641a6b8f42c8013ba042cf5ba120.tar.gz |
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".
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/fbsd-nat.c | 31 |
2 files changed, 41 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 220bc36da83..f21b3585f66 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 214f411c82c..066e2881837 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); } |