用一个例子来展示trace()
,print()
和printf()
的区别:
# dtrace -qn 'BEGIN{ trace(walltimestamp); exit(0) }'
1670295094532869758
# dtrace -qn 'BEGIN{ print(walltim[......]
用一个例子来展示trace()
,print()
和printf()
的区别:
# dtrace -qn 'BEGIN{ trace(walltimestamp); exit(0) }'
1670295094532869758
# dtrace -qn 'BEGIN{ print(walltim[......]
可以利用DTrace
的“-F
”选项显示函数之间的调用关系,这对分析代码来说是个绝对好用的工具。以下面脚本为例:
#!/usr/sbin/dtrace -Fs
pid$target:::entry,
pid$target:::return
{
}
syscall:::entry,[......]
由于DTrace probe
在操作系统的kernel
空间执行,所以不能直接访问进程user space
的内容。通常要使用copyin
、copyinstr
这些函数把进程user space
的内容copy
出来。如果程序里的变量是个二级指针,就要相对麻烦一些。以下面程序为例(编译成32
位的程序,所以指针用[……]
如果要追踪程序的链接库的probe
,可以参考下面这个例子:
bash-3.2# ldd ./exclude
libpthread.so.1 => /lib/libpthread.so.1
libodbc.so.2 => /usr/l[......]
CTF
(Compact C Type Format
)包含了下面信息:
a)所有类型和结构体的定义;
b)每个函数的参数和类型;
c)函数返回值的类型;
d)全局变量的类型。
因此如果有CTF
数据,就可以有args[]
变量信息。如何查看模块是否包含CTF数据?可以用以下命令:
bash[......]