version 1.15, 2017/03/22 15:43:09
|
version 1.26, 2018/07/22 17:18:06
|
Line 8 Also see [DTrace Introduction](http://dt
|
Line 8 Also see [DTrace Introduction](http://dt
|
DTrace is a work-in-progress effort and it is for x86 systems and some arm boards. |
DTrace is a work-in-progress effort and it is for x86 systems and some arm boards. |
|
|
* i386 and amd64 |
* i386 and amd64 |
* earm* (evbarm and armv4 based ports (armv4 side requires further testing but system is built with CTF) |
* earm* (evbarm and armv4 based ports) |
|
|
## Supported providers |
## Supported providers |
|
|
* SDT: Statically Defined Tracing |
* DTrace: What to do when a script BEGINs, ENDs, ERRORs |
* FBT: Function Boundary Tracing |
* FBT: Function Boundary Tracing |
|
* IO: Disk I/O |
* Lockstat: Kernel Lock Statistics |
* Lockstat: Kernel Lock Statistics |
|
* Proc: Process and thread related events |
* Profile: Time based interrupt event source for Profiling |
* Profile: Time based interrupt event source for Profiling |
|
* SDT: Statically Defined Tracing |
* Syscall: System Calls |
* Syscall: System Calls |
* Syscall Linux (32bit & 64 bit): System calls via the Linux binary emulation layer |
* Syscall Linux (32bit & 64 bit): System calls via the Linux binary emulation layer |
|
* VFS: Filesystem operations (confined to namecache events at time of writing - 8.99.22) |
|
|
## TODO for netbsd-7 |
## TODO for netbsd-7 |
|
|
Line 25 DTrace is a work-in-progress effort and
|
Line 29 DTrace is a work-in-progress effort and
|
* Determine whether the profile module works and list it here. |
* Determine whether the profile module works and list it here. |
* Integrate [[riz|users/riz]]'s syscall provider patch. |
* 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 |
# How to use |
|
|
## Building DTrace |
## Building DTrace |
Line 42 You need the following options in your k
|
Line 39 You need the following options in your k
|
options MODULAR |
options MODULAR |
|
|
Optionally: |
Optionally: |
|
|
options INSECURE # permit modules to loaded from user space once system has gone multiuser and securelevel has been raised. |
options INSECURE # permit modules to loaded from user space once system has gone multiuser and securelevel has been raised. |
|
|
A Distribution needs to be built with the options `MKDTRACE=yes` and `MKCTF=yes`, this is taken care of automatically and doesn't need to be specified manually. The list of platforms it is applied to automatically is set in `src/share/mk/bsd.own.mk` |
A Distribution needs to be built with the options `MKDTRACE=yes` and `MKCTF=yes`, this is taken care of automatically and doesn't need to be specified manually. The list of platforms it is applied to automatically is set in `src/share/mk/bsd.own.mk` |
|
|
Set the system to load the solaris and dtrace related modules in `/etc/modules.conf`, for a list of available modules, see `/stand/$MACHINE/$VERSION/modules/` |
Set the system to load the solaris and dtrace related modules in `/etc/modules.conf`, for a list of available modules, see `/stand/$MACHINE/$VERSION/modules/` |
|
|
|
For example, add the following to `/etc/modules.conf` (the file may not exist already on a system): |
|
|
solaris |
- `solaris` |
dtrace |
- `dtrace` |
dtrace_sdt |
- `dtrace_fbt` |
dtrace_fbt |
- `dtrace_lockstat` |
dtrace_lockstat |
- `dtrace_profile` |
dtrace_profile |
- `dtrace_sdt` |
dtrace_syscall |
- `dtrace_syscall` |
|
- `dtrace_syscall_linux` |
|
|
A `dtrace` device node is created automatically in `/dev/dtrace` when the modules are loaded into place. |
A `dtrace` device node is created automatically in `/dev/dtrace` when the modules are loaded into place. |
|
|
Line 82 List the dtrace probes
|
Line 83 List the dtrace probes
|
29141 proc lwp_exit |
29141 proc lwp_exit |
|
|
|
|
## Running hello world |
## Running hello world |
|
|
Put the following into the file hello.d: |
Put the following into the file hello.d: |
|
|
Line 102 Run the hello world script:
|
Line 103 Run the hello world script:
|
0 1 :BEGIN Hello world |
0 1 :BEGIN Hello world |
|
|
|
|
A more complex example that traces the execution of a sleep operation |
## A more complex example |
|
|
|
The following script traces the execution of a sleep operation |
in the kernel. Put it in sleep.d: |
in the kernel. Put it in sleep.d: |
|
|
#pragma D option flowindent |
#pragma D option flowindent |
|
|
fbt::syscall:entry |
syscall::nanosleep:entry |
/execname == "sleep" && guard++ == 0/ |
/execname == "sleep" && guard++ == 0/ |
{ |
{ |
self->traceme = 1; |
self->traceme = 1; |
printf("fd: %d", arg0); |
|
} |
} |
|
|
fbt::syscall:entry /self->traceme/ {} |
fbt::: |
|
/self->traceme/ |
fbt::syscall:return |
{} |
|
|
|
syscall::nanosleep:return |
/self->traceme/ |
/self->traceme/ |
{ |
{ |
self->traceme = 0; |
self->traceme = 0; |
exit(0); |
exit(0); |
} |
} |
|
|
|
|
Start the script running (dtrace -s sleep.d) and then execute a "sleep 2" in another shell. |
Start the script running: |
|
|
|
dtrace -s sleep.d |
|
|
|
This will take a while as the script instruments every function in the |
|
kernel. When it's ready, it will print a message like "dtrace: script |
|
'sleep.d' matched 59268 probes". Then execute a "sleep 2" in another |
|
shell. |
|
|
|
## Tools included in base |
|
|
|
Starting with NetBSD-8, on builds where `MKDTRACE=yes` is set, scripts from |
|
[Brendan Gregg's DTrace toolkit](https://github.com/opendtrace/toolkit/) are installed in base as standard. |
|
|
|
At present, the following scripts are installed in `/usr/sbin`: |
|
|
|
- `dtruss` - An implementation of the truss utility in DTrace which traces the system calls |
|
made by a process |
|
- `execsnoop` - snoop on execution of processes as they occur |
|
- `opensnoop` - snoop on openning of files as they occur |
|
- `procsystime` - print process system call time details. |