2.9.1 例: システム・コール・エラーの表示(errno.d)

次に、Dプログラムの例errno.dを示します。 この例では、open()システム・コールを使用してファイルを開くときにエラーが発生した場合、プログラムはerrnoの値とファイル名を表示します。

#!/usr/sbin/dtrace -qs

/* errno.d -- Display errno and the file name for failed open() calls */

syscall::open:entry
{
  self->filename = copyinstr(arg0);
}

syscall::open:return
/arg0 < 0/
{
  printf("errno = %-2d   file = %s\n", errno, self->filename);
}

open()システム・コールでエラーが発生すると、returnプローブはarg0引数を-1に設定し、組込みerrno変数の値はエラーの性質を示します。 述語は、arg0の値をテストするために使用されます。 または、errnoの値がゼロより大きいかどうかをテストできます。

このスクリプトをファイルに保存して実行可能ファイルを作成した後、スクリプトを実行して、システムで発生したopen()システム・コールの失敗に関する情報を表示できます。 スクリプトを別のターミナル・ウィンドウで起動した後、ls コマンドを実行して、存在しないファイルをリストするなどのエラーになるコマンドを実行できます。 または、次の例に示すように、別の端末からcat コマンドがディレクトリに発行されていると、エラーになります:

# ./errno.d

errno = 2    file = /usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo
errno = 2    file = /usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo
errno = 2    file = /usr/share/locale/en_US/LC_MESSAGES/libc.mo
errno = 2    file = /usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo
errno = 2    file = /usr/share/locale/en.utf8/LC_MESSAGES/libc.mo
errno = 2    file = /usr/share/locale/en/LC_MESSAGES/libc.mo
^C