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>
|
2016-07-15 John Baldwin <jhb@FreeBSD.org>
|
||||||
|
|
||||||
* common/signals.c (gdb_signal_from_host): Handle SIGLIBRT.
|
* 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
|
#endif
|
||||||
|
|
||||||
#ifdef PT_LWP_EVENTS
|
/* Enable additional event reporting on new processes.
|
||||||
/* Enable LWP events for a specific process.
|
|
||||||
|
|
||||||
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)
|
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
|
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
|
that unlike fork events, the LWP that creates a new LWP does not
|
||||||
report an event. */
|
report an event. */
|
||||||
|
|
||||||
static void
|
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)
|
if (ptrace (PT_LWP_EVENTS, pid, (PTRACE_TYPE_ARG3)0, 1) == -1)
|
||||||
perror_with_name (("ptrace"));
|
perror_with_name (("ptrace"));
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* Add threads for any new LWPs in a process.
|
/* 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;
|
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
|
#endif
|
||||||
|
|
||||||
/* Implement the "to_post_startup_inferior" target_ops method. */
|
/* Implement the "to_post_startup_inferior" target_ops method. */
|
||||||
|
@ -978,12 +985,7 @@ fbsd_enable_follow_fork (pid_t pid)
|
||||||
static void
|
static void
|
||||||
fbsd_post_startup_inferior (struct target_ops *self, ptid_t pid)
|
fbsd_post_startup_inferior (struct target_ops *self, ptid_t pid)
|
||||||
{
|
{
|
||||||
#ifdef TDP_RFPPWAIT
|
fbsd_enable_proc_events (ptid_get_pid (pid));
|
||||||
fbsd_enable_follow_fork (ptid_get_pid (pid));
|
|
||||||
#endif
|
|
||||||
#ifdef PT_LWP_EVENTS
|
|
||||||
fbsd_enable_lwp_events (ptid_get_pid (pid));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Implement the "to_post_attach" target_ops method. */
|
/* 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
|
static void
|
||||||
fbsd_post_attach (struct target_ops *self, int pid)
|
fbsd_post_attach (struct target_ops *self, int pid)
|
||||||
{
|
{
|
||||||
#ifdef TDP_RFPPWAIT
|
fbsd_enable_proc_events (pid);
|
||||||
fbsd_enable_follow_fork (pid);
|
|
||||||
#endif
|
|
||||||
#ifdef PT_LWP_EVENTS
|
|
||||||
fbsd_enable_lwp_events (pid);
|
|
||||||
#endif
|
|
||||||
fbsd_add_threads (pid);
|
fbsd_add_threads (pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue