[PATCH v2 0/6] Support kernel-backed user threads on FreeBSD

John Baldwin
2016-01-13T21:46:31Z

This set of patches adds support for examining kernel-backed user threads on
FreeBSD. There is more history in a comment in fbsd-nat.c, but this target
uses ptrace directly (instead of libthread_db) to support the current
threading library (libthr) on FreeBSD which uses a kernel thread for each
user thread. Support for thread names in both core dumps (via FreeBSD's
OS-specific NT_THRMISC core note) and live is supported as is scheduler
locking. gcore generates register notes for each thread as well.

The first two patches are to binutils to support FreeBSD-specific core
notes. The last four are to GDB.

Changes since the first version are that ptids for fbsd-nat always include
an LWP. The default ptid for an inferior is changed to include the lwp
via thread_change_ptid() on the first stop in fbsd_wait().

I also changed the fork tracing to include the LWP of the new child process
in the ptid for the child from the start. I did not let the new child
"auto-discover" its LWP due to the following race:

The first stop of a new child process is not reported directly to the main
loop (it is reported instead via the 'related_pid' of the parent process
fork event). As such, there is no 'thread' in gdb yet whose ptid can be
updated to include the LWP when that first stop is reported. If the next
stop from the child process reports the birth of a new LWP, the existing
logic would have use that LWP to replace the sole thread and would not
include the "main" thread in the thread list. Rather than rescanning all
threads in that case, it seems simpler and more straightforward to simulate
the effect of thread_change_ptid() on the first child stop by reporting the
full ptid (including LWP) of the new child process in 'related_pid'.

John Baldwin (6):
Add support to readelf for reading FreeBSD ELF core notes.
Add a psuedosection for the NT_FREEBSD_THRMISC note.
Display per-thread information for threads in FreeBSD cores.
Use LWP IDs with ptrace register requests on FreeBSD.
Add support for LWP-based threads on FreeBSD.
Dump register notes for each thread when generating a FreeBSD core.

bfd/ChangeLog | 4 +
bfd/elf.c | 7 +
binutils/ChangeLog | 5 +
binutils/readelf.c | 35 +++++
gdb/ChangeLog | 71 +++++++++
gdb/amd64bsd-nat.c | 35 +++--
gdb/config.in | 3 +
gdb/configure | 16 ++
gdb/configure.ac | 7 +
gdb/fbsd-nat.c | 414 ++++++++++++++++++++++++++++++++++++++++++++++----
gdb/fbsd-tdep.c | 185 ++++++++++++++++++----
gdb/i386bsd-nat.c | 41 +++--
gdb/ppcfbsd-nat.c | 23 ++-
include/elf/ChangeLog | 27 ++++
include/elf/common.h | 14 ++
15 files changed, 797 insertions(+), 90 deletions(-)
create mode 100644 include/elf/ChangeLog

--
2.7.0