在使用DTrace时,可以通过uregs[]数组访问具体的寄存器。关于各个寄存器的具体的值,可以参考这篇文档:http://docs.oracle.com/cd/E23824_01/html/E22973/gkyeg.html,我就不一一列举了。需要注意的是,有4个通用的寄存器,可以在所有硬件平台上使用:
名字 | 代表的寄存器 |
---|---|
R_PC | 程序计数器 |
R_SP | 堆栈指针 |
R_R0 | 第一个返回值 |
R_R1 | 第二个返回值 |
最后以一个简单的程序示范一下如何访问寄存器。C程序如下:
#include <stdio.h> int func(void) { return 3; } int main(void) { func(); return 0; }
生成可执行文件名为“a
”。执行DTrace命令:
dtrace -n 'pid$target:a:func:return {trace(uregs[R_R0])}' -c ./a dtrace: description 'pid$target:a:func:return ' matched 1 probe dtrace: pid 21357 has exited CPU ID FUNCTION:NAME 0 58535 func:return 3
可以看到正确地打印出了func
函数的返回值3
。