gpt4 book ai didi

c - 如何使用 dtrace 查看调用堆栈

转载 作者:太空狗 更新时间:2023-10-29 15:15:39 27 4
gpt4 key购买 nike

如何使用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;
}

最佳答案

首先,这是脚本:

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.

关于c - 如何使用 dtrace 查看调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1462547/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com