====== Adding DTrace support to the kernel ====== **Note**: as of May 2012, DTrace support is enabled by default in GENERIC, and the steps below are not needed. If you are using a custom kernel config, make sure that all the lines below are present. - Enable building of debug symbols makeoptions DEBUG="-g" # build kernel with gdb(1) debug symbols - For %%FreeBSD%% versions **earlier than 10.0**, add: options KDTRACE_HOOKS # all architectures - enable general DTrace hooks options DDB_CTF # all architectures - kernel ELF linker loads CTF data - For **AMD64** (all versions), add: options KDTRACE_FRAME # amd64 - ensure frames are compiled in - For %%FreeBSD%% **9.0 or later**, WITH_CTF=1 must be defined in the kernel config: makeoptions WITH_CTF=1 **Note**: It will **not** be picked up from make.conf or src.conf for the kernel build. ===== Rebuild and install the kernel ===== - For %%FreeBSD%% 9 or later make buildkernel KERNCONF=DTRACE - For %%FreeBSD%% 8-STABLE or earlier make buildkernel WITH_CTF=1 KERNCONF=DTRACE - Install the kernel and reboot make installkernel KERNCONF=DTRACE shutdown -r now ===== Getting Started ===== **Note**: You'll need to su to root in order to use DTrace, which may be fixed once we add a more comprehensive fine-grained privilege policy. - Load some or all DTrace kernel modules: kldload dtraceall - Confirm that you have piles of available DTrace hooks: dtrace -l | head - Confirm that the kernel was compiled correctly with tracing by running a DTrace one liner. dtrace -n 'syscall:::entry { @num[execname] = count(); }' If you see an error stemming from one of the DTrace files in /usr/lib, such as this: dtrace: invalid probe specifier syscall:::entry { @num[execname] = count(); }: "/usr/lib/dtrace/psinfo.d", line 37: failed to copy type of 'pr_uid': Type information is in parent and unavailable then you do not have DTrace properly compiled in. Go back and check your work. ===== Userland DTrace ===== ==== FreeBSD 9.0 or later ==== - For userland DTrace support add the following to your make.conf (or src.conf if you want it just for the base system): STRIP= CFLAGS+=-fno-omit-frame-pointer This allows stack traces to work and display even more information. - Rebuild and install world with 'WITH_CTF=1' in either make.conf (if you also want to have it for ports) or src.conf: make buildworld shutdown -r NOW boot -s make installworld reboot ==== FreeBSD 8-STABLE or earlier ==== - For userland DTrace support add the following to your make.conf: STRIP= CFLAGS+=-fno-omit-frame-pointer This allows stack traces to work and display even more information. - Rebuild and install world: make WITH_CTF=1 buildworld shutdown -r NOW boot -s make installworld ===== Hints ===== * If you get the following error during buildworld **make: don't know how to make /usr/lib/libctf.a. Stop**, then your current world is missing CDDL support. Comment out any WITHOUT_CDDL= entries in your make.conf and src.conf. Then do **cd /usr/src/cddl/lib/libctf; make obj depend all install**. Now you should be able to compile world with DTrace support. (Thanks Rob) * If D-scripts fail with a message such as **syntax error "near uid_t"**, then you forgot to compile your kernel with gdb(1) debug symbols enabled. Add **makeoptions DEBUG="-g"** to your kernel config and try again. * If you are setting MODULES_OVERRIDE in your make.conf in order not to build all kernel modules, adding the following entries should give you dtrace support: **"MODULES_OVERRIDE += opensolaris dtrace cyclic nfsclient krpc nfs_common nfslock**" ---- {{tag>Dtrace Historical}}