Tracing Arbitrary Instructions
You can use the pid
provider to trace any instruction in any user function. Upon demand, the pid
provider will create a probe for every instruction in a function. The name of each probe is the offset of its corresponding instruction in the function expressed as a hexadecimal integer. For example, to enable a probe associated with the instruction at offset 0x1c in function foo
of module bar.so
in the process with PID 123, you can use the following command:
# dtrace -n pid123:bar.so:foo:1c
To enable all of the probes in the function foo
, including the probe for each instruction, you can use the following command:
# dtrace -n pid123:bar.so:foo:
This command demonstrates an extremely powerful technique for debugging and analyzing user applications. Infrequent errors can be difficult to debug because they can be difficult to reproduce. Often, you can identify a problem after the failure has occurred, too late to reconstruct the code path. The following example demonstrates how to combine the pid
provider with speculative tracing to solve this problem by tracing every instruction in a function. For more information about speculative tracing, see Speculative Tracing in DTrace.
Example 12-2 Tracing User Function Call Error Path With errorpath.d
pid$1::$2:entry { self->spec = speculation(); speculate(self->spec); printf("%x %x %x %x %x", arg0, arg1, arg2, arg3, arg4); } pid$1::$2: /self->spec/ { speculate(self->spec); } pid$1::$2:return /self->spec && arg1 == 0/ { discard(self->spec); self->spec = 0; } pid$1::$2:return /self->spec && arg1 != 0/ { commit(self->spec); self->spec = 0; }
Executing errorpath.d
results in output similar to the following example:
# ./errorpath.d 100461 _chdir
dtrace: script './errorpath.d' matched 19 probes
CPU ID FUNCTION:NAME
0 25253 _chdir:entry 81e08 6d140 ffbfcb20 656c73 0
0 25253 _chdir:entry
0 25269 _chdir:0
0 25270 _chdir:4
0 25271 _chdir:8
0 25272 _chdir:c
0 25273 _chdir:10
0 25274 _chdir:14
0 25275 _chdir:18
0 25276 _chdir:1c
0 25277 _chdir:20
0 25278 _chdir:24
0 25279 _chdir:28
0 25280 _chdir:2c
0 25268 _chdir:return