IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 内核模块代码覆盖率测试 -> 正文阅读

[系统运维]内核模块代码覆盖率测试

内核模块进行代码覆盖率测试

所需要使用到的工具

?gcov-kernel

gcov-kernel是用于测试代码覆盖率主要工具,如果要使用gcov-kernel,需要打开一些编译选项,重新编译内核。

gcov-kernel enables code coverage measurements for the Linux kernel and kernel modules. It is based on GCC’s gcov tool. gcov-kernel is available as a set of patches for Linux kernels 2.6.4 to 2.6.30. Starting with Linux kernel 2.6.31, gcov-kernel is part of the Linux kernel and can be used without extra patches.

?lcov

lcov利用gcov的数据生成可视化页面

LCOV is a graphical front-end for GCC’s coverage testing tool gcov. It collects gcov data for multiple source files and creates HTML pages containing the source code annotated with coverage information. It also adds overview pages for easy navigation within the file structure. LCOV supports statement, function and branch coverage measurement.

以centos6为例

centos6内核下载配置、编译安装

下载内核源码?http://vault.centos.org/6.5/os/Source/SPackages/kernel-2.6.32-431.el6.src.rpm

我们将内核源代码安装在/home/linux-2.6.32-431.el6路径下。

$?cd?/home/linux-2.6.32-431.el6

$?make?oldconfig

$?make?menuconfig

进入General setup、GCOV-based kernel profiling按照下图配置:

?

保存后退出,执行以下命令:

$?cd?/home/linux-2.6.32-431.el6

$?sudo?su?-

# make -j16

这里由于开启可gcov选项,编译器编译时检测更加严格会出现像以下这种错误:

In?file?included from include/net/inetpeer.h:15:0,

?????????????????from net/ipv4/tcp_metrics.c:16:

net/ipv4/tcp_metrics.c: 在函数‘tcp_peer_is_proven’中:

include/net/ipv6.h:414:38: 错误:此函数中的‘*((void *)&daddr+8)’在使用前可能未初始化

[-Werror=maybe-uninitialized]

??return?((ul1[0] ^ ul2[0]) | (ul1[1] ^ ul2[1])) == 0UL;

??????????????????????????????????????^

net/ipv4/tcp_metrics.c:228:30: 附注:‘*((void *)&daddr+8)’在此声明

??struct inetpeer_addr saddr, daddr;

??????????????????????????????^

修改Makefile文件:

592?all: vmlinux

593

594?ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE

595?BUILD_CFLAGS?? += -Os $(call cc-disable-warning,)

596?else

597?BUILD_CFLAGS?? += -O2 $(call cc-disable-warning,maybe-uninitialized,)

598?endif

599

600?include $(srctree)/arch/$(SRCARCH)/Makefile

601

602?ifdef CONFIG_READABLE_ASM

603?# Disable optimizations that make assembler listings hard to read.

604?# reorder blocks reorders the control in the function

605?# ipa clone creates specialized cloned functions

606?# partial inlining inlines only parts of functions

607?BUILD_CFLAGS += $(call cc-option,-fno-reorder-blocks,) \

608??????????????????$(call cc-option,-fno-ipa-cp-clone,) \

609??????????????????$(call cc-option,-fno-partial-inlining) \

610??????????????????$(call cc-disable-warning,maybe-uninitialized,)

611?endif

增加$(call cc-disable-warning,maybe-uninitialized)忽略警告,修改完Makefile后顺利编译。

安装新内核以及新内核的模块:

$?cd?/home/linux-2.6.32-431.el6

$?make?modules_install

$?make?install

修改grub内核启动,对内核模块进行代码覆盖率测试。

以signal_trace作为测试案例,首先下载模块源代码:

$?cd?/home

$ git clone http://xxxx.com/signal_trace.git

$?cd?signal_trace

正常编译内核只要make就可以了,但对一个内核模块进行代码覆盖率的测试,则需要修改Makefile,在编译时打开相应的测试开关:

GCOV_PROFILE := y

CFLAGS=-ftest-coverage -fprofile-arcs? --disable-initfini-array

export CFLAGS

????????signal_trace-objs :=? signal_jprobe.o attr.o

????obj-m :=? signal_trace.o

all:

????????make -C /home/linux-2.6.32-431.el6 M=$(PWD) modules

clean:

????????make -C /home/linux-2.6.32-431.el6 M=$(PWD) clean

make编译后需要debugfs才能正常工作,然后再insmod。

$?sudo?su?-

# mount -t debugfs none /sys/kernel/debug

进入到gcov对应的debugfs目录:

# cd /sys/kernel/debug/gcov

# tree -L 4

.

├── home

│?? └──?linux-2.6.32-431.el6

│?????????? ├── arch

│?????????? ├── block

│?????????? ├── crypto

│?????????? ├── drivers

│?????????? ├── fs

│?????????? ├── init

│?????????? ├── ipc

│?????????? ├── kernel

│?????????? ├── lib

│?????????? ├── mm

│?????????? ├── net

│?????????? └── security

└── reset

可以看见内核代码,对其进行测试与模块测试流程是相同的。

如何对内核模块进行覆盖率的测试?

安装刚刚编译好的内核模块:

# cd signal_trace

# insmod signal_trace.ko

debugfs下的gcov目录:

# cd /sys/kernel/debug/gcov

# tree -L 4

.

├── home

│?? └──?test

│?????? ├── linux-2.6.32-431.el6

│?????? │?? ├── arch

│?????? │?? ├── block

│?????? │?? ├── crypto

│?????? │?? ├── drivers

│?????? │?? ├── fs

│?????? │?? ├── init

│?????? │?? ├── ipc

│?????? │?? ├── kernel

│?????? │?? ├── lib

│?????? │?? ├── mm

│?????? │?? ├── net

│?????? │?? └── security

│?????? └── signal_trace

│?????????? ├── attr.gcda

│?????????? ├── attr.gcno ->?/home/signal_trace/.tmp_attr.gcno

│?????????? ├── signal_jprobe.gcda

│?????????? └── signal_jprobe.gcno ->?/home/signal_trace/.tmp_signal_jprobe.gcno

└── reset

针对模块运行各种测试用例。当测试用例运行结束后,使用lcov工具提取代码覆盖率信息。

安装lcov提取覆盖率信息构建可视化:

$?cd?/home

$ wget http://downloads.sourceforge.net/ltp/lcov-1.12.tar.gz

$?tar?-xvf lcov-1.12.tar.gz

$?cd?lcov-1.12

$?make

$?sudo?make?install

将gcov统计的模块运行信息拷贝出来:

$?cp?-r?/sys/kernel/debug/gcov/home/signal_trace/?~/module_test

$?cd?~/module_test

$ lcov -c -d . -o kernel.info? ? ? ? ? //提取测试信息

$ genhtml kernel.info -o ../html/? //生成可视化视图

在生成可视化视图时可能会遇到的问题1:

genhtml: ERROR: cannot?read?/home/kernel_test/

signal_trace/include/linux/slub_def.h

这时候可能需要将文件拷贝到/home/kernel_test/signal_trace/下了。

可能会遇到的问题2:

Can't?locate?Digest/MD5.pm?in?@INC (@INC contains:?/usr/local/lib64/perl5?/usr/local/share/perl5?/usr/lib64/perl5/vendor_perl?/usr/share/p$

rl5/vendor_perl?/usr/lib64/perl5?/usr/share/perl5?.) at?/usr/bin/geninfo?line 57.

通过perl -MCPAN -e ‘install Digest::MD5’来解决。

然后使用浏览器打开index.html查看代码覆盖率、代码执行情况。

?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:36:33  更:2022-03-11 22:39:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:52:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码