Consolidate code to enable optional FreeBSD native target event reporting.

Add a new function to enable optional event reporting for FreeBSD native
targets.  Specifically, use this to enable fork and LWP events.
The bodies of fbsd_enable_follow_fork and fbsd_enable_lwp_events have been
subsumed into the new function.  In addition, use the PT_GET_EVENT_MASK
and PT_EVENT_SET_MASK requests added in FreeBSD 12 when present to enable
these events.

gdb/ChangeLog:

	* fbsd-nat.c (fbsd_enable_lwp_events): Remove function.
	(fbsd_enable_proc_events): New function.
	(fbsd_enable_follow_fork): Remove function.
	(fbsd_post_startup_inferior): Use "fbsd_enable_proc_events".
	(fbsd_post_attach): Likewise.
This commit is contained in:
John Baldwin 2016-07-15 14:03:10 -07:00
parent 37fd5ef3ec
commit da95a26cc3
2 changed files with 36 additions and 31 deletions

View file

@ -1,3 +1,11 @@
2016-07-20 John Baldwin <jhb@FreeBSD.org>
* fbsd-nat.c (fbsd_enable_lwp_events): Remove function.
(fbsd_enable_proc_events): New function.
(fbsd_enable_follow_fork): Remove function.
(fbsd_post_startup_inferior): Use "fbsd_enable_proc_events".
(fbsd_post_attach): Likewise.
2016-07-15 John Baldwin <jhb@FreeBSD.org>
* common/signals.c (gdb_signal_from_host): Handle SIGLIBRT.

View file

@ -412,22 +412,43 @@ fbsd_thread_name (struct target_ops *self, struct thread_info *thr)
}
#endif
#ifdef PT_LWP_EVENTS
/* Enable LWP events for a specific process.
/* Enable additional event reporting on new processes.
To catch LWP events, PT_LWP_EVENTS is set on every traced process.
To catch fork events, PTRACE_FORK is set on every traced process
to enable stops on returns from fork or vfork. Note that both the
parent and child will always stop, even if system call stops are
not enabled.
To catch LWP events, PTRACE_EVENTS is set on every traced process.
This enables stops on the birth for new LWPs (excluding the "main" LWP)
and the death of LWPs (excluding the last LWP in a process). Note
that unlike fork events, the LWP that creates a new LWP does not
report an event. */
static void
fbsd_enable_lwp_events (pid_t pid)
fbsd_enable_proc_events (pid_t pid)
{
#ifdef PT_GET_EVENT_MASK
int events;
if (ptrace (PT_GET_EVENT_MASK, pid, (PTRACE_TYPE_ARG3)&events,
sizeof (events)) == -1)
perror_with_name (("ptrace"));
events |= PTRACE_FORK | PTRACE_LWP;
if (ptrace (PT_SET_EVENT_MASK, pid, (PTRACE_TYPE_ARG3)&events,
sizeof (events)) == -1)
perror_with_name (("ptrace"));
#else
#ifdef TDP_RFPPWAIT
if (ptrace (PT_FOLLOW_FORK, pid, (PTRACE_TYPE_ARG3)0, 1) == -1)
perror_with_name (("ptrace"));
#endif
#ifdef PT_LWP_EVENTS
if (ptrace (PT_LWP_EVENTS, pid, (PTRACE_TYPE_ARG3)0, 1) == -1)
perror_with_name (("ptrace"));
}
#endif
#endif
}
/* Add threads for any new LWPs in a process.
@ -957,20 +978,6 @@ fbsd_remove_vfork_catchpoint (struct target_ops *self, int pid)
{
return 0;
}
/* Enable fork tracing for a specific process.
To catch fork events, PT_FOLLOW_FORK is set on every traced process
to enable stops on returns from fork or vfork. Note that both the
parent and child will always stop, even if system call stops are
not enabled. */
static void
fbsd_enable_follow_fork (pid_t pid)
{
if (ptrace (PT_FOLLOW_FORK, pid, (PTRACE_TYPE_ARG3)0, 1) == -1)
perror_with_name (("ptrace"));
}
#endif
/* Implement the "to_post_startup_inferior" target_ops method. */
@ -978,12 +985,7 @@ fbsd_enable_follow_fork (pid_t pid)
static void
fbsd_post_startup_inferior (struct target_ops *self, ptid_t pid)
{
#ifdef TDP_RFPPWAIT
fbsd_enable_follow_fork (ptid_get_pid (pid));
#endif
#ifdef PT_LWP_EVENTS
fbsd_enable_lwp_events (ptid_get_pid (pid));
#endif
fbsd_enable_proc_events (ptid_get_pid (pid));
}
/* Implement the "to_post_attach" target_ops method. */
@ -991,12 +993,7 @@ fbsd_post_startup_inferior (struct target_ops *self, ptid_t pid)
static void
fbsd_post_attach (struct target_ops *self, int pid)
{
#ifdef TDP_RFPPWAIT
fbsd_enable_follow_fork (pid);
#endif
#ifdef PT_LWP_EVENTS
fbsd_enable_lwp_events (pid);
#endif
fbsd_enable_proc_events (pid);
fbsd_add_threads (pid);
}