version 1.18, 2017/04/08 21:38:18
|
version 1.26, 2018/07/22 17:18:06
|
Line 12 DTrace is a work-in-progress effort and
|
Line 12 DTrace is a work-in-progress effort and
|
|
|
## 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 51 Set the system to load the solaris and d
|
Line 48 Set the system to load the solaris and d
|
|
|
For example, add the following to `/etc/modules.conf` (the file may not exist already on a system): |
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 85 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 105 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. |