2.2.1 例: システム上でのopen()システム・コールの記録(syscalls.d)

/* syscalls.d -- Record open() system calls on a system */

syscall::open:entry
{
  printf("%-16s %-16s\n",execname,copyinstr(arg0));
}

この例では、printf()ファンクションを使用して、open()を呼び出す実行可能ファイルの名前と、オープンしようとしているファイルのパス名を表示しています。

注意

copyinstr()ファンクションでは、open()コールの最初の引数(arg0)を文字列に変換します。 プローブがユーザー・プロセスのアドレス空間にあるデータへのポインタにアクセスするときは、copyin()copyinstr()またはcopyinto()関数のいずれかを使用して、データをユーザー・スペースからカーネル・スペースのDTraceバッファにコピーする必要があります。 この例では、文字配列を参照するポインタとしてcopyinstr(),の使用が適切です。 文字列がNullで終了しない場合文字列の長さをcopyinstr()に指定する必要もあります。たとえば、write()などのシステム・コールの場合は、copyinstr(arg1, arg2)です。 Oracle® Linux: DTraceガイドユーザー・プロセスのトレースを参照してください。

procプロバイダ・プローブを有効にするsdtカーネル・モジュールは、テスト・システムにすでにロードされている可能性が高いです。 または、システムのブート後にDTraceモジュールを手動でロードしなかった場合は、sdtカーネル・モジュールが自動的にロードされます。 詳細は、1.4.2項、「DTraceモジュールの手動ロード」を参照してください。

次の例では、sdtカーネル・モジュールを手動でロードするか、適切な機能を使用するために自動的にロードできる必要があります:

# dtrace -q -s syscalls.d
udisks-daemon    /dev/sr0               
devkit-power-da  /sys/devices/LNXSYSTM:00/.../PNP0C0A:00/power_supply/BAT0/present
devkit-power-da  /sys/devices/LNXSYSTM:00/.../PNP0C0A:00/power_supply/BAT0/energy_now
devkit-power-da  /sys/devices/LNXSYSTM:00/.../PNP0C0A:00/power_supply/BAT0/voltage_max_design
devkit-power-da  /sys/devices/LNXSYSTM:00/.../PNP0C0A:00/power_supply/BAT0/voltage_min_design
devkit-power-da  /sys/devices/LNXSYSTM:00/.../PNP0C0A:00/power_supply/BAT0/status
devkit-power-da  /sys/devices/LNXSYSTM:00/.../PNP0C0A:00/power_supply/BAT0/current_now
devkit-power-da  /sys/devices/LNXSYSTM:00/.../PNP0C0A:00/power_supply/BAT0/voltage_now     
VBoxService      /var/run/utmp         
firefox          /home/guest/.mozilla/firefox/qeaojiol.default/sessionstore.js
firefox          /home/guest/.mozilla/firefox/qeaojiol.default/sessionstore-1.js
firefox          /home/guest/.mozilla/firefox/qeaojiol.default/sessionstore-1.js    
^C