ProbeVue エラー・メッセージ

前述のとおり、probevue コマンドを実行するには特権が必要です。 通常のユーザーが probevue コマンドを実行すると、RBAC フレームワークがこれを検出し、このコマンドの実行をすぐに中止します。

$ probevue kernel.e
ksh: probevue: 0403-006 Execute permission denied.

Running ProbeVue 」の「 Authorizations and privileges 」セクションでは、非 root ユーザーが probevue コマンドを発行する権限と特権を持つことができるようにする方法について説明しています。

probevue コマンドに組み込まれている ProbeVue コンパイラーは、構文エラー、セマンティック・エラー、またはタイプ非互換性エラーを検出すると、コンパイル・フェーズ中に詳細なエラー・メッセージを出力します。 次のスクリプトを考えてみましょう。

/* Syntax error example:
 * syntaxbug.e
 */
@@BEGIN
{
        int i, j, k;

        i = 4;
        j = 22;

        k = i _ z;

        printf("k = %d\n", k);

        exit();
}

前述のスクリプトには、行 11 列 15 の代入ステートメントに構文エラーがあります。 マイナス記号 (-) の代わりに、誤って下線記号 (_) が入力されました。 スクリプトの実行時に、 ProbeVue コンパイラーはこのエラーをキャッチし、エラー・メッセージを生成します。

# probevue syntaxbug.e    
syntaxbug.e: token between line 11: column 15 and line11: column 15: , expected 
instead of this token

ProbeVue コンパイラーは、内部システム・コールも呼び出して、 Vue スクリプトのプローブ指定が有効かどうかを検査します。 一般的なエラーは、プローブ・ポイント組で無効なプロセス ID または終了したプロセスのプロセス ID が渡されるエラーです。 もう 1 つの一般的なエラーは、スクリプトで引数としてプロセス ID が要求されている場合にコマンド・ラインでそのプロセス ID が渡されないエラーです。 次のスクリプトを考えてみましょう。

/* simpleprobe.e 
 */
@@syscall:$1:read:entry
{
        printf("In read system call: thread ID = %d\n", __tid);
        exit();
}

上記のスクリプトでは、3行目のプローブポイントタプルの「1ドル 」変数を置換する引数としてプロセスIDが必要です。 終了したプロセスまたは存在しないプロセスをプローブしようとすると、カーネルはエラーを戻します。 また、プロセス ID がカーネル・プロセスまたは init プロセスである場合も失敗します。 さらに、ユーザーは別のユーザーのプロセスをプローブするのに必要な特権を持っていない限り、ユーザーに属さないプロセスをプローブできません。 prgrep コマンドを -p フラグと一緒に使用すると、プロセス ID が指定されたプロセス名を印刷できます。

注: 指定されたプロセス ID が存在しない場合、このコマンドは空の出力を生成します。
# probevue simpleprobe.e 233
probevue: The process does not exist.
ERR-19: Line:3 Column:3 Invalid probe string
# prgrep -p 232
#
# probevue simpleprobe.e 1  
ERR-19: Line:3 Column:3 Invalid probe string
# prgrep -p 1  
init
# probevue simpleprobe.e  
ERR-19: Line:3 Column:3 Invalid probe string

また、probevue コマンドは、非特権ユーザーがカーネル変数にアクセスしようとしたかを検出することもできます。 サンプル・プログラム・セクションの kernel.e スクリプトについて考えてみます。 次のセッション例は、非特権ユーザーでこれを実行しようとした場合に発生する事象を示しています。

$ probevue kernel.e
ERR-56: Line:93 Column:39 No authority to access kernel variable
ERR-56: Line:99 Column:23 No authority to access kernel variable
ERR-56: Line:100 Column:24 No authority to access kernel variable
ERR-56: Line:101 Column:25 No authority to access kernel variable
ERR-56: Line:102 Column:24 No authority to access kernel variable
ERR-102: Line:140 Column:13 Operation not allowed
ERR-46: Line:140 Column:9 Invalid Assignment, Type mismatch

Vue スクリプトが正常にコンパイルされると、 probevue コマンドはシステム・コールを呼び出して、コンパイラーによって生成された中間コードを渡す新しい ProbeVue セッションを開始します。 ProbeVue フレームワークが新しい ProbeVue セッションの初期化に失敗すると、システム・コールは失敗します。 これにはいくつかの原因が考えられます。 例えば、この新しいセッションが開始されると、ユーザー用のメモリー・リソースが管理者指定の制限を越える可能性があります。 このセッションは、単一セッションに許可されるものよりも多くのメモリー・リソースを必要とする場合があります。 間隔プローブ・マネージャーで許可されない関数が使用される可能性があります。 コンパイル・フェーズの検査が行われた後に、プローブされているプロセスが終了した可能性があります。 セッションが開始できない場合、カーネルはシステム・コールを終了し、固有の 64 ビット・エラーを戻します。

プローブ・アクションの発行中に重大エラーまたはリカバリー不能エラーが発生した場合、 ProbeVue フレームワークは、正常に開始され、アクティブな ProbeVue セッションを打ち切ることができます。 セッション/ユーザー・メモリーの制限を越えた (スレッド・ローカル変数とリスト変数のメモリー要件はセッションが進行するにつれて大きくなる可能性があります) こと、一時的な文字列/スタック域制限を越えたこと、配列範囲外の索引にアクセスしたこと、ゼロ除算を試みたことなどがエラーとして考えられます。 すべてのケースにおいて、カーネルは固有の 64 ビット・エラー番号を戻し、セッションを終了します。

セッションが開始時に失敗した場合でも、正常に開始した後に失敗した場合でも、probevue コマンドは 16 進形式の固有の 64 ビット・エラー番号を含む汎用エラー・メッセージを出力します。 カーネルから返される可能性があるいくつかの一般的な 64 ビット・エラーの意味を次の表に示します。

カーネル・エラー 意味 発生時点
0xEEEE00008C285034 1 次トレース・バッファーの割り振り時にメモリーが不足しています。 セッション開始
0xEEEE00008C285035 2 次トレース・バッファーの割り振り時にメモリーが不足しています。 セッション開始
0xEEEE00008C52002B プローブ指定の文字列に対するストレージの割り振り時にメモリーが不足しています。 セッション開始
0xEEEE000096284122 スレッド・ローカル・ストレージに対するストレージの割り振り時にメモリーが不足しています。 セッション開始
0xEEEE000081284049 間隔プローブ・マネージャーでのユーザー・スペース・アクセス関数の使用。 セッション開始
0xEEEE0000D3520022 一般ユーザーに対するセッションの数の制限。 セッション開始
0xEEEE000096284131 無効なアドレスが get_userstring 関数に渡されました。 プローブ・アクションの実行
0xEEEE00008C520145 スレッド・ローカル変数の最大スレッド制限に達しました。 プローブ・アクションの実行