Chapter 13
Speculative Tracing
This chapter discusses the DTrace facility for speculative tracing, the ability to tentatively
trace data and then later decide whether to commit the data to a
tracing buffer or discard it. In DTrace, the primary mechanism for filtering out uninteresting
events is the predicate mechanism, discussed in Chapter 4, D Program Structure. Predicates are useful when you know
at the time that a probe fires whether or not the probe event
is of interest. For example, if you are only interested in activity associated
with a certain process or a certain file descriptor, you know when the
probe fires if it is associated with the process or file descriptor of
interest. However, in other situations, you might not know whether a given probe
event is of interest until some time after the probe fires.
For example, if a system call is occasionally failing with a common error
code (for example, EIO or EINVAL), you might want to examine the code
path leading to the error condition. To capture the code path, you could
enable every probe — but only if the failing call can be isolated
in such a way that a meaningful predicate can be constructed. If the
failures are sporadic or nondeterministic, you would be forced to trace all events
that might be interesting, and later postprocess the data to filter out the
ones that were not associated with the failing code path. In this case,
even though the number of interesting events may be reasonably small, the number
of events that must be traced is very large, making postprocessing difficult.
You can use the speculative tracing facility in these situations to tentatively trace
data at one or more probe locations, and then decide to commit the
data to the principal buffer at another probe location. As a result, your
trace data contains only the output of interest, no postprocessing is required, and
the DTrace overhead is minimized.