3

我正在对多线程程序进行压力测试并收集覆盖率。据我所知,当程序被 _exit() 或某些信号(如 SIGABRT、SIGSEGV 等)终止时,gcov 不会生成 .gcda 文件。

当程序崩溃时,core 文件由信号生成,而 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 回答