GCOV交叉分析:__ gcov_flush()不会刷新共享库的覆盖率数据

时间:2015-06-19 02:57:21

标签: code-coverage gcov

我正在尝试为基于arm的嵌入式系统获取代码覆盖率。使用x86进行交叉编译。基本上,我有一个交叉分析问题。

对于我想要生成代码覆盖率数据的应用程序,我已经定义了一个信号处理程序,我在其中调用__gcov_flush()以将代码覆盖率数据刷新到.gcda文件。我正在向应用程序发送SIGUSR1。该应用程序使用多个.so文件,其中实现了大量代码和逻辑。

当我将信号发送到进程时,只创建/更新应用程序的.gcda文件。根本没有创建/更新.so的.gcda文件。

有没有办法让__gcov_flush()刷新应用程序正在使用的.so的所有覆盖数据?

我不想强迫应用程序exit(),因为这会破坏我想要做的目的。我需要能够转储应用程序的覆盖率数据以及它在运行时使用的.so。 请帮忙!!

使用ARM GCC v4.5.1。

这是我到目前为止生成的代码覆盖率数据:

我在Master makefile中为GCC定义了以下选项: CFLAGS += -fprofile-arcs -ftest-coverage LDFLAGS += -fprofile-arcs -ftest-coverage

我还在目标系统上导出GCOV_PREFIXGCOV_PREFIX_STRIP作为全局环境变量,以强制在特定路径中创建.gcda文件。这很有效。

我唯一的问题是当从应用程序调用{​​{1}}时,.so的.gcda文件没有被创建/更新。

1 个答案:

答案 0 :(得分:2)

这个问题在GCC邮件列表中得到了回答。 TLDR:需要在每个使用的共享库中添加一个处理程序,它将转储coverage数据。然后需要调用这些处理程序。

详细答案如下: https://gcc.gnu.org/ml/gcc-help/2015-06/msg00135.html