2009-09-22 76 views
4

如何查看調用堆棧,返回值和下面的簡單程序的參數調用棧,與的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; 
} 

回答

12

首先,這裏的腳本:

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返回的值。

+1

實際上,在入口時讀取參數可能會導致錯誤,因爲內存地址可能尚未被分頁。 https://docs.oracle.com/cd/E18752_01/html/819-5488/gcgkk.html#gcgkr – hmijail