首先,这是脚本:
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);
}
这是如何工作的。ustack() 打印用户进程的堆栈。
在函数条目中,argN 是函数的第 N 个参数。由于参数是指针,因此您需要在取消引用之前使用 copyin() 复制实际数据。
对于函数返回,您不再有权访问函数参数。所以你保存参数供以后使用。
最后,对于函数返回,您可以使用 arg1 访问函数返回的值。