我正试图获得一个基于arm的嵌入式系统的代码覆盖率。使用x86进行交叉compilation.So,基本上,我有一个交叉分析问题。
对于我想要生成代码覆盖数据的应用程序,我定义了一个信号处理程序,在其中调用__gcov_flush()将代码覆盖数据刷新到.gcda文件中。我将SIGUSR1发送到应用程序。应用程序使用多个.so文件,其中实现了大量的代码和逻辑。
当我向进程发送信号时,仅用于应用程序的.gcda文件就会被创建/更新。没有创建/更新..so的.gcda文件。
是否有一种方法可以让__gcov_flush()刷新应用程序使用的..so的所有覆盖数据?
我不想强迫应用程序到exit(),因为这将违背我试图做的事情的目的。我需要能够转储应用程序和它在运行时使用的.so的覆盖率数据。救命啊!!
使用ARM GCC v4.5.1。
这就是我到目前为止为生成代码覆盖数据所做的工作:
我在“大师制作”中为GCC定义了以下选项:CFLAGS += -fprofile-arcs -ftest-coverage LDFLAGS += -fprofile-arcs -ftest-coverage
我还将GCOV_PREFIX和GCOV_PREFIX_STRIP导出为目标系统上的全局环境变量,以强制在特定路径中创建.gcda文件。这很管用。
我唯一的问题是..so的.gcda文件在从应用程序中调用__gcov_flush()时不会被创建/更新。
发布于 2015-07-24 17:21:34
这个问题在GCC的邮件列表上得到了回答。TLDR:需要在所使用的每个共享库中添加一个处理程序,这将转储覆盖数据。然后需要调用这些处理程序。
以下是邮寄名单的详细答复。
邮寄名单上的问题
2015年6月19日星期五,Utpal Patel写道: 我正试图获得一个基于arm的嵌入式系统的代码覆盖率。使用x86进行交叉compilation.So,基本上,我有一个交叉分析问题。 对于我想要生成代码覆盖数据的应用程序,我定义了一个信号处理程序,在其中调用__gcov_flush()将代码覆盖数据刷新到.gcda文件中。我将SIGUSR1发送到应用程序。应用程序使用多个.so文件,其中实现了大量的代码和逻辑。 当我向进程发送信号时,仅用于应用程序的.gcda文件就会被创建/更新。没有创建/更新..so的.gcda文件。 是否有一种方法可以让__gcov_flush()刷新应用程序使用的..so的所有覆盖数据? 我不想强迫应用程序退出(),因为这将违背我试图做的事情的目的。我需要能够转储应用程序和它在运行时使用的.so的覆盖率数据。救命啊!!
从邮件列表中回答
当您使用
-fprofile-arcs -ftest-coverage编译应用程序时,只对应用程序进行检测(从概念上讲,应用程序的每个基本块中有一个64位计数器,最小跨度树),而这些计数器就是__gcov_flush()正在转储的计数器。 因此,如果您想要从库中获取分析信息,您需要编译用于分析的库,因为gcov是一种静态工具,如果没有像您的应用程序那样编译它来进行分析,就无法从.so获得信息。如果应用程序是为分析而编译的,那么当您调用__gcov_flush()时,它的数据将被转储,但是由于您不能向库发送信号来调用某个处理程序,所以需要在库中安装其他机制,例如,蛮力 int libdump(void) { __gcov_flush();} 进入库并从应用程序信号处理程序调用它,就像现在调用__gcov_flush();一样。 这是来自一个简单的库,它只提供了一个打开的调用,它是libc open和libdump函数的包装器。 2: 77:int libdump(void) { 2: 78:__gcov_flush();1: 79:返回0;-:80:} -:81:/*我们现在可以获得代码覆盖库*/ 145: 82:int open(const char *pathname,int标志,mode_t模式){ 145: 83:返回__open(路径名,标志,模式);-:84:} 这个库是用 gcc -fPIC -Wall -g -O2 -fprofile-arcs -Wall -shared -o libgctest.so.0 libgc.c 应用程序在信号处理程序中有libdump()。 int libdump( void );void gc_handler(int signum) {printf(“接收信号\n”);__gcov_flush();接收SIGUSR1 */ libdump()的/*转储覆盖数据;/*和转储库转换数据*/ } 并被编译为 gcc -O2 -fprofile-arcs coverage hello.c -o hello -lgctestkill -10 <PIDOF application>现在将转储应用程序和库的gcda。 赫夫拉特 ps:我不知道为什么lib处理程序中返回0行的计数也没有2.
https://stackoverflow.com/questions/30929205
复制相似问题