まず、スクリプトは次のとおりです。
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を使用して関数から返された値にアクセスできます。