代码之家  ›  专栏  ›  技术社区  ›  Aaron

如何使用dtrace查看调用堆栈

  •  4
  • Aaron  · 技术社区  · 17 年前

    如何查看下面简单程序的调用堆栈、返回值和参数

     /** 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 回复  |  直到 15 年前
        1
  •  12
  •   R Samuel Klatchko    17 年前

    首先,这是脚本:

    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()打印用户进程的堆栈。

    指针,在取消引用之前,您需要使用copyin()复制实际数据。

    对于函数返回,您不再有权访问函数参数。所以你救了

    arg1。