核心转储和gcov覆盖率报告

时间:2011-04-17 20:04:42

标签: c++ c linux code-coverage gcov

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

当程序崩溃时,核心文件由信号生成,并且不生成gcov覆盖数据。显然,我可以处理信号并生成覆盖数据,但在这种情况下,我无法生成核心转储文件。但是我想生成核心转储和gcov数据文件以找出崩溃的原因。

我的问题是有没有办法在没有信号的情况下生成核心转储,或者在程序突然终止时有没有办法生成gcov覆盖数据文件?

4 个答案:

答案 0 :(得分:3)

如果您需要自动进行代码覆盖率的回归测试。试试这个:

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'

答案 1 :(得分:1)

您需要做的是,在开始测量测试覆盖率之前修复错误。

如果您的程序未能通过其他测试,则覆盖信息无论如何都毫无意义。崩溃显然是某种失败,所以你需要解决这个问题。

修复错误,然后你就可以了解你的(无故障)程序的有效性。

如果您编写一个自动化测试来重现崩溃,以确保它不会随后退回,这可能会有所帮助吗?

答案 2 :(得分:0)

查看valgrind(或发布代码以便我们提供帮助)

答案 3 :(得分:0)

我主要是在运行测试时使用代码覆盖率 - 确定性测试。通过单元测试可以(并且可取)获得100%的线路覆盖率。

同样通过测试,如果你某种类型的崩溃,很容易在源代码管理中禁用测试,直到它被修复。