3

マルチスレッドプログラムでストレステストを行い、カバレッジも収集しています。私の知る限り、プログラムが _exit() または SIGABRT、SIGSEGV などのシグナルによって終了された場合、gcov は .gcda ファイルを生成しません。

プログラムがクラッシュすると、シグナルによってコア ファイルが生成され、gcov カバレッジ データは生成されません。もちろん、信号を処理してカバレッジ データを生成することはできましたが、この場合、コア ダンプ ファイルを生成できませんでした。しかし、クラッシュの原因を突き止めるために、コア ダンプと gcov データ ファイルの両方を生成したいと考えています。

私の質問は、信号なしでコア ダンプを生成する方法はありますか、またはプログラムが突然終了したときに gcov カバレッジ データ ファイルを生成する方法はありますか?

4

4 に答える 4

4

コード カバレッジの回帰テストを自動的に行う必要がある場合。これを試して:

https://www.osadl.org/Dumping-gcov-data-at-runtime-simple-ex.online-coverage-analysis.0.html

プログラムの「main.c」内に次のように記述します。

static unsigned long long i = 0;
void __gcov_flush(void); /* check in gcc sources gcc/gcov-io.h for the prototype */

void my_handler(int signum)
{
  printf("received signal\n");
  printf("%llu\n", i);
  __gcov_flush(); /* dump coverage data on receiving SIGUSR1 */
}

int main(int argc, char **argv)
{
  struct sigaction new_action, old_action;
  int n;

  /* setup signal hander */
  new_action.sa_handler = my_handler;
  sigemptyset(&new_action.sa_mask);
  new_action.sa_flags = 0;

  sigaction(SIGUSR1, NULL, &old_action);
  if (old_action.sa_handler != SIG_IGN)
    sigaction (SIGUSR1, &new_action, NULL);
  //blah......

次に、プログラムを再構築して実行します。

$ ./hello &
$ killall -USR1 hello
received signal
2514147346

このようにして、引き続き .gcda ファイルを生成する必要があります

$ gcov hello
File 'hello.c'
Lines executed:100.00% of 14
hello.c:creating 'hello.c.gcov'
于 2011-11-16T06:50:12.703 に答える
2

テスト カバレッジの測定を開始する前に、バグを修正する必要があります。

プログラムが他のテストに失敗した場合、カバレッジ情報はとにかく無意味です。クラッシュは明らかに何らかの障害であるため、これを修正する必要があります。

バグを修正すると、(欠陥のない) プログラムがどれだけ効果的にテストされているかがわかります。

おそらく、クラッシュを再現する自動テストを作成して、後で後退しないことを確認すると役立つでしょうか?

于 2011-04-17T20:17:41.443 に答える
0

私は、テスト (決定論的テスト) を実行している間はコード カバレッジのみを使用することを強く支持しています。単体テストで 100% のライン カバレッジを取得することは可能です (そして望ましいことです)。

また、テストでは、何らかのクラッシュが発生した場合、修正されるまでソース管理でテストを無効にするのは簡単です

于 2011-04-18T19:03:56.647 に答える
0

valgrindを見てください(または、私たちがお手伝いできるようにコードを投稿してください) 。

于 2011-04-17T21:18:32.880 に答える