4

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;
 }
4

1 に答える 1

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を使用して関数から返された値にアクセスできます。

于 2009-09-24T23:18:27.917 に答える