Project News: DTrace
2012.12.17: DTrace 0.3.1
DTrace for Linux 0.3.1 is released.
This is a beta release and should not be used on production systems.
All RPMs are available on the Unbreakable Linux Network.
- kernel-uek-dtrace: the DTrace beta kernel. DTrace will not work unless this
kernel is running. (This was called kernel-uek in earlier DTrace releases,
but its name has changed to ensure that people not using DTrace do not
upgrade to it accidentally.)
- libdtrace-ctf: a modified, GPLed port of the Solaris libctf type-storage
library. Despite its name it cannot read Solaris CTF files: the file formats
- libdtrace-ctf-devel: development headers for libdtrace-ctf.
- dtrace-utils-devel: development headers for dtrace-utils: only necessary if
you want to write a new DTrace ocnsumer using libdtrace.
New userspace features:
- CTF support. This exposes all kernel types declared at the global scope to
DTrace scripts (even those private to single files). All global kernel
variables not declared static are also available to the ` operator as
The module for kernel-wide symbols is known as vmlinux, but genunix can
still be used as a name for it to aid script portability.
Kernel modules from a compatible kernel must be visible to DTrace for this
feature to work, as must the kernel-provided file /proc/kallmodsyms. DTrace
will work with no kernel modules, with no visible /proc, or with a kernel
whose modules do not contain type information, but no kernel types or
variables will be available. (See -xprocfspath and -xmodpath below.)
New kernel features:
- The curcpu builtin variable has been implemented as a DIF builtin variable
on Linux, providing a pointer to the CPU info structure for the CPU that is
- A new DIF subroutine has been implemented: d_path(). This subroutine takes
a pointer to a path structure as argument, and returns a string representing
the full pathname for that path.
- The raise() action has been implemented. This action allows a D script to
raise a signal in the current task.
- The io provider probes has been implemented. It provides the following SDT
probes: start, wait-start, wait-done, and done.
- The proc provider has been implemented. It provides the following SDT
probes: create, exec, exec-failure, exit, lwp-create, lwp-exit, lwp-start,
signal-clear, signal-discard, signal-handle, signal-send, start.
- The sched provider has been implemented. It provides the following SDT
probes: change-pri, dequeue, enqueue, off-cpu, on-cpu, preempt, remain-cpu,
sleep, surrender, tick, wakeup.
- Argument mappings have been provided for io, proc, and sched provider
probes. This information is used by userspace consumers.
- The kernel build process now generates CTF from kernel DWARF type information
using a new 'dwarf2ctf' utility in scripts/dwarf2ctf. The build process now
depends upon glib, zlib, elfutils and libdtrace-ctf development packages.
New userspace options:
- -xprocfspath: if set, specifies the path to /proc. May be useful in chroots,
though glibc and other things may break if /proc is moved to another
- -xmodpath: if set, specifies the path to kernel modules, rather than looking
in /lib/modules/$(uname -r).
- The undocumented -xlinkmode=primary option is removed: it never worked in
DTrace for Linux in any case.
- The -c and -p command-line options work.
- Lexer bugs causing aggressive and unnecessary reading of modules are fixed.
As a result, when used with typo-free scripts, DTrace now starts much faster
than ever it did on Solaris (often taking half the time or less). You may
find a few error messages have changed error text (though not error tag) as a
result of this bugfix and the following one.
- The SDT provider now describes its argument types to DTrace userspace.
- Supported SDT probes in non-text segments
- The types of many DTrace actions and variables are fixed to correspond to
the Linux reality.
- The set of available error numbers in errno.d is more complete.
- DTrace libraries are installed to /usr/lib64 now, not /usr/lib.
- Users of dtrace -C can now #include without incident.
- Various DIF builtin variables that were providing a hardcoded value based on
the init task whenever a probe was executing in interrupt context are now
providing the actual value from the current task. In Linux, there is always
a valid task structure available as 'current'.
- The numbering of the registers for the x86_64 architecture has been updated
to match the order of registers pushed onto the stack.
- It is now possible to get the correct value for the DS, ES, FS, and GS
- SDT probes are now correctly cleaned up when the SDT meta-provider module is
unloaded from the system.
- The rw_read_held() DIF subroutine will now verify whether it can safely
access the passed in argument based on the correct argument datatype.
Changes to user-visible internals:
- A new file /proc/kallmodsyms now exists, like /proc/kallsyms but giving
object sizes and listing the module each kernel object would be part of
were it built as a module, even if it is currently built in.
- A new module dtrace_ctf.ko is pulled in whenever dtrace.ko is loaded.
It is a container for type information.
- The undocumented -B buffer-inspection command-line option no longer crashes
- The invalid operand trap logic previously provided to support SDT probes has
been made more generic to support any probes that wish to utilise this