copyoutstr

指定した文字列を指定したユーザー空間アドレスにコピーします。

void copyoutstr(char * string, uintptr_t addr, size_t size)

copyoutstr関数は、指定した文字列stringを現在のスレッドに関連付けられたプロセスのアドレス空間内の指定したアドレスaddrにコピーする破壊的関数です。3番目の引数(size)は、文字列の長さを制御するために使用されます。ユーザー空間アドレスが現在のアドレス空間で有効なフォルト・インのページに対応していない場合は、エラーが生成されます。また文字列の長さは、コンパイラおよび実行時strsizeオプションで設定された値に制限されています。sizestrsizeオプションの値を超える場合、文字列の長さはstrsizeオプションで指定した値に制限されます。

例7-11 指定したユーザー空間アドレスに文字列をコピーするためにcopyoutstrを使用する方法

この例では、syscall::newuname:entryプルーブとsyscall::newuname:returnプローブを使用しています。entryプローブは、entryプローブで使用される最初の引数をユーザー空間アドレスに移入するために使用されます。returnプローブは、最初の引数のアドレスに文字列"DTraceHost"を書き込みます。プロセスがnewunameシステム・コールを実行すると、そのコールのホスト名部分がリライトされます。

#pragma D option destructive

syscall::newuname:entry 
{ 
  self->a = arg0; 
}

syscall::newuname:return 
{
 copyoutstr("DtraceHost", self->a+65, 128);
}

このスクリプトを実行してから、uname -aコマンドを実行すると、次のような出力が表示されます:

Linux DtraceHost 5.15.0-7.86.6.1.el8uek.x86_64 #2 SMP ... GNU/Linux