移植 bullseye coverage—arm 版本

2023-10-31 17:48

本文主要是介绍移植 bullseye coverage—arm 版本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     经历过无数次失败后,就在刚刚,我已经成功移植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文件一起烧录到手机上,运行下即可产生数据。

 

 

 


 
   

 

 

这篇关于移植 bullseye coverage—arm 版本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/317050

相关文章

java中不同版本JSONObject区别小结

《java中不同版本JSONObject区别小结》本文主要介绍了java中不同版本JSONObject区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1. FastjsON2. Jackson3. Gson4. org.json6. 总结在Jav

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系