第5章 SystemTap のエラーを理解する

SystemTap を使用する上で最もよく遭遇する可能性のあるエラーを説明しています。

5.1. 解析エラーとセマンティックエラー

このタイプのエラーは、スクリプトがカーネルモジュールに変換される前、SystemTap により構文解析が行われ C に変換される際に発生します。たとえば、これらのタイプのエラーは、無効な値を変数やアレイに割り当てる演算から発生します。
parse error: expected abc, saw xyz

スクリプトに文法的なエラーまたは誤字や脱字のエラーが含まれています。SystemTap は間違ったコンストラクトのタイプを検出しプローブのコンテキストを表示します。

次の無効な SystemTap スクリプトにはプローブのハンドラーがありません。
probe vfs.read
probe vfs.write
その結果、パーサーは 2 行目のコラム 1 の probe キーワードには別の値を期待していたことを示すエラーメッセージが表示されます。
parse error: expected one of '. , ( ? ! { = +='
saw: keyword at perror.stp:2:1
1 parse error(s).
parse error: embedded code in unprivileged script

スクリプトには危険な埋め込み C コードが含まれています (%{ %} で囲まれたコードブロック)。SystemTap では目的にあった tapsets がない場合にはスクリプトに C コードを埋め込むことができるため便利ですが、埋め込みの C コンストラクトは安全ではありません。スクリプトにこのような構造を検出すると SystemTap はこのエラーで警告を発します。

スクリプト内の似たようなコンストラクトがすべて確実に安全であることが分かっていて かつstapdev グループのメンバーである (または root 特権がある) 場合には、-g オプションを使用して guru モードでスクリプトを実行します。
stap -g script
semantic error: type mismatch for identifier 'ident' ... string vs. long

スクリプト内の ident 関数で間違ったタイプを使用しています (%s または %d)。このエラーを 例5.1「error-variable.stp」 に示します。execname() 関数が文字列を返すため書式指定子は %d ではなく %s にしてください。

例5.1 error-variable.stp

probe syscall.open
{
  printf ("%d(%d) open\n", execname(), pid())
}
semantic error: unresolved type for identifier 'ident'

識別子 (変数など) が使用されているがタイプ (整数または文字列) を特定できません。たとえば、printf ステートメントに変数を使用しているのにスクリプトでは変数に値を割り当てていない場合などにこのエラーが発生します。

semantic error: Expecting symbol or array index expression

SystemTap ではアレイ内の場所や変数に値を割り当てることはできません。割り当ての目的地が有効な目的地になっていません。次のようなコードを使用するとこのエラーが発生することになります。

probe begin { printf("x") = 1 }
semantic error: unresolved function call (変数 N 関数の検索中に発生するエラー)

スクリプト内の関数コールまたはアレイインデックス式が無効な数の引数/パラメーターを使用しました。SystemTap では、arity (アリティ) はアレイのインデックス数か関数へのパラメーター数を見ることができます。

semantic error: array locals not supported, missing global declaration?

アレイをグローバル変数と宣言せずに、スクリプトがアレイ演算を使用しました (グローバル変数は、SystemTap スクリプトでの使用後に宣言されることができます)。アレイが一貫性のないアリティと使用されると、同様のメッセージが表示されます。

semantic error: variable ’vaar’ modified during ’foreach’ iteration

var アレイがアクティブな foreach ループ内で修正されています (割り当てられるまたは削除される)。このエラーは、スクリプト内の演算が foreach ループ内で関数コールを実行しても表示されます。

semantic error: probe point mismatch at position N, while resolving probe point pnt

SystemTap は、イベントまたは SystemTap 関数 pnt が参照しているものを理解できませんでした。これは通常、SystemTap が tapset ライブラリー内で pnt にマッチするものを見つけられなかったことを意味します。ここでの N は、エラーの行とコラムを指します。

semantic error: no match for probe point, while resolving probe point pnt

pnt イベントとハンドラー関数が各種の理由で解決できませんでした。このエラーは、スクリプトに kernel.function("name") イベントが含まれ、name が存在しない場合に発生します。このエラーはスクリプトに無効なカーネルファイル名やソース行数が含まれていることを意味する場合もあります。

semantic error: unresolved target-symbol expression

スクリプトのハンドラーはターゲット変数を参照しますが、変数の値が解決できませんでした。このエラーは、ハンドラーがターゲット変数を参照した際にその変数がコンテキスト内で無効であることも意味します。これは、生成されたコードのコンパイラー最適化の結果である可能性もあります。

semantic error: libdwfl failure

デバッグ情報の処理に問題がありました。ほとんどの場合、このエラーは kernel-debuginfo パッケージのインストールにより発生します。インストールされた kernel-debuginfo パッケージ自体に一貫性もしくは正確性の問題がある可能性があります。

semantic error: cannot find package debuginfo

SystemTap は適切な kernel-debuginfo を見つけることができませんでした。


このページには機械翻訳が使用されている場合があります (詳細はこちら)。