我正在尝试为基于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_PREFIX
和GCOV_PREFIX_STRIP
作为全局环境变量,以强制在特定路径中创建.gcda文件。这很有效。
我唯一的问题是当从应用程序调用{{1}}时,.so的.gcda文件没有被创建/更新。
答案 0 :(得分:2)
这个问题在GCC邮件列表中得到了回答。 TLDR:需要在每个使用的共享库中添加一个处理程序,它将转储coverage数据。然后需要调用这些处理程序。
详细答案如下: https://gcc.gnu.org/ml/gcc-help/2015-06/msg00135.html