ProbeVue のシェル・スクリプト
このセクションでは、ProbeVue コマンドを実行するシェル・スクリプトについて説明します。
ProbeVue のシェル・ヘルパー・プログラム
以下のシェル・スクリプトは、ProbeVue を実行する場合に役立ちます。
sprobevue
すべての引数を二重引用符で囲むシェル・スクリプト:
#!/usr/bin/ksh
#
# sprobevue:
#
# Simple helper function for probevue
# Wraps arguments to probevue in double quotes
#
# Usage: sprobevue <probevue flags> <script> <args>
# Doesn't support the -c and -A flags of probevue
#
usage()
{
echo "Usage: sprobevue <probevue flags> <script> <args>" >&2
echo " Doesn't support the -c and -A flags of probevue" >&2
exit 1
}
CMD=probevue
# Generate command to execute
while getopts 'c:A:I:s:o:t:X:' zargs
do
case $zargs in
I|s|o|t|X) CMD="$CMD -$zargs $OPTARG" ;;
?) usage
esac
done
shift $(($OPTIND -1))
if [ -n "$1" ]
then
CMD="$CMD $1"
shift
fi
for i
do
CMD="$CMD ¥"$i¥""
done
# Execute command
$CMD
prgrep
プロセス名が指定されたプロセス ID を印刷するシェル・スクリプト:
#/usr/bin/ksh
#
# prgrep:
#
# Simple helper function for probevue
# Prints all process IDs with given process name
#
# Need options to print only one process
# to print process belong to a certain UID
#
# Usage: prgrep <process_name>
# prgrep -p <processID>
#
usage()
{
echo "Usage: prgrep <process_name>" >&2
echo " prgrep -p <process_ID>" >&2
exit 1
}
[ -z "$1" ] && usage
if [ $1 = "-p" ]
then
[ -z "$2" ] && usage
pid=$2
export pid
ps -e | awk 'BEGIN {pid = ENVIRON["pid"]} {if ($1 == pid) print $4}'
else
pname=$1
export pname
ps -e | awk 'BEGIN {pname = ENVIRON["pname"]} {if ($4 == pname) print $1}'
fi
ProbeVue のエラー・メッセージ
前述のとおり、probevue コマンドを実行するには特権が必要です。 通常のユーザーが probevue コマンドを実行すると、RBAC フレームワークがこれを検出し、このコマンドの実行をすぐに中止します。
$ probevue kernel.e
ksh: probevue: 0403-006 Execute permission denied.
root でないユーザーが probevue コマンドを実行できる権限と特権を持つようにする方法については、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 が指定されたプロセス名を印刷できます。
# 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 | スレッド・ローカル変数の最大スレッド制限に達しました。 | プローブ・アクションの実行 |
RAS イベント関数
「RAS イベント」は、特別なシステムまたはアプリケーションのデバッグ用に提供された Vue 関数の特権セットです。 これらは一般的に使用できるものではありません。 これらの関数はシステム・トレースとダンプ機能を提供します。 これらの関数の多くは「パススルー」関数です。これらの関数を使用すると、Vue スクリプトはカーネル・サービスを直接呼び出せるため、これらの使用にはリスクが伴います。 これらの関数をユーザーの Vue スクリプトで正常に呼び出すには特殊な特権が必要です。ユーザーは root または、aix.ras.probevue.rase 権限を持っている必要があります。
これらの関数のリスクを回避するには、-K フラグを probevue コマンドに渡します。 それ以外の場合、これらの関数は Vue 言語では使用しません。
トレース・レコードの生成
d
システム・トレース (および LMT トレース) レコードを生成する Vue 関数の構文は、それに乗じて呼び出すカーネル・インターフェースと似ています。 このため、Vue スクリプトからトレース・レコードを書き込む操作は、他所でのこの操作と同様です。 以下の制約事項があります。
- システム・トレースが開始していない場合、またはシステム・トレースで hookid 値が収集されていない場合は、これらの操作でシステム・トレース・レコードは生成されません (TRCHKLx トレースの共通バッファーに対する LMT トレースは引き続き試行されますが、LMT も使用不可になる可能性があります)。
- トレース・レコードは @@systrace Vue 節内からは生成できません。 この場合、トレース関数への呼び出しで生成されるのは、TRCHKLx トレースの LMT 共通バッファーのトレース・レコードのみです (前提として LMT が使用可能である)。
- ProbeVue で生成されたトレース・イベントはプローブできません。プローブできるのは、カーネルとアプリケーションで生成されたトレースのみです。
- 特権が必要です。root または、aix.ras.probevue.rase 権限を持っている必要があります。
以下の Vue 関数は、システム・トレース・レコードの書き込み用です。 データ・ワードの型はすべて long long 整数 です。
- TRCHKL0(hookID)
- データ・ワードなしでトレースします。
- TRCHKL1(hookID, D1)
- 1 つのデータ・ワードを使用してトレースします。
- TRCHKL2(hookID, D1,D2)
- 2 つのデータ・ワードを使用してトレースします。
- TRCHKL3(hookID, D1,D2,D3)
- 3 つのデータ・ワードを使用してトレースします。
- TRCHKL4(hookID, D1,D2,D3,D4)
- 4 つのデータ・ワードを使用してトレースします。
- TRCHKL5(hookID, D1,D2,D3,D4,D5)
- 5 つのデータ・ワードを使用してトレースします。
- void trcgenk(int channel, int hook_ID, unsigned long long data_word, int length, untyped buffer)
- バッファーをトレースします。
これらのトレース関数は常にタイム・スタンプをイベント・データに追加します。
これらの関数に対する hookid パラメーターの形式は 0xhhhh0000 です。
これは hookid 値が定数でなければならないというわけではなく、単に hookid 値の形式を示しているだけです。
trcgenk カーネル・サービスでは、buffer パラメーターはトレースするデータの長さバイトへのポインターです (最大 4096 バイト)。 buffer パラメーターは、固定されたデータへのカーネルまたはアプリケーションのポインターのような外部変数、または Vue 文字列または構造体インスタンスのようなスクリプト変数にもなります。 この省略表現が「型なし」指定です。
ゼロ以外のチャネル番号を使用できますが、指定されたチャネルがトレース用に使用可能であることを確認する必要があります。 トレースを開始した trace コマンドからの戻り値は、このために Vue スクリプトに渡されます。 使用不可なチャネルを使用すると、トレースは実行されません。
前述のトレース関数は値を返しません。
詳しくは、「Technical Reference: Kernel and Subsystems, Volume 1」の trcgenk カーネル・サービス、および「パフォーマンス・マネージメント」の『トレース・イベントを記録するためのマクロ』を参照してください。
トレースの停止
必須のイベントが発生した後にシステム・トレースを即時に停止するには、Vue スクリプトで void trcoff() を使用できます。 この機能は、チャネル 0 (ゼロ) のトレースを即時に使用不可にします。 トレース処理を正常に完了するには、ProbeVue の外部にある trcstop コマンドを使用した通常の方法でトレースを停止する必要があります。
進行中のトレースがデータをラップしないように、LMT とコンポーネント・トレースを即時に停止できます。 これらのトレースの再開に使用できるコマンド・ラインの同等の関数がないため、対応する再開関数が必要です。 新しい Vue 関数を次に示します。
void mtrcsuspend()
void ctsuspend()
void mtrcresume()
void ctresume()
ctsuspend ルーチンは、すべてのコンポーネント・トレースを停止します。 このルーチンは、選択したコンポーネントごとのトレースの停止には使用できません。 これはコンポーネント・トレースのみを停止し、CT_HOOKx マクロが要求したトレース (システムや LMT トレース記録) などは停止しません。
影響を受けるカーネル・トレース・コードのシリアライズはないため、これらのトレース制御関数を使用する場合は注意が必要です。 一度に 1 つのスクリプトまたはコマンドのみがトレースに作用するように手動で確認する必要があります。
システムの停止
次のルーチンを使用してシステムを終了し、フル・ダンプを取ることができます。
void abend(long long code, long long data_word, ...)
このルーチンは、abend カーネル・サービスと似ています。ただし、この場合は最大 7 個のデータ・パラメーター (レジスター r3 から r10 までにロードされる) のみが受け入れられます。
型なしパラメーター
関数プロトタイプでは、同等のカーネル関数のパラメーターの一部は曖昧な型を持っています。 Vue コンパイラーは、通常、Vue 関数に渡されるすべてのパラメーターの型の検査を実行しますが、「型なし」型を持つと指定されたパラメーターは型の検査から除外されます。 例えば、これらのカーネル・サービスをカーネルで直接使用すると、オプションの文字列が NULL として渡されることがありますが、Vue 関数が文字列型のパラメーターを取るように定義されている場合は、NULL は受け入れられません。 空文字列を代わりに渡す不便を避け、Vue 関数が次のカーネル・インターフェースと同じパラメーターを取るようにするために、これらの関数は型なしパラメーターを取るように定義されています。 型なしパラメーターを使用すると、実際の Vue 文字列の代わりに NULL を渡すことができますが、コンパイラーはパラメーターに任意の型を受け入れるので、「型なし」パラメーターの値の指定は慎重に行う必要があります。
ライブ・ダンプの取得
ほとんどのカーネル・ライブ・ダンプ機能に対する ProbeVue サービスが提供されており、対応するカーネル・サービスと非常によく似ています。 カーネル・ライブ・ダンプ・サービスの詳細については、「Technical Reference: Kernel and Subsystems, Volume 1」の livedump カーネル・サービスを参照してください。
この類似性の例外として、スクリプト・レベルでは見えない ldmp_parms 構造体があります。 この代わりに、ldmp_setupparms 組み込み関数は、この構造体のプライベート・インスタンスを所有し、これは呼び出し側に割り当てられ、64 ビット cookie として間接的に呼び出し側に戻されます。この cookie は、後続のライブ・ダンプ・サービスに代わりに渡す必要があります。 一度に 1 つのセッションのみがこのプライベート構造体を使用できます。 カーネル・ライブ・ダンプ・サービスの構文と似せて、他のライブ・ダンプ・サービスを使用できます。 (カーネル・ライブ・ダンプ・サービス自体で行われた隠れた割り当てと同様に) この隠れた割り当てのため、いったん ldmp_setupparms カーネル・サービスが呼び出され、正常に戻された場合、ldmp_freeparms カーネル・サービスまたは livedump カーネル・サービスのいずれかを呼び出す必要があります。 それ以外の場合は、現行のセッションが引き続きプライベート構造体を所有し、以降の ldmp_setupparms コールはすべて失敗します。 プライベート構造体が解放された後は、別の ldmp_setupparms コールがない限り、その前の所有者は使用できなくなります。 LDT_POST フラグを ldmp_setupparms カーネル・サービスと一緒に使用しないでください。これは隠し構造体に対する以降の参照がサポートされないことを示しているためです。
標準のライブ・ダンプ・アプリケーションは、隠し構造体を非常に短い間隔 (通常 1 つの probevue 節内) だけ保持します。 隠し構造体はセッションで所有され、そのセッション内の任意の Vue 節で使用できます。 ProbeVue セッションが終了すると、フレームワークが自動的に ldmp_freeparms カーネル・サービスを使用してプライベート構造体と他のカーネル・リソースを解放します。
ldmp_parms 構造体エレメントは ProbeVue では見えないため、呼び出し側により要求または許可される初期化は、代わりに ProbeVue 版の ldmp_setupparms カーネル・サービスに渡される他のパラメーターを使用して設定されます。
long long ldmp_setupparms(String symptom,required symptom string
untyped title, dump title string or NULL
untyped prefix, dump file name prefix string or NULL
untyped func, failing function name string or NULL
long long errcode, error code
int flags, dump characteristics
int prio ) dump priority
前述の ldmp_setupparms Vue 関数は、同じ名前のカーネル・サービスへのインターフェースです。ただし、ldmp_parms 構造体は呼び出し側の Vue スクリプトでは見えません。 この戻り値は、ldmp_parms 構造体へのポインターの代わりとして、他のライブ・ダンプ・サービスに渡されます。ただし、この型は 64 ビット整数となります。
symptom 文字列は必須の String オペランドです。一方、title、prefix、および func 文字列はオプションです。 これらの 3 つのパラメーターには String または NULL を渡します。 すべての String 値は Vue スクリプトにローカルでなければなりません。 flags と prio のパラメーターはゼロ、またはカーネルのヘッダー・ファイル sys/livedump.h からの値になります。ここでは適切な整数定数を使用する必要がありますが、代替方法があります。
flags パラメーターには次の値が有用です。
LDT_ONEPASS 0x02 limit dump to one pass
LDT_NOADDCOMPS 0x08 components can’t be added by callbacks
LDT_NOLOG 0x10 no error is to be logged
LDT_FORCE 0x20 force this dump
ダンプは、ProbeVue の使用不可にされた内部環境から取られるため、直列化された同期ワン・パス・ダンプでなければなりません。
prio パラメーターには次の値を使用できます。
LDPP_INFO 1 informational dump
LDPP_CRITICAL 7 critical dump (this is the default)
prio パラメーターにゼロが指定されている場合は、ldmp_setupparms カーネル・サービスにより LDPP_CRITICAL がデフォルトになります。 ゼロ以外の値のみが隠し ldmp_parms 構造体に格納され、これを上書きします。
正常に実行された場合の戻り値は、隠し ldmp_parms 構造体の所有権を表す肯定の cookie です。
失敗した場合は、次のように戻り値が否定になります。
| 値 | 説明 |
|---|---|
| EINVAL_EVM_ COOKIE | ldmp_parms プライベート構造体は使用できないことを示します。 |
| EINVAL_EVM_ STRING | 文字列のパラメーターが無効であることを示します。 |
後述の Vue 関数は、同様に否定のカーネル・エラー番号とともに失敗指示を戻します。
| 値 | 説明 |
|---|---|
| EINVAL_EVM_ COOKIE | 呼び出し側が ldmp_parms プライベート構造体の所有権を表す cookie を正しく指定しなかったことを示します。 |
| EINVAL_EVM_ STRING | 文字列のパラメーターが無効であることを示します。 |
| EINVAL_EVM_ EXTID | extid パラメーターが非サポートであり、ゼロでなければならないことを示します。 |
次のカーネル・サービスにより、その他のカーネル・エラー番号が渡されます。
- long long ldmp_freeparms (long long cookie)
- ldmp_setupparms カーネル・サービスが正常に戻った後、内部の ldmp_parms 構造体が実行中の Vue スクリプトに割り当てられています。 このリソース、およびダンプにコンポーネントを追加するサービスで割り当てられた他のカーネル内部リソースは、livedump カーネル・サービスを呼び出してダンプを取るか、または ldmp_freeparms カーネル・サービスを呼び出して解放する必要があります。 これにより、内部の ldmp_parms 構造体が解放され、後で使用されます。
- long long livedump (long long cookie)
- livedump サービスによりダンプが要求されるのは、ldmp_setupparms カーネル・サービス、およびダンプにコンポーネント (および疑似コンポーネント) を追加するサービスのうち少なくとも 1 つのサービスが呼び出された後です。 このサービスにより、実際のライブ・ダンプは、ldmp_setupparms カーネル・サービスと起動された他のライブ・ダンプ・サービスを介して提供された仕様に応じて、 /var/adm/ras/livedump ファイルに生成されます。 cookie パラメーターは、ldmp_setupparms カーネル・サービスへの最初の呼び出しにより戻された cookie です。 戻り値は、ダンプが正常に取られた場合はゼロ、cookie が無効であった場合は EINVAL_EVM_COOKIE、カーネルの livedump 処理中にエラーが発生した場合は別のカーネル・エラー番号です。
- long long dmp_compspec(long long flags, DCF_xxx flags defined in sys/dump.h untyped comp, component to be added (by ras_block_t, name, alias, and so on.) long long cookie, cookie returned by ldmp_setupparms long long extid, not supported – must be zero untyped p1, first possible component parameter ... ); additional component parameters
- このサービスを呼び出すことにより、ライブ・ダンプをサポートする任意のコンポーネントをライブ・ダンプに追加できます。これは同じ名前のカーネル・サービスと同じ機能を持っています。ただし、次の状況を除きます。
- extid パラメーターは非サポートであり、ゼロでなければなりません。このパラメーターを使用すると、dmp_extid_t (long) がカーネルのプログラミング環境で戻されます。 それ以外の場合は、EINVAL_EVM_EXTID が戻されます。 この値 (dmp_compext カーネル・サービスと併用される場合がある) を受け取るためにポインターを ProbeVue メモリーに渡すことはできません。 そのため、これは ProbeVue でもサポートされていません。 代わりに、dmp_compspec サービスを複数呼び出すことができます。
- このカーネル・サービスでは p1、p2 などのパラメーターをいくつでも使用できます。この場合は、最後のパラメーターの後に NULL パラメーターを追加して、パラメーター・リストを終了する必要があります。 Vue 関数は、p1、p2 などのパラメーターを最大 4 個まで受け入れます。 最後のパラメーターは、これらのパラメーターの数をカーネル・サービスに伝えるためにゼロでなければなりません。このため、実際に指定できるパラメーターは最大 3 個までです。 このルールを守るために、最大 3 個の変数パラメーターで構成される最後のパラメーターの後に続くパラメーターは、インターフェースにより自動的にゼロになります。
- comp パラメーターは、必要に応じて long、カーネルの ras_block_t アドレス、または文字列となります。 この型は検査されません。
- カーネルの #define フラグ値は ProbeVue に含まれていません。
- long long ras_block_lookup(文字列パス)
- この関数は、コンポーネントのパス名パラメーターに対応する ras_block_t を特定します。 カーネル変数でアドレスが容易に見つからなかった場合、この関数は dmp_ct カーネル・サービスを呼び出す (このようなアドレスが必要) のに役立ちます。
この関数からの戻り値は、要求された ras_block_t のカーネル・アドレスか、または ras_block_t が見つからなかった場合は NULL となります。
以下の関数はすべて単純な「パススルー」関数です。これらの関数を使用すると、Vue スクリプトは対応するカーネル・サービスを直接呼び出せます。 一部のパラメーター・リストにはカーネルとの互換性のために未使用のメンバーがあります。このため、カーネルの記述を直接使用できます。 unused (未使用) と表示されているパラメーターの場合は、値 0 が渡されます。 これらのサービスは、対応するカーネルのサービスと同様に使用できます。ただし、ldmp_parms 構造体のアドレスは、ldmp_setupparms カーネル・サービスから戻される cookie に置き換わります。
否定の戻り値はエラーを示します。 これは次のカーネル・サービスからのカーネル・エラー番号か、cookie または文字列が無効な場合はインターフェース・ルーチンからのエラー番号となります。 次のインターフェースにより、カーネルまたはカーネル拡張が実行するライブ・ダンプにほとんどの柔軟性が提供されます。
long long dmp_context (long long flags,DCF_xxx flags from dump.h
long long cookie, cookie returned by ldmp_setupparms
long long name, unused by this function
long long ctx_type, DMP_CTX_xxx flags from dump.h untyped p2)
parameter dependent on ctx_type (NULL, mst addr, cpuid, tid)
long long dmp_ct( long long flags, DCF_xxx flags from dump.h
long long cookie, cookie returned by ldmp_setupparms
long long name, unused by this function
untyped rasb, component’s ras_block_t pointer
long long size) amount of CT buffer to dump or 0 for all
long long dmp_eaddr( long long flags, DCF_xxx flags from dump.h
long long cookie, cookie returned by ldmp_setupparms
String name, cdt name
untyped addr, first address to dump
long long size) number of bytes to dump
long long dmp_errbuf(long long flags, DCF_xxx flags from dump.h
long long cookie, cookie returned by ldmp_setupparms
long long name, unused by this function
long long erridx, 0 for global error log, or wpar id
long long p2) unused
long long dmp_mtrc(long long flags, DCF_xxx flags from dump.h
long long cookie, cookie returned by ldmp_setupparms
long long name, unused by this function
long long com_size, amount of LMT common data to dump
long long rare_size)amount of LMT rare data to dump
long long dmp_pid( long long flags, DCF_xxx flags from dump.h
long long cookie, cookie returned by ldmp_setupparms
long long name, unused by this function
long long pid, id of process to dump
long long p2) unused
long long dmp_systrace (long long flags, DCF_xxx flags from dump.h
long long cookie, cookie returned by ldmp_setupparms
long long name, unused by this function
long long size, amount to dump
long long p2) unused
long long dmp_tid( long long flags, DCF_xxx flags from dump.h
long long cookie, cookie returned by ldmp_setupparms
long long name, unused by this function
long long tid, id of thread to dump
long long p2) unused
次のスクリプトの例では、非常に小さい単純なライブ・ダンプを取ります。 カーネル・シンボル dc_data は、カーネルから構造体をエクスポートします。この実際の形状と内容は、この例では重要ではありません。
_kernel struct {int i1; int i2; int i3; int i4;} dc_data;
@@BEGIN
{
long long ldmp_parms;
long long rc;
rc = ldmp_setupparms( "dc_data dump",
"My Sample Dump", /* dump title */
"pvdump", /* dump path prefix */
NULL, /* no function name */
0x1122334455667788LL, /* error code */
0x10, /* LDT_NOLOG flag */
0); /* default dump prio */
printf("ldmp_setupparms rc = %016llx¥n", rc);
if (rc < 0) {
exit();
}
ldmp_parms = rc; /* cookie for other livedump functions */
/*
* Add 16 bytes of kernel data to sample dump.
* Note that "dc_data" passes the structure's address.
*/
rc = dmp_eaddr(0, ldmp_parms, "dc_data", dc_data, sizeof(dc_data));
if (rc) {
printf("dump_eaddr failed: %llx¥n", rc);
ldmp_freeparms(ldmp_parms);
exit();
}
/*
* Take the sample live dump.
*/
rc = livedump(ldmp_parms);
if (rc) {
printf("livedump failed: %llx¥n", rc);
}
exit();
}
ライブ・ダンプ・フラグに対する #define シンボルの使用
以下のサンプル・シェル・スクリプト probe.dump は、ヘッダー・ファイルから手動で値を置換するのではなく、ライブ・ダンプ・フラグに実際の定義済みシンボルを使用する場合に役に立つことがあります。 これは livedump.h ファイルと dump.h ファイルから関連する定義を収集し、C プリプロセッサーを使用して、ユーザーに代わって値を置換してからユーザーのスクリプトを ProbeVue に渡します。 ユーザーのスクリプトは次のルールに準拠している必要があります。
- 先頭に
#!/usr/bin/probevueコメントを挿入しない。 - ヘッダー・ファイルの定義と競合する LDPP_、LDT_、DCF_、または DMP_ で始まるシンボルを使用しない。
pvdump.* という名前のファイルは、次のスクリプトで上書きされてしまうため、作成しないでください。
#!/bin/ksh
#
# Helper script for Vue scripts that need to pick up
# the values of the various flags used by livedump.
#
# The Vue script $1
# must not contain a "#!/usr/bin/probevue" comment because
# the C preprocessor doesn't like it.
sed -n ¥
-e '/(/d' ¥
-e '/^#define LDPP_/p' ¥
-e '/^#define LDT_/p' ¥
-e '/^#define DCF_/p' ¥
-e '/^#define DMP_CTX_/p' ¥
/usr/include/sys/dump.h ¥
/usr/include/sys/livedump.h ¥
> pvdump.h
echo “#include ¥”pvdump.h¥”” > pvdump.c
cat $1 >> pvdump.c
cc -P pvdump.c
/usr/bin/probevue –K pvdump.i
rm pvdump.[cih]