DTrace is a Dynamic Tracing framework developed by Sun and ported to NetBSD. It enables extensive instrumentation of the kernel and user space. See the [DTrace Community Page](http://dtrace.org) for more information. Also see [DTrace Introduction](http://dtrace.org/guide/preface.html). # Current status ## Supported platforms DTrace is a work-in-progress effort and it is for x86 systems and some arm boards. * i386 and amd64 * evbarm * BEAGLEBONE and SHEEVAPLUG ## Supported providers * SDT: Statically Defined Tracing * FBT: Function Boundary Tracing You can currently run a hello world DScript. ## TODO for netbsd-7 * Rename provider modules to `dtrace_*.kmod`: `dtrace_fbt.kmod`, &c. * Measure effect of `options KDTRACE_HOOKS` on system performance. * Determine whether the profile module works and list it here. * Put a dtrace target in /dev/MAKEDEV. * Integrate [[riz|users/riz]]'s syscall provider patch. ## TODO for netbsd-6 Need to identify changes to pull up to netbsd-6 and pull them up. Candidates: * Profile provider. # How to use ## Building DTrace You need the following options in your kernel: options INSECURE options KDTRACE_HOOKS # DTrace support options MODULAR You also need to build distribution with the options MKMODULAR=yes and MKDTRACE=yes. ## Running hello world Load the solaris and dtrace modules, and the SDT (Statically Defined Tracing) and FBT (Function Boundary Tracing) modules: modload solaris modload dtrace modload sdt modload fbt Make the dtrace device node: mkdir /dev/dtrace mknod /dev/dtrace/dtrace c dtrace 0 List the dtrace probes dtrace -l ID PROVIDER MODULE FUNCTION NAME 1 dtrace BEGIN 2 dtrace END 3 dtrace ERROR 4 fbt netbsd AcpiAcquireGlobalLock entry 5 fbt netbsd AcpiAcquireGlobalLock return 6 fbt netbsd AcpiAllocateRootTable entry 7 fbt netbsd AcpiAttachData entry . . 29129 fbt solaris zfs_vop_getattr entry 29130 fbt solaris zfs_vop_getattr return 29131 proc create 29132 proc exec . . 29140 proc lwp_start 29141 proc lwp_exit Put the following into the file hello.d BEGIN { trace("Hello world"); exit(0); } Run the hello world script: dtrace -s hello.d dtrace: script './hello.d' matched 1 probe CPU ID FUNCTION:NAME 0 1 :BEGIN Hello world A more complex example that traces the execution of a sleep operation in the kernel: #pragma D option flowindent fbt::syscall:entry /execname == "sleep" && guard++ == 0/ { self->traceme = 1; printf("fd: %d", arg0); } fbt::: /self->traceme/ {} fbt::syscall:return /self->traceme/ { self->traceme = 0; exit(0); } Start the script running (dtrace -s ) and then execute a sleep 2 in another shell.