[Patch 00/16 v2] Linux extended-remote fork and exec events

Don Breazeal
2014-08-21T00:29:44Z

This is an update to the patch series implementing fork events for
extended-remote Linux targets. Changes from the previous version:

* Exec Events: integrated the previous patch series that implemented exec
events for extended-remote Linux targets. The exec patches had
significant overlap with the fork event patch series, and it no longer
made sense to maintain them separately.

* Exec Catchpoints: the previous exec event patch series did not
implement 'catch exec'. That is included here.

* GDBserver Extended Feature Query: patch 4 has been completely rewritten.
The previous version attempted to determine whether extended events
were supported by gdbserver using information only on the host. This
approach was flawed and did not work at all once follow-exec was
introduced. This mechanism now uses an new RSP message to determine
which extended events are supported prior to attempting any activity
that would require that support. There is more detail in the patch
4 description.

* Coding Style: fixed a number of coding style violations.

* Line Breaks in Descriptions: formatted the patch descriptions with line
breaks in each paragraph, which might make them more accessible via
web pages.

Maintainers may find it useful to consider this patch series as having
three parts:

1) Patches 1-3: these refactor existing code without making any
significant functional changes (aside from some new verbose
messages).

2) Patches 4-10: these implement all the fork event functionality.

3) Patches 11-16: these implement all the exec event functionality.

Dividing it like this may help make the large size of the patch series
more manageable. Again, please let me know if there is anything I can do
to make this easier to review.

Eli approved patches 10 and 15 when they were posted previously. The only
changes to these patches since then were those that he requested.

====================================================================

This patch series implements fork and exec events for extended-remote linux
targets. Features that are enabled include:

* follow-fork-mode
* detach-on-fork
* follow-exec-mode
* catch fork/vfork/exec

This work addresses PR gdb/13584, and is part of the local/remote debugging
feature parity project
(https://sourceware.org/gdb/wiki/LocalRemoteFeatureParity).

My final test results showed the following changes:

* native: PASS +46
- this is due the addition of non-stop mode tests to
gdb.threads/non-ldr-exc-*.exp.

* remote: no change

* extended-remote: PASS: +329, FAIL: -134, KFAIL: +1,
UNTESTED: +8, UNSUPPORTED: -6

Some items to note about the extended-remote results:

- there are some extended-remote failures in
gdb.base/disp-step-syscall.exp that don't show up in the unmodified
version on the native target. Investigation shows that these tests
are producing a bogus PASS result on the native target. I did not
pursue this further.

- the new non-stop tests in gdb.threads/non-ldr-exc-*.exp give an
UNTESTED result for extended-remote. This is due to an RSP
error in non-stop mode when running to main. I spent some time
investigating this and concluded that I should leave it alone for now,
for fear of having an ever-growing, never-ending project. My plan is
to track this with a bug report once that is appropriate.

- gdb.threads/thread-execl.exp gives a couple of failures related to
scheduler locking. As with the previous item, after spending some
time on this I concluded that pursuing it further now would be
feature-creep, and that this should be tracked with a bug report.

- gdb.trace/tspeed.exp got some timeout failures one time, but I
was unable to reproduce it. I'm unsure whether this is significant.

I can provide test logs or .sum diffs if anybody is interested in
specifics.

The contents of the patch series are as follows:

Patch 1: refactor native follow-fork implementation to move
target-independent code from target-dependent file (linux-nat.c)
to make it useful for extended-remote targets.

Patch 2: encapsulate the code used to print verbose/debug messages
related to folow-fork into functions, and add a message in one case.
Also make messages distinguish between fork and vfork.

Patch 3: encapsulate code that identifies and extracts extended
ptrace events found in the Linux wait status into functions, and call
them everywhere that the hard-coded wait status processing was used.

Patch 4: implements a mechanism for determining what extended-mode
features gdbserver supports. There are several issues that this addresses,
which are detailed in the patch 4 description. Basically, the patch
implements a new RSP packet "qExtendedFeatures" that allows GDB to ask
gdbserver for the list of extended features that are enabled prior to
doing anything that would require such a feature. In gdbserver, it splits
checking whether the OS supports the features from actually enabling
them, and enables them only when it is clear that extended mode is
active. To facilitate this the patch also extends the changes that Gary
Benson implemented to reduce the use of #ifdef GDBSERVER in linux-ptrace.c
here:
https://support urceware.org/ml/gdb-patches/2014-07/msg00633.html.

Patch 5: implements some functions to clone the breakpoint lists in
gdbserver. These are needed because in gdbserver, each process maintains a
separate breakpoint list. When a fork occurs, the child process needs a
copy of the parent's breakpoint list so that it can manage the breakpoints
using existing mechanisms in gdbserver.

Patch 6: implements follow-fork, but only for 'fork', not 'vfork'. I split
these apart in an attempt to keep the size of the patches down to a
reviewable size.

Patch 7: adds the architecture-specific pieces of follow-fork. This is the
mechanism that handles copying the debug register state from the parent to
the child.

Patch 8: adds follow-fork for vfork.

Patch 9: adds 'catch fork' and 'catch vfork', along with some code to make
sure that killing a process that has forked, but before the fork is
followed, also kills the child process.

Patch 10: implements changes to the manual and the NEWS file for the fork
event changes.

Patch 11: implements support for the extended ptrace event
PTRACE_EVENT_EXIT, which is a prerequisite for the exec event support.

Patch 12: implements exec event support and follow-exec.

Patch 13: implements exec catchpoints.

Patch 14: suppresses some spurious warnings that were generated after
an exec. These warnings were caused when gdbserver attempted to check
the version number from the r_debug structure in the new image before
the structure had been initialized.

Patch 15: implements changed to the manual and NEWS file for the exec
event changes.

Patch 16: changes how gdb.base/foll-exec.exp starts GDB and loads the
program so that it will work with extended-remote. It also extends the
tests gdb.threads/non-ldr-exc-[1-4].exp to test in non-stop mode as well as
in all-stop mode.

thanks
--Don

gdb/NEWS | 18 +
gdb/doc/gdb.texinfo | 42 ++-
gdb/gdbserver/gdbthread.h | 5 +
gdb/gdbserver/linux-aarch64-low.c | 28 ++
gdb/gdbserver/linux-arm-low.c | 26 +
gdb/gdbserver/linux-low.c | 511 +++++++++++++++++++--
gdb/gdbserver/linux-low.h | 8 +
gdb/gdbserver/linux-mips-low.c | 76 +++-
gdb/gdbserver/linux-x86-low.c | 29 ++
gdb/gdbserver/lynx-low.c | 4 +
gdb/gdbserver/mem-break.c | 104 +++++
gdb/gdbserver/mem-break.h | 6 +
gdb/gdbserver/nto-low.c | 4 +
gdb/gdbserver/remote-utils.c | 45 ++-
gdb/gdbserver/server.c | 92 ++++
gdb/gdbserver/server.h | 3 +
gdb/gdbserver/spu-low.c | 4 +
gdb/gdbserver/target.h | 33 ++
gdb/gdbserver/win32-low.c | 4 +
gdb/infrun.c | 296 +++++++++++-
gdb/infrun.h | 2 -
gdb/linux-nat.c | 264 ++----------
gdb/nat/linux-procfs.c | 18 +
gdb/nat/linux-procfs.h | 4 +
gdb/nat/linux-ptrace.c | 150 +++++--
gdb/nat/linux-ptrace.h | 10 +-
gdb/remote.c | 337 +++++++++++++--
gdb/testsuite/gdb.base/foll-exec.exp | 44 +--
gdb/testsuite/gdb.base/foll-fork.exp | 12 +-
gdb/testsuite/gdb.base/foll-vfork.exp | 8 +-
gdb/testsuite/gdb.threads/fork-thread-pending.exp | 23 +-
gdb/testsuite/gdb.threads/non-ldr-exc-1.exp | 20 +-
gdb/testsuite/gdb.threads/non-ldr-exc-2.exp | 36 ++-
gdb/testsuite/gdb.threads/non-ldr-exc-3.exp | 36 ++-
gdb/testsuite/gdb.threads/non-ldr-exc-4.exp | 20 +-
35 files changed, 1891 insertions(+), 431 deletions(-)