如何使用dtrace查看下面简单程序的调用堆栈,返回值和参数
/** Trival code **/
#include <stdio.h>
int
foo (int *a, int *b)
{
*a = *b;
*b = 4;
return 0;
}
int
main (void)
{
int a, b;
a = 1;
b = 2;
foo (&a, &b);
printf ("Value a: %d, Value b: %d\n", a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
R S*_*hko 12
首先,这是脚本:
pid$target::foo:entry
{
ustack();
self->arg0 = arg0;
self->arg1 = arg1;
printf("arg0 = 0x%x\n", self->arg0);
printf("*arg0 = %d\n", *(int *)copyin(self->arg0, 4));
printf("arg1 = 0x%x\n", self->arg1);
printf("*arg1 = %d\n", *(int *)copyin(self->arg1, 4));
}
pid$target::foo:return
{
ustack();
printf("arg0 = 0x%x\n", self->arg0);
printf("*arg0 = %d\n", *(int *)copyin(self->arg0, 4));
printf("arg1 = 0x%x\n", self->arg1);
printf("*arg1 = %d\n", *(int *)copyin(self->arg1, 4));
printf("return = %d\n", arg1);
}
Run Code Online (Sandbox Code Playgroud)
这是如何工作的.ustack()打印用户进程的堆栈.
在函数入口中,argN是函数的第N个参数.由于参数是指针,因此在取消引用它之前,需要使用copyin()复制实际数据.
对于函数返回,您不再能够访问函数参数.因此,您保存参数供以后使用.
最后,对于函数返回,您可以使用arg1访问函数返回的值.