由于DTrace probe
在操作系统的kernel
空间执行,所以不能直接访问进程user space
的内容。通常要使用copyin
、copyinstr
这些函数把进程user space
的内容copy
出来。如果程序里的变量是个二级指针,就要相对麻烦一些。以下面程序为例(编译成32
位的程序,所以指针用[……]
DTrace tricks and tips (15) -通过二级指针访问内存的值
Leave a reply
由于DTrace probe
在操作系统的kernel
空间执行,所以不能直接访问进程user space
的内容。通常要使用copyin
、copyinstr
这些函数把进程user space
的内容copy
出来。如果程序里的变量是个二级指针,就要相对麻烦一些。以下面程序为例(编译成32
位的程序,所以指针用[……]
filebyproc.d
位于DTraceToolkit的Proc
文件夹下,其功能是打印进程打开的文件名。脚本代码就一行(略去版权信息):
syscall::open*:entry { printf("%s %s", execname, copyinstr(arg0)); }
脚本代码分析[……]
kill.d
位于DTraceToolkit的Proc
文件夹下,其功能是检查进程之间发送的信号值,以及信号发送是否成功。脚本代码如下(略去版权信息):
dtrace:::BEGIN
{
/* Print header */
printf("%5s %12s %5s %-6s[......]
如果要追踪程序的链接库的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[......]