第5章 SystemTap のエラーを理解する
[man warning::example1] [man error::example2]
5.1. 解析エラーとセマンティックエラー
parse error: expected abc, saw xyz
スクリプトに文法的なエラーまたは誤字や脱字のエラーが含まれています。プローブのコンテキストから考えると、SystemTap は間違ったコンストラクトのタイプを検出しました。
probe vfs.read probe vfs.write
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 では、スクリプトに C コードを埋め込むことができるため、目的にあった tapsets がない場合には便利です。ただし、埋め込みの 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 を見つけることができませんでした。