Solaris 動的トレースガイド

プロセス破壊アクション

一部の破壊アクションは、特定のプロセスだけに影響を及ぼします。こうしたアクションを実行できるのは、dtrace_proc 権限か dtrace_user 権限を持つユーザーだけです。DTrace のセキュリティー権限については、第 35 章セキュリティーを参照してください。

stop()

void stop(void)

stop() アクションは、有効なプローブを起動するプロセスが次にカーネルを出るとき、proc(4) アクションを使用したときのように強制的に停止します。stop() アクションによって停止させられたプロセスを再開するには、prun(1) ユーティリティーを使用します。stop() アクションでは、任意の DTrace プローブポイントで、プロセスを停止できます。このアクションを使用すると、単純なブレークポイントでは捕捉するのが難しい特定の状態のプログラムを捕捉し、そのプロセスに mdb(1) などの従来のデバッガを接続できます。gcore(1) ユーティリティーを使用すれば、停止したプロセスの状態をあとで分析できるようにコアファイルに保存することもできます。

raise()

void raise(int signal)

raise() アクションは、現在実行中のプロセスに、指定されたシグナルを送信します。このアクションは、kill(1) コマンドでプロセスにシグナルを送る処理とよく似ています。raise() アクションでは、プロセスの実行中の特定のポイントでシグナルを送信できます。

copyout()

void copyout(void *buf, uintptr_t addr, size_t nbytes)

copyout() アクションは、指定されたバッファー (buf) から、現在のスレッドに関連付けられたプロセスのアドレス空間内の指定されたアドレス (addr) へ、指定されたバイト数 (nbytes) をコピーします。ユーザー空間アドレスが、現在のアドレス空間内の有効なフォルトインページに対応していない場合、エラーが生成されます。

copyoutstr()

void copyoutstr(string str, uintptr_t addr, size_t maxlen)

copyoutstr() アクションは、指定された文字列 (str) を、現在のスレッドに関連付けられたプロセスのアドレス空間内の指定されたアドレス (addr) へコピーします。ユーザー空間アドレスが、現在のアドレス空間内の有効なフォルトインページに対応していない場合、エラーが生成されます。文字列長は、strsize オプションで設定された値までになります。詳細については、第 16 章オプションとチューニング可能パラメータを参照してください。

system()

void system(string program, ...) 

system() アクションは、program で指定されたプログラムを、シェルで実行したときのようにして実行します。program 文字列には、printf() または printa() の書式変換を含めることができます。その書式変換に合った引数を指定する必要があります。有効な書式変換の詳細については、第 12 章出力書式を参照してください。

以下は、毎秒 1 回 date(1) コマンドを実行する例です。


# dtrace -wqn tick-1sec'{system("date")}'
 Tue Jul 20 11:56:26 CDT 2004
 Tue Jul 20 11:56:27 CDT 2004
 Tue Jul 20 11:56:28 CDT 2004
 Tue Jul 20 11:56:29 CDT 2004
 Tue Jul 20 11:56:30 CDT 2004

以下は、先ほどの例よりもアクションの使い方が複雑になった例です。この例では、program 文字列内で、printf() 変換と、パイプのような従来のフィルタリングツールが使用されています。

#pragma D option destructive
#pragma D option quiet

proc:::signal-send
/args[2] == SIGINT/
{
	printf("SIGINT sent to %s by ", args[1]->pr_fname);
	system("getent passwd %d | cut -d: -f5", uid);
}

このスクリプトを実行すると、次のような出力が得られます。


# ./whosend.d
SIGINT sent to MozillaFirebird- by Bryan Cantrill
SIGINT sent to run-mozilla.sh by Bryan Cantrill
^C
SIGINT sent to dtrace by Bryan Cantrill

指定されたコマンドは、起動するプローブのコンテキストでは実行されません。実行されるのは、system() アクションの詳細情報が格納されているバッファーがユーザーレベルで処理されたときです。この処理がどのようにしていつ行われるのかは、バッファリングポリシーによって異なります。詳細については、第 11 章バッファーとバッファリングを参照してください。デフォルトのバッファリングポリシーでは、バッファー処理間隔は switchrate オプションで指定されます。次の例のように、明示的に switchrate をチューニングして、デフォルト値の 1 秒よりも長くした場合、system() 内で遅延が発生します。

#pragma D option quiet
#pragma D option destructive
#pragma D option switchrate=5sec

tick-1sec
/n++ < 5/
{
	printf("walltime  : %Y\n", walltimestamp);
	printf("date      : ");
	system("date");
	printf("\n");
}

tick-1sec
/n == 5/
{
	exit(0);
}

このスクリプトを実行すると、次のような出力が得られます。


# dtrace -s ./time.d
 walltime  : 2004 Jul 20 13:26:30
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:31
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:32
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:33
date      : Tue Jul 20 13:26:35 CDT 2004

walltime  : 2004 Jul 20 13:26:34
date      : Tue Jul 20 13:26:35 CDT 2004

walltime の値は異なっているが、date の値は一致している点に注目してください。これは、date(1) コマンドが、system() アクションが記録されたときではなく、バッファーが処理されたときにだけ実行されるからです。