copyin

指定されたサイズをユーザー・アドレスからDTraceバッファにコピーして、バッファのアドレスを返します。

void copyin(uintptr_t addr, size_t size)

copyin関数は、指定されたユーザー・アドレスaddrからDTraceスクラッチ・バッファに、バイト数で指定されたサイズをコピーし、このバッファのアドレスを返します。ユーザー・アドレスは、現在のスレッドに関連付けられたプロセスの空間内のアドレスとして解釈されます。最終的なバッファ・ポインタは、必ず8バイトのバイト列を持つことになります。指定されたアドレスは、現在のプロセス内のフォルト・インのページに対応している必要があります。アドレスがフォルト・インされたページに対応していない場合や、使用できるスクラッチ・メモリーが不足している場合は、NULLが返され、エラーが生成されます。

例7-7 システム書込みコールからのデータをDTraceバッファにコピーするためにcopyinを使用する方法

この例では、プローブが書込みシステム・コールのエントリ・ポイントに設定されています。述語は、プロセスexecnameがbashアプリケーションと一致したときにフィルタするように設定されています。copyin関数は、書込みコールの最初の引数arg1と2番目の引数arg2printfで出力される文字列にコピーするために使用されます。このスクリプトは、bashアプリケーションが使用されたときに、システム書込みコールの引数を出力します。

syscall::write:entry
/execname=="bash"/
{
    printf("%s", stringof(copyin(arg1,arg2)));
}