Linux进程核心代码怎么查看,GCOV查看arm-linux代码覆盖率

一、关于gcov工具

gcov伴随gcc发布。gcc编译加入-fprofile-arcs -ftest-coverage参数生成二进制程序,执行测试用例生成代码覆盖率信息。1、如何使用gcov

用GCC编译的时候加上-fprofile-arcs -ftest-coverage选项,链接的时候也加上。fprofile-arcs参数使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵(instrumented):gcc添加了代码来清点这些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码(instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵工具代码。

gcov主要使用.gcno和.gcda两个文件。.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息(而gcda只能在程序运行完毕后才能产生的)。Gcov执行函数覆盖、语句覆盖和分支覆盖。

举个例子,程序代码由main.c和tmp.c两个文件组成,编译、链接、运行程序编译:gcc -fprofile-arcs -ftest-coverage -o myapp main.c tmp.c运行:./myapp然后输入命令:gcov main.c,gcov tmp.c

这个时候当前目录下有了新的文档main.c.gcov,和tmp.c.gcov若想保存覆盖率文件,上述命令修改为:命令:gcov main.c >>yourfilename,gcov tmp.c >>yourfilename

而这时候的main.c.gcov,和tmp.c.gcov就包含了函数和代码执行次数的信息,我们可以查看结果:-:   65:/***************************************************************************************

-:   66: * name         : main

-:   67: * return       : 0 OK

-:   68: *                other ERROR

-:   69: * history      : 2006-06-13

-:   70:****************************************************************************************/

-:   71:int main( int argc, char *argv[] )                                                      /* the entrance for program

*/

function main called 4 returned 100% blocks executed 81%

4:   72:{

4:   73:        int loop = 0 ;

4:   74:        int ret = OK ;

4:   75:        int empty_line = 0 ;

4:   76:        int code_line = 0 ;

4:   77:        int annotation_line = 0 ;

4:   78:        struct stat file_stat ;                                                         /* use for file state */

4:   79:        char recu_name[256] ;

4:   80:        char *pwd = NULL ;

4:   81:        char *tmp = NULL ;

-:   82:

4:   83:        if( argc = MAX_FILE ){                                    /* file size larger than max size */

#####:   98:                        printf( "file [%s] size is over 64K! \ncontinue....\n", argv[loop] ) ;

#####:   99:                        continue ;

-: 100:                }

#####这就是表示没跑到的

各个参数使用如下:gcov [-b] [-c] [-v] [-n] [-l] [-f] [-o directory] sourcefile

-b

Write branch frequencies to the output file, and write branch summary info to the standard output. This option allows you to

see how often each branch in your program was taken.

//b(ranch),分支测试-c

Write branch frequencies as the number of branches taken, rather than the percentage of branches taken.

-v

Display the gcov version number (on the standard error stream).

//太简单了吧,我上面用了-n

Do not create the gcov output file.

-l

Create long file names for included source files. For example, if the header file `x.h' contains code, and was included in the

file `a.c', then running gcov on the file `a.c' will produce an output file called `a.c.x.h.gcov' instead of `x.h.gcov'. This can

be useful if `x.h' is included in multiple source files.

-f

Output summaries for each function in addition to the file level summary.

-o

The directory where the object files live. Gcov will search for `.bb', `.bbg', and `.da' files in this directory.新版的是这么说的-o directory│file

--object-directory directory

--object-file file

Specify either the directory containing the gcov data files, or the

object path name. The .gcno, and .gcda data files are searched for

using this option. If a directory is specified, the data files are

in that directory and named after the source file name, without its

extension. If a file is specified here, the data files are named

after that file, without its extension. If this option is not sup-

plied, it defaults to the current directory.其他的更有新版的-u,

-u

--unconditional-branches

When branch counts are given, include those of unconditional

branches. Unconditional branches are normally not interesting.

-p

--preserve-paths

Preserve complete path information in the names of generated .gcov

files. Without this option, just the filename component is used.

With this option, all directories are used, with ’/’ characters

translated to ’#’ characters, ’.’ directory components removed and

’..’ components renamed to ’^’. This is useful if sourcefiles are

in several different directories. It also affects the -l option.

二、关于lcov

Lcov则是上的gcov结果展现的一个前端,可以将覆盖率信息转换成html展现。

1.如何访问用户空间应用程序代码覆盖数据的示例---------------------------------------------------------------------前提条件:使用GCC以-fprofile-arcs和-ftest-coverage选项编译程序。假设编译目录名称为"/root/test/code_cover/",然后执行:

以我的一个实例/root/test/code_cover/下的fork.c为例看代码的覆盖率:

首先进入/root/test/code_cover/目录a)重置计数器lcov --directory . --zerocounters

b)收集当前代码覆盖状态到一个文件(应用程序启动和停止至少一次后,该命令才能正常工作)lcov --directory . --capture --output-file app.info

Capturing coverage data from .

Found gcov version: 3.4.6

Scanning . for .gcda files ...

Found 1 data files in .

Processing ./TestQuery.gcda

Finished .info-file creation

c)获取HTML输出genhtml -o results app.info

其中的“-o results”是指示结果存放在什么位置的。

Readingdata file app.info

Found 18 entries.

Found common filename prefix "/home/search/isearch_yb/src"

Writing .css and .png files.

Generating output.

Processing file cpp/core/basis/GlobalDef.h

Processing file cpp/core/search/QueryCache.h

...

Writing directory view page.

Overall coverage rate: 117 of 514 lines (22.8%)使用web浏览器打开index.html文件查看代码覆盖结果。100111205532.jpg

三、Linux内核覆盖率测试:

将最终的gcov内核模块文件复制到system wide modules目录或者PERL脚本所在目录。以root身份,执行:

Gcov:在对Linux内核程序进行代码覆盖率测试时,同样可以采用gcov,但是需要对kernel打一个补丁。Gcov的内核补丁下载地址:。下载gcov内核补丁(wget),解压补丁,然后为一个kernel打补丁(patch –p1 < /home/linux-v3.4-mem/gcov-kernel-2/linux-2.6.18-gcov.patch)注意打补丁时应该处于内核的主目录下也即/home/linux-v3.4-mem,打完补丁之后,通过make menuconfig配置gcov,配置页面显示如下:

100111205642.jpg

配置完毕之后,重新编译内核,将编译成功的gcov这个内核模块/home/linux-v3.4-mem /kernel/gcov/gcov-proc.ko拷贝到网络文件系统下面,arm linux系统启动后加载这个模块

(1)/insmod gcov-proc.ko

然后再跑其他测试程序,跑了一段时间,你会发现在/proc/gcov目录下有各种gcov的统计文件:

/proc/gcov # ls

arch      crypto    init      kernel    security  vmlinux

block     drivers   ipc       net       sound

把这整个目录拷贝到fedora虚拟机下的一个目录,我是拷贝到/nfs/kernel_test/gcov目录下,然后

(2)收集当前代码覆盖状态到一个文件lcov --directory . --output-file kernel.info

(3)获取HTML输出genhtml kernel.info使用web浏览器打开index.html文件查看代码覆盖结果。

100111205817.jpg

上面是怎样获取内核运行代码覆盖率的一般方法及流程。

但如果我们只想获取一个程序运行时的内核代码覆盖率,改怎么办呢???

这里先说几个gcov-proc模块的特性:

(1)模块属性:

我们发现/sys/module/gcov_proc下有parameters文件夹,进去我们发现有两个属性文件:

/sys/module/gcov_proc/parameters # ls

gcov_linkgcov_persist

这两个属性是控制什么的呢???看看官方表述:

- gcov_link=0/1 (default is 1): When set to non-zero, symbolic links to

source and gcov graph files are created in /proc/gcov along with the data

files.

- gcov_persist=0/1 (default is 0): When set to non-zero, gcov data for

kernel modules is kept even after those modules are unloaded so that

coverage measurements can be extended to module cleanup code. To clear

this persistent data, write to /proc/vmlinux.

(2)重启内核覆盖率采集的数据

To reset coverage data for a specific file, simply write to the associated data

file in the /proc/gcov hierarchy:

echo 0 > /proc/gcov/kernel/signal.da

To reset all coverage data, write to the extra file '/proc/gcov/vmlinux':

echo 0 > /proc/gcov/vmlinux

四、获取程序运行时段的内核覆盖率

我的方法是在运行应用程序(这里面是以我的/nfs/memtest/timetest下的timetest应用程序为例)的开始先用“echo 0 > /proc/gcov/vmlinux”指令将我们的/proc/gcov下的统计信息全部清空让它重新计数的,下面说下我们的方法和步骤:

1、先获得一个含义gcov信息的内核和gcov-proc.ko,这个上面已经说过了;

2、启动linux内核,然后安装gcov-proc.ko

/memtest # insmod gcov-proc.ko

gcov-proc: initializing proc module: persist=0 link=1 format=gcc 3.4

gcov-proc: init done

/memtest # cd timetest/

/memtest/timetest # ls

20100106.logfp2timetesttimetest.ctimetest.gcno

20100111.logresultstimetest-lcovtimetest.gcda

3、这时先用“echo 0 > /proc/gcov/vmlinux”指令清空gcov,然后运行timetest,然后将

/proc/gcov拷贝到/tmp下面,这是防止直接拷到虚拟机下会产生大量的网络函数调用,增加统计误差。

/memtest/timetest # echo 0 > /proc/gcov/vmlinux && ./timetest && cp -r /proc/gcov/ /tmp

game over count1 is 0xc9413e40,count2 is 0x0,count3 is 0x3c8b1e45,count4 is 0x0

/memtest/timetest # ls /tmp

gcov

4、现在统计的数据是放在/tp/gcov下面的,我们需要将之拷贝到上位机的虚拟机中才能分析,因为我们的lcov只能在虚拟机中才能运行的。

/memtest/timetest # cp -r /tmp/gcov/ ./

/memtest/timetest #

5、现在需要转到虚拟机下接着运行lcov来产生最后的html页面了。

[root@localhost timetest]# cd gcov/

[root@localhost gcov]# lcov --directory . --capture --output-file timetest.info

[root@localhost gcov]# genhtml -o results timetest.info

这样就生成了最后基本上只运行在timetest时间段的内核代码覆盖率了。

100111205915.jpg100111210008.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于华为,英特尔与微软表示继续提供支持;亚马逊亲证云计算服务出现宕机;中国移动5G套餐曝光,每月都含200G流量……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 小米CC全新系列小王子&小…

Linux 环境 zookeeper集群安装、配置、验证

架构说明&#xff1a; Dubbo 建议使用 Zookeeper 作为服务的注册中心。Zookeeper 集群中只要有过半的节点是正常的情况下&#xff0c;那么整个集群对外就是可用的。正是基于这个特性&#xff0c; 要将 ZK 集群的节点数量要为奇数&#xff08;2n1&#xff1a; 如 3、 5、 7 个节…

5G 来了,我们可以做什么?

5G 清风徐来&#xff0c;静待应用花开。这是最好的时代&#xff0c;也是最具挑战的时代。当下就国内而言&#xff0c;随着四张 5G 商用牌照的正式发放&#xff0c;运营商们纷纷扩大并加快了建网的规模与速度&#xff1b;手机厂商们也早已于今年年初相继推出了 5G 手机&#xff…

SpringBoot项目去除druid监控的底部广告

文章目录一、阿里Druid广告的介绍二、引入Druid的Starter依赖三、编写配置类,进行广告的去除四 、启动项目进行测试五、原理说明一、阿里Druid广告的介绍 如果使用的是阿里Druid的数据库连接池,那么会自带一个数据库的监控页面. 但是其页面底部会有阿里的广告,如下图所示,并且…

精简linux操作系统,Tiny Core Linux—仅10多MB的精简Linux 操作系统发行版

Tiny Core Linux是一款很简约的桌面Linux&#xff0c;体积小且可高度可扩展&#xff0c;基于Linux 3.x内核、Busybox、Tiny X、FLTK图形用户界面、JWM窗口管理器。像其他操作系统最少也要几百MB了&#xff0c;Tiny Core Linux不仅体积小&#xff0c;对硬件配置要求也很高&#…

面试官问你MyBatis中有哪些设计模式,把这篇文章发给他

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 疯狂的蚂蚁来源 | https://dwz.cn/KFgol1De之前总结过一篇Spring中用到了哪些设计模式&#xff1a;《面试官:“谈谈Spring中都用到了那些设计模式?”》&#xff0c;昨晚看到了一篇很不错的一篇介绍MyBatis中都用到了那些设计…

腾讯云首次公开边缘计算网络开源平台,拥抱5G与万物互联

6月25日&#xff0c;由Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会在上海举办&#xff0c;腾讯云对外展示自身在边缘计算领域的最新进展&#xff0c;首次公开腾讯智能边缘计算网络平台TSEC&#xff08;Tencent Smart Edge Connector&#xff09;&#xff0…

解决SecureCRT与SecureFX中文乱码问题

文章目录一、SecureCRT中文乱码问题解决方法&#xff1a;二、SecureFX中文乱码问题解决方法&#xff1a;2.1. 找到SecureFX配置文件夹2.2. 在配置文件夹下的Sessions子目录中&#xff0c;找到SecureCRT连接对应的Session文件&#xff08;.ini扩展名&#xff09;&#xff0c;双击…

OpenStack精华问答 | OpenStack服务介绍

关于OpenStack的争议,从未停止&#xff0c;每每关于它的消息&#xff0c;都会一石激起千层浪。今天就让我们看看关于OpenStack的问答吧。1Q : OpenStack服务介绍A : MySQL为各个服务器提供数据存储RabbitMq:为各个服务之间提供通信认证和服务注册Keystone&#xff1a;为各个服务…

实战04_redis-cluster集群搭建

接上一篇:实战_03_Redis基础命令https://blog.csdn.net/weixin_40816738/article/details/99213524 #安装gcc yum install gcc-c #使用yum命令安装 ruby &#xff08;我们需要使用ruby脚本来实现集群搭建&#xff09; yum install ruby yum install rubygems #将redis源码包上…

linux网站渗透工具包,ubuntu下安装 kali linux 渗透工具包

相信用过linux系统的盆友都听说过kali linux 它是一个非常好的用于渗透测试的Linux发行版。但是如何在ubuntu下使用kali linux 的渗透工具嘞&#xff01;LionSec开发出了一个python工具&#xff0c;叫做Katoolin&#xff0c;它可以让你在其他Linux发行版上使用Kali的全部工具。…

OCP China Day“登陆”,最新技术、方案吸睛!

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘晶晶众所周知&#xff0c;OCP在2011年由Facebook发起成立&#xff0c;核心会员超过200家&#xff0c;其中更是包括Google、微软、Intel、IBM等企业&#xff0c;超过7000家企业参与了该社区的活动&#xff1b;2018年OCP非董…

SpringBoot集成Shiro前后端分离使用redis做缓存

文章目录一 、shiro介绍1、基础介绍2、基本功能点3、基本流程图二、 常用的权限管理表关系2.1. 表组成2.2. 表结构三、实战案例3.1. 案例介绍3.2. 依赖3.3. Shiro全局配置3.4. 自定义ShiroRealm3.5. ShiroUtils3.6. 自定义SessionManager3.7. 登录/出主方法3.8. 测试主方法四、…

边缘计算容器化是否有必要?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | Steve来源 | 边缘计算中文社区简要由于容器有轻量级、安全性、秒级启动等优秀的特性&#xff0c;容器天然的轻量化和可移植性&#xff0c;非常适合边缘计算的场景&#xff0c;这一点边缘计算的厂家和开发者们都心知肚明。而且…

ipcp协议 Linux,Linux命令Man解释:PPPD(8) :点对点daemon协议

名称pppd - 点对点协定隐形程式(Point to Point Protocol daemon)语法pppd [ 选项 ] [ 终端设备名称(tty_name) ] [ 速率 ]描述这个点对点协定 (PPP) 提供一种在点对点串列线路上传输资料流(datagrams) 的方法。PPP 是由三个部份所组成的&#xff1a;一个在串列线路上封装(enca…

linux查看每个文件夹占空间大小

文章目录进入所在目录&#xff0c;执行以下命令&#xff1a;例&#xff1a;查看/app目录下面&#xff0c;每个目录的空间磁盘占比情况cd /app du -sh *

KubeCon 、 CloudNativeCon、Open Source Summit 2019三会交融,看点不断!

2019年6月24日&#xff0c;由CNCF和Linux基金会共同举办的KubeCon CloudNativeCon Open Source Summit 2019大会在上海世博中心盛大召开。来自全球各地的开源及云原生社区的采用者和技术专家齐聚于此&#xff0c;与参会者进一步探讨了云原生的教育及发展问题。 第一天大会以同…

c语言20152016真题及答案,2016年计算机二级《C语言》基础练习题及答案(15)

11[单选题]有以下程序程序运行后的输出结果是A.3B.9C.OD.-12参考答案&#xff1a;D参考解析&#xff1a;本题考查目的是运算符的结合性和优先级。首先计算a*a&#xff0c;结果为9&#xff0c;然后执行aa-9&#xff0c;即3-9&#xff0c;结果为-6&#xff0c;然后执行a(-6)(-6)&…

SpringBoot入门到精通_第2篇 _1分钟实战需求项目

接上一篇&#xff1a;SpringBoot入门到精通_第1篇 _核心概念 https://blog.csdn.net/weixin_40816738/article/details/94916051 文章目录一、实战SpringBoot项目1. 使用Spring Initializr快速创建Spring Boot应用2. 在线版本(任选其一即可)3. SpringBoot整合Spring MVC4. 创建…

云数据库精华问答 | 云数据库与其他数据库的关系

戳蓝字“CSDN云计算”关注我们哦&#xff01;云数据库是部署和虚拟化在云计算环境中的数据库。云数据库是在云计算的大背景下发展起来的一种新兴的共享基础架构的方法&#xff0c;它极大地增强了数据库的存储能力,今天我们就一起来看看云数据库的精华问答&#xff01;1Q&#x…