--- wikisrc/tutorials/how_to_enable_and_run_dtrace.mdwn 2011/11/20 20:55:21 1.1 +++ wikisrc/tutorials/how_to_enable_and_run_dtrace.mdwn 2012/02/05 07:14:36 1.2 @@ -1,104 +1,104 @@ -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://hub.opensolaris.org/bin/view/Community+Group+dtrace/WebHome) for more information. Also see [DTrace Introduction](http://wikis.sun.com/display/DTrace/Introduction). - - -DTrace is a work-in-progress effort and it is for i386 systems only. Two providers are available; the Statically Defined Tracing (SDT) provider and the Function Boundary Tracer (FBT) provider. - -You can currently run a hello world DScript. - -## 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. - +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://hub.opensolaris.org/bin/view/Community+Group+dtrace/WebHome) for more information. Also see [DTrace Introduction](http://wikis.sun.com/display/DTrace/Introduction). + + +DTrace is a work-in-progress effort and it is for i386 systems only. Two providers are available; the Statically Defined Tracing (SDT) provider and the Function Boundary Tracer (FBT) provider. + +You can currently run a hello world DScript. + +## 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. +