プログラムのパフォーマンス解析

ロック lint サブコマンド

ロック lint インタフェースは、lock_lint コマンドおよびそのコマンドと一緒に指定することが可能な一連のサブコマンドから構成されます。


lock_lint [subcommand]

この例の subcommand の部分には、ソースコードを解析し、データ競合およびデッドロックを調べるために使用される一連のサブコマンドを指定します。サブコマンドの詳細については、付録 A 「ロック lint コマンドリファレンス」を参照してください。

ロック lint の起動と終了

ロック lint セッションにおける最初のサブコマンドは、いつも start でなければなりません。このサブコマンドが、ロック lint の利用状況に応じてユーザーが選択したサブシェルを起動します。ロック lint セッションはサブシェル内から開始されるため、このサブシェルを終了することでセッションは終了します。たとえば、C シェルを使っている場合、ロック lint を終了するには、コマンド exit を使用します。

ツール状態の設定

ロック lint の状態は、読み込まれる一連のデータベースと指定されたアサーションから構成されます。そして、この状態の修正と解析の再実行を繰り返すことで、潜在的なデータ競合およびデッドロックを最適化するための情報を入手できます。1 つの状態に対して、解析はつねに 1 度だけ可能です。状態を再確立し、その状態に修正を加え、再度解析を試みるための手段としては、saverestore および refresh の各サブコマンドが提供されています。

アプリケーションをチェックする
  1. ソースコードに注釈を挿入し、それをコンパイルして .ll ファイルを作成します。

    「ソースコードへの注釈の挿入」の項を参照してください。

  2. load サブコマンドを使って .ll ファイルを読み込みます。

  3. assert サブコマンドを使って、関数および変数を保護するロックについてのアサーションを設定します。


    注 -

    これらの指定は、ソースコードへの注釈の挿入を使ってロック lint に伝えることもできます。「ソースコードへの注釈の挿入」の項を参照してください。


  4. assert order サブコマンドを使って、デッドロックを回避するためには、ロックをどのような順番で獲得するかについてのアサーションを指定します。


    注 -

    これらの指定は、ソースコードへの注釈の挿入を使ってロック lint に伝えることもできます。「ソースコードへの注釈の挿入」を参照してください。


  5. どの関数がルートであるかについてロック lint が正しく認識しているかをチェックします。

    funcs -o サブコマンドがルート関数をルート (基点) として提示しない場合は、declare root サブコマンドを使って修正してください。funcs -o が非ルート関数をルートとして提示する場合は、declare... targets サブコマンドを使ってその関数を関数ターゲットとしてリストアップしている可能性が考えられます。ルート関数の詳細については、declare root funcを参照してください。

  6. assert rwlock サブコマンドを使って、階層的ロック関係 (存在する場合。ただし、まれです) を記述します。


    注 -

    これらの指定は、ソースコードへ注釈の挿入を使ってロック lint に伝えることもできます。「ソースコードへの注釈の挿入」 を参照してください。


  7. ignore サブコマンドを使って、解析から除外したい関数および変数を無視します。

    ignore コマンドの使用はできるだけ控えてください。このサブコマンドに相当するソースコードへの注釈の挿入 (例:NO_COMPETING_THREADS_NOW) もできる限り使用しないでください。

  8. analyze サブコマンドを使って解析を実行します。

  9. エラーを処理します。

    この操作には、#ifdef__lock_lint (「ロック lint の制限事項」を参照) を使ったソースの修正、あるいは手順 3、4、6、7 を遂行するためのソースコードへの注釈の挿入 (「ソースコードへの注釈の挿入」を参照) などが含まれます。

    ロック lint を解析以前の状態に戻し、必要ならば解析を再実行してください。


    注 -

    エラーは順番に処理することがベストです。順番が逆になると、関数のエントリに際して保持されないロックの問題、あるいは保持されていないのに解放されてしまうロックの問題によって、正常に保護されない変数についての誤ったメッセージが多数生じてしまいます。


  10. analyze -v サブコマンドを使った解析を実行して、上記の手順を繰り返します。

  11. analyze サブコマンドからのエラーがなくなったら、いかなるロックからも正常に保護されない変数をチェックします。

    以下のコマンドを使用してください。

lock_lint vars -h | fgrep ¥*

適切なアサーションを使った解析を再実行し、どこで、適切にロックされないまま変数がアクセスされているかを見つけてください。

まったく同じ状態に対して analyze を 2 回実行することはできないので、analyze を実行する前に、save サブコマンドを使ってロック lint の状態を保存しておくことをお薦めします。また、ほかのアサーションを追加する前に、refresh または restore を使ってその状態を復元してください。analyze 前に自動的に保存を実行する、analyze 用のエイリアスを設定しておくと良いでしょう。