From: John Baldwin <jhb@FreeBSD.org>
To: gdb-patches@sourceware.org
Subject: [PATCH 1/3] Consolidate code to enable optional FreeBSD native target event reporting.
Date: Mon, 18 Jul 2016 14:58:00 -0000 [thread overview]
Message-ID: <20160718145759.58543-2-jhb@FreeBSD.org> (raw)
In-Reply-To: <20160718145759.58543-1-jhb@FreeBSD.org>
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.
---
gdb/ChangeLog | 8 ++++++++
gdb/fbsd-nat.c | 59 ++++++++++++++++++++++++++++------------------------------
2 files changed, 36 insertions(+), 31 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6c187dc..dcedc14 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
2016-07-15 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.
(do_gdb_signal_to_host): Likewise.
* infrun.c (_initialize_infrun): Pass GDB_SIGNAL_LIBRT through to
diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c
index fa9516e..508ab19 100644
--- a/gdb/fbsd-nat.c
+++ b/gdb/fbsd-nat.c
@@ -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);
}
--
2.8.4
next prev parent reply other threads:[~2016-07-18 14:58 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-18 14:58 [PATCH 0/3] Add "real" vfork done handling on FreeBSD John Baldwin
2016-07-18 14:58 ` John Baldwin [this message]
2016-07-18 14:58 ` [PATCH 2/3] Enable ptrace events on new child processes John Baldwin
2016-07-18 14:58 ` [PATCH 3/3] Use a real vfork done event on FreeBSD when available John Baldwin
2016-07-19 18:44 ` [PATCH 0/3] Add "real" vfork done handling on FreeBSD Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160718145759.58543-2-jhb@FreeBSD.org \
--to=jhb@freebsd.org \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox