经历过无数次失败后,就在刚刚,我已经成功移植Bullseye—arm版本,解决了手机项目,尤其是在arm平台上运行的linux内核项目无法使用bullseye的难题。详细过程见内:
Bullseye Coverage统计代码的原理(linux 系统):
1. 项目编译过程,Bullseye Coverage在后台运行,并且监控所有的编译命令,项目编译成功后,会生成一个.cov文件,文件中记录了详细的被统计的函数(对象)
2. 项目运行过程,会自动往.cov文件中写执行的覆盖率数据。(即使这时候Bullseye Coverage关闭不运行,照样可以往.cov中写数据,已经经过例子验证过。)
由于Bullseye Coverage是这样的工作方式,正好有利于Bullseye Coverage在arm平台上的使用。
思路:
1. 很多arm平台上的手机项目,他们都是先在x86平台linux系统下写代码,然后交叉编译,编译好后烧录到手机中,运行手机的app,就可以运行他们写的内核代码。
2. 所以,我们Bullseye Coverage可以在x86平台linux下经过交叉编译后,项目编译时候产生arm版本的.cov文件,然后将.cov文件(空的没有数据)和项目编译好得代码一起烧录到手机上,当手机运行的
时候,产生的覆盖率统计数据会写入.cov文件,然后将.cov文件拷贝到PC机器上,取出里面的覆盖率数据。——大功告成。O(∩_∩)O哈哈~
移植方法:
假设Bullseye Coverage安装在linux系统的 /opt/Bullseye Coverage/目录下。并且安装好交叉编译环境
项目编译要建立交叉编译,那么Bullseye Coverage工具也要建立一个交叉编译的工作,产生一个libcov-arm-none-linux-gnueabi.a文件和libcov-cross.o文件
这两个文件就是当交叉编译项目的时候编译的时候,会产生一个.cov文件
1. 修改/opt/Bullseye Coverage/run目录下的Makefile文件内容如下:
CC=arm-none-linux-gnueabi-gcc -D_REENTRANT -fPIC -O3
ar=arm-none-linux-gnueabi-ar
# Avoid generating __i686.get_pc_thunk.bx symbol
#CC := $(CC) -march=i586
build: ../lib/libcov-arm-none-linux-gnueabi.a
../lib/libcov-arm-none-linux-gnueabi.a: libcov-cross.o
ar -rc $@ $?
libcov-cross.o: libcov-posix.c
$(CC) -c -o $@ -DLibcov_noAutoSave libcov-posix.c
2. 编译项目
export PATH=/opt/BullseyeCoverage/bin:$PATH
cov01 -1
make
我用的是xxx_arm版本的例子来做实验。请看下面截图:
1. 首先,不开启Bullseye 时候 xxx—arm版本可以正常编译,编译出得运行文件是二进制文件,在X86机器上无法运行。
2. 开启bullseye,再次编译,产生。Cov文件
3. 查看。Cov文件是否统计了arm项目编译好的里面的函数,请看:
成功,已经成功产生了.cov文件,并且里面统计的函数完全正确,目前覆盖率为0,是因为项目没有运行,在x86平台下无法运行编译好的可执行文件,我们只需用将编译好的xxxx可执行文件和。Cov文件一起烧录到手机上,运行下即可产生数据。