如何使用 dtrace 查看调用堆栈

Posted

技术标签:

【中文标题】如何使用 dtrace 查看调用堆栈【英文标题】:How to view call stack with dtrace 【发布时间】:2009-09-22 20:54:24 【问题描述】:

如何通过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;
 

【问题讨论】:

【参考方案1】:

首先,这是脚本:

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.

【讨论】:

实际上,在入口时读取args可能会导致错误,因为内存地址可能还没有被分页。 docs.oracle.com/cd/E18752_01/html/819-5488/gcgkk.html#gcgkr

以上是关于如何使用 dtrace 查看调用堆栈的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dtrace 跟踪函数?

使用 DTrace 在 Rust 上获取堆栈跟踪/分析数据

如何查看xcode调用堆栈

dtrace:如何从文件中获取符号链接目标

是否可以使用 DTrace 查看传递给 strncpy 的参数?

如何查看友好的 .NET 调用堆栈?