OmniOS
上安装DTrace Toolkit
:
# pkg install toolkit
DTrace Toolkit
会被安装在/opt/DTT/
目录下。
OmniOS
上安装DTrace Toolkit
:
# pkg install toolkit
DTrace Toolkit
会被安装在/opt/DTT/
目录下。
在OmniOS
上使用DTrace
需要手动安装dtrace
和 dtrace/providers
安装包:
$ pfexec pkg install dtrace dtrace/providers
否则会遇到如下错误:
$ pfexec dtrace -n 'syscall:::'
dtrace: failed to initialize dtrace: DTrace device not available on system
此外还要检查DTrace
模块是否加载成功:
$ modinfo | grep dtrace
5 fffffffff8243000 1[......]
从Oracle
工程师Alan Coopersmith
的社交账号了解到,在最新的Oracle Solaris 11.4
中,DTrace
可以从DWARF
数据中获取函数信息了:
用户可以使用uresolve
选项指定用户地址空间(user address
)的格式。当uresolve=basename
时,可以把地址和源代码文件以及行号关联起来。这个功能要求在编译程序时指定-g
选项,只有这样才会产生DWARF
格式的调试信息。具体的描述请参考这里:https://docs.oracle.com/cd/E37838_01/html/E61035/gqsfh.html#scrolltoc。[……]
关于progenyof()
函数的介绍:
int progenyof(pid_t pid)
progenyof returns non-zero if the calling process (the process associated with the thread that is currently triggering the matched probe) is among the progeny of the specified process ID.
也就是当前触发probe
的进程是progenyof()
参数pid
的“子孙进程”,progenyof()
返回非0
值;反[……]
同Shell
脚本类似,DTrace
脚本也可以接收运行时参数:$0
扩展为脚本名,$1
扩展为第一个参数,$2
扩展为第二个。。。Macro Arguments文档提供了一个tracewrite.d
例子:
#!/usr/sbin/dtrace -s
syscall::write:entry
/pid == $1/
{
}
需要注意的是如果在脚本中使用了$1
,$2
这些参数,在执行脚本时一定要提供这些参数:
# ./tracewrite.d 123
否则直接运行脚本就会报出如下错误:
# ./tracewrite.d
dtrace: failed to compile sc[......]