4

とを使用したバイナリビルドが-fprofile-arcsあり-ftest-coverageます。バイナリは、プロセスを子プロセスとして生成するプロセスモニターによって実行されます。次に、プロセスを終了する場合は、プロセスモニターを通過する必要があります。プロセスにを送信しSIGKILLます。.gcdaこの場合、ファイルが生成されないことがわかりました。私に何ができる?

編集:実際には、プロセスモニターは最初にプロセスを終了させようとします。ただし、ユーザーがプロセスを停止するコマンドを発行したときでは_exitなく、ProcessMonitorライブラリ(各プロセスで使用)が呼び出されます。exitこれがすべてのトラブルの原因です。

4

3 に答える 3

4

これはうまくいくかもしれません:http: //nixcraft.com/coding-general/12544-gcov-g.html

要約すると、プログラムで__gcov_flush()を呼び出します。おそらく、シグナルハンドラーで、または実行中に定期的に呼び出します。

C ++コードの場合、関数のextern"C"宣言を行うことを忘れないでください。

また、プロファイリングを使用してビルドされていないときにプログラムがプリプロセッサを呼び出さないように、ある種のプリプロセッサifdefを使用することを忘れないでください。

于 2010-12-08T20:33:20.443 に答える
3

SIGKILLは「ハード」キルシグナルであり、アプリケーションでキャッチすることはできません。したがって、アプリはファイルを書き出す機会がありません.gcda

2つのオプションがあります。

  1. 以外のキャッチシグナルSIGKILL:賢明なプロセスモニターはSIGTERM最初に送信する必要があります。initそして私が遭遇したバッチマネージャーはこれを行います。は最後の手段であるため、猶予期間が続いたSIGKILL後にのみ送信する必要があります。SIGTERM
  2. SIGKILL回避策: ;を取得する中間プログラムを介してプログラムを実行します。親がまだ生きているかどうかを定期的に(または別のスレッドで)実際のプログラムにチェックさせ、生きていない場合は正常に終了させます。
于 2010-12-08T12:31:41.993 に答える
0

Afaikコンパイラ(IntelCも)は、プロファイリング統計のみを出口ハンドラに格納します。では、プロセスを強制終了するのではなく、プロセスを終了するように指示するのはどうでしょうか。SIGKILLハンドラーを追加するのと同じように、exit()を使用しますか?

于 2010-12-08T07:49:12.990 に答える