kwinject 対応ビルドでのローカルビルドプロセスの失敗

場合によっては、kwinject のプロセスのインターセプト/モニター機能がプロセス自体に干渉することがあります。

キーワードのアタッチとデタッチを使用して、ビルドのモニター中に kwinject がインターセプトしないコマンドのリストを指定できます。kwinject は、開始直後に指定されたプロセスからデタッチします。

Linux では、kwinject を実行するときに最上位プロセスは無視されます。子プロセスで kwinject をデタッチできます。

kwinject がデタッチする一連のコマンドを定義するには、コンパイラのマッピングファイルを編集します。このコンパイラマッピングファイルは、<klocwork_install>/config/kwfilter.conf にあります。

デタッチするコマンドのリストが短い場合、detach 行を 1 行 kwfilter.conf に追加します。

コマンドのリストが長くなる場合、detach キーワードを使用してパターンを指定します ("このディレクトリ内のすべてのプログラムからデタッチする" または "特定の接頭辞が付いたすべてのプログラムからデタッチする" など)。attach キーワードを使用すると、デタッチ規則の例外を追加できます ("コンパイラとリンカー以外のすべてのプログラムからデタッチする" など)。

attach 行とdetach 行は、適用されるコンパイラのフィルターバインディング行より下に追加され、次の構文を使用している必要があります。

detach <prog_name>[, <prog_name> ...]

フィールド<prog_name> には、kwinject がインターセプトしない 1 つまたは複数の実行ファイル名が入ります。

attach <prog_name>[, <prog_name> ...]

フィールド<prog_name> には、detach キーワードを使用して指定した規則の 1 つまたは複数の例外が入ります。

<prog_name> には、次の形式のいずれかを使用してください。

  • コマンドの短い名前 (cl.exe など)
  • コマンドへの絶対パス
  • 部分パス (sdk\bin\cl.exe など)

<prog_name> は、glob に類似したパターンを使用するため、以下を含むことができます。

  • * ワイルドカード (あらゆる並び順の文字) - 例: sdk\bin\*.exe
  • ?ワイルドカード (任意の文字)

例 1: デタッチキーワードの使用 (Windows)

filter mscompile cl
...
detach bad1.exe, bad2.exe

例 2: アタッチキーワードとデタッチキーワードの両方の使用 (Windows)

filter mscompile cl
...
attach build.exe, nmake.exe
detach public\common\bin\*.exe, sdk\bin\*.exe
detach msbuild.exe 

例 3: 子プロセスを使用した kwinject のデタッチ (Linux)

「子」と呼ばれるプロセスをデタッチするには、次のステップを考慮します。

  1. 「子」と呼ばれる子プロセスを、次の内容で作成します。

    #!/bin/sh
    gcc test.c
  2. kwfilter.conf に次の行を追加します。

    detach child
    子プロセスにはコンパイルが含まれているため、kwinject でそれを直接呼び出すことで、ビルドスペックを引き続き作成できます。この例では、デタッチは適用されません。
    kwinject ./child
  3. 子プロセスを呼び出す内容で、「親」と呼ばれる親プロセスを作成します。

    #!/bin/sh
    ./child
  4. 子プロセスをデタッチするには、kwinject でプロセスを呼び出す必要があります。これにより、子プロセスにデタッチが適用されるため、コンパイルは追跡されず、ビルドスペックは空になります。

    kwinject ./parent