我正在对多线程程序进行压力测试并收集覆盖率。 据我所知,当程序被_exit()或某些信号(如SIGABRT,SIGSEGV等)终止时,gcov不会生成.gcda文件。
当程序崩溃时,核心文件由信号生成,并且不生成gcov覆盖数据。显然,我可以处理信号并生成覆盖数据,但在这种情况下,我无法生成核心转储文件。但是我想生成核心转储和gcov数据文件以找出崩溃的原因。
我的问题是有没有办法在没有信号的情况下生成核心转储,或者在程序突然终止时有没有办法生成gcov覆盖数据文件?
答案 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%的线路覆盖率。
同样通过测试,如果你做某种类型的崩溃,很容易在源代码管理中禁用测试,直到它被修复。