2.7.5 例: プロセスによって起動されたシステム・コールのカウント(countsyscalls.d)

次の例に示すDプログラムcountsyscalls.dは、プロセスIDで指定されたプロセスが別のシステム・コールを起動した回数をカウントします。

#!/usr/sbin/dtrace -qs

/* countsyscalls.d -- Count system calls invoked by a process */

syscall:::entry
/pid == $1/
{
  @num[probefunc] = count();
}

syscalls.dファイルを実行可能ファイルにした後、コマンドラインから実行し、プロセスIDを引数として指定します。

次の例は、以前に呼び出されたemacs プログラムの使用をモニターする方法を示しています。 スクリプトが起動された後、emacs 内で、Dスクリプトを終了する前に、2つのファイルが開かれて変更され、保存されます。

スクリプトを実行可能にします:

# chmod +x countsyscalls.d

別のコマンドラインから、次のように入力します:

# emacs foobar.txt

ここでスクリプトを開始し、開いたemacsウィンドウを使用します:

# ./countsyscalls.d $(pgrep -u root emacs)
^C 

  chmod                                                             1 
  exit_group                                                        1 
  futex                                                             1 
  getpgrp                                                           1 
  lseek                                                             1 
  lsetxattr                                                         1 
  rename                                                            1 
  fsync                                                             2 
  lgetxattr                                                         2 
  alarm                                                             3 
  rt_sigaction                                                      3 
  unlink                                                            3 
  mmap                                                              4 
  munmap                                                            4 
  symlink                                                           4 
  fcntl                                                             6 
  newfstat                                                          6 
  getgid                                                            7 
  getuid                                                            7 
  geteuid                                                           8 
  openat                                                            8 
  access                                                            9 
  getegid                                                          14 
  open                                                             14 
  getdents                                                         15 
  close                                                            17 
  readlink                                                         19 
  newlstat                                                         33 
  newstat                                                         155 
  read                                                            216 
  timer_settime                                                   231 
  write                                                           314 
  pselect6                                                        376 
  rt_sigreturn                                                    393 
  ioctl                                                           995 
  rt_sigprocmask                                                 1261 
  clock_gettime                                                  3495 

前述の例では、pgrep コマンドを使用して、rootユーザーが実行しているemacs プログラムのプロセスIDを判別します。