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

标签 c solaris dtrace

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

相关文章:

c - 初始化 union 类型的二维数组(整数或字符)

c - C 中的 munmap_chunk 错误

c - 如何通过指针打印数组的元素?

macos - 诊断 Docker for Mac 上的高 CPU 使用率

macos - Mac OS X 上有 dtrace ustack() 帮助程序吗?

linux - 了解 dtruss 的输出

c - Linux 如何知道要调用哪个 ioctl 函数?

solaris - OpenSolaris 中的 wheel 组

linux - 按字母顺序对带连字符的名称排序,然后按数字排序

linux - 我如何使文件内容作为命令的输出?