copyinstr

指定されたユーザー・アドレスからDTraceバッファにNULL終端のC文字列をコピーして、バッファのアドレスを返します。

string copyinstr(uintptr_t addr [, size_t size])

copyinstr関数は、指定されたユーザー・アドレスからDTraceスクラッチ・バッファにNULL終端のC文字列をコピーして、このバッファのアドレスを返します。ユーザー・アドレスは、現在のスレッドに関連付けられたプロセスの空間内のアドレスとして解釈されます。オプションの最大長パラメータでは、アドレスを超えて検査されるバイト数の制限を設定します。結果の文字列は常にNULL終端されていて、その文字列の長さはコンパイラとランタイムのstrsizeオプションで設定した値に制限されます。copyin関数と同様に、指定されたアドレスは現在のプロセス内でフォルト・インされたページに対応している必要があります。アドレスがフォルト・インされたページに対応していない場合や、使用できるスクラッチ・メモリーが不足している場合は、NULLが返され、エラーが生成されます。

例7-8 プロセスのアドレス空間からDTraceバッファに文字列をコピーするためにcopyinstrを使用する方法

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

syscall::write:entry
/execname=="passwd"/
{
    printf("%s", copyinstr(arg1));
}