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:
parent
37fd5ef3ec
commit
da95a26cc3
2 changed files with 36 additions and 31 deletions
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue