次に、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