searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

使用 gcov 和 gcovr 进行内核和用户态程序的代码覆盖率分析

2024-09-10 09:23:24
63
0

代码覆盖率是衡量测试套件质量的重要指标。通过检测哪些代码行被执行,可以帮助我们识别未测试的代码部分,从而提高测试的全面性。本教程将介绍如何使用 gcovgcovr 工具生成 Linux 内核代码和用户态程序的覆盖率报告。

工具介绍

  • gcovgcov 是 GCC 提供的代码覆盖率分析工具,能够生成程序的行级别和分支覆盖率信息。
  • gcovrgcovr 是一个轻量级 Python 脚本,可以将 gcov 的输出汇总并生成 HTML 或 XML 格式的覆盖率报告,便于集成和展示。

前置条件

  • Linux 内核 源代码
  • 用户态程序 源代码
  • GCC 编译器
  • Python 解释器(用于安装 gcovr

安装与配置

1. 安装必要工具

在进行覆盖率分析前,我们需要安装一些必要的工具,包括 GCC、gcovgcovr。可以通过以下命令安装这些工具:

bash
<button class="flex gap-1 items-center">复制代码</button>
# 安装GCC和gcov sudo yum install gcc gcc-c++ # 安装gcovr sudo pip install gcovr

2. 为内核编译启用覆盖率支持

为了获得内核的代码覆盖率,首先需要在编译内核时启用覆盖率支持。具体步骤如下:

2.1 下载并解压内核源码

首先获取 Linux 内核源码:

bash
<button class="flex gap-1 items-center">复制代码</button>
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.tar.xz tar -xvf linux-5.10.tar.xz cd linux-5.10

2.2 配置内核编译选项

启用覆盖率配置项,在编译内核时生成覆盖率信息:

bash
<button class="flex gap-1 items-center">复制代码</button>
make menuconfig

Kernel hacking 选项下,启用如下配置:

  • Compile the kernel with profiling information (CONFIG_GCOV_KERNEL)
  • Enable GCOV-based kernel profiling (CONFIG_GCOV_PROFILE_ALL)

保存配置并退出。

2.3 编译内核

编译带有覆盖率支持的内核:

bash
<button class="flex gap-1 items-center">复制代码</button>
make -j$(nproc) sudo make modules_install sudo make install

编译完成后,重启并进入新的内核:

bash
<button class="flex gap-1 items-center">复制代码</button>
sudo reboot

3. 生成内核覆盖率报告

内核启动后,使用以下步骤获取覆盖率信息:

3.1 收集覆盖率数据

运行需要测试的内核模块或功能,确保测试代码覆盖足够多的路径。执行完测试后,使用如下命令收集 gcov 数据:

bash
<button class="flex gap-1 items-center">复制代码</button>
cd /sys/kernel/debug/gcov

此目录下包含每个内核模块或文件的覆盖率数据。

3.2 使用 gcovr 生成报告

gcov 生成的 .gcda 文件中生成 HTML 报告:

bash
<button class="flex gap-1 items-center">复制代码</button>
gcovr -r /path/to/kernel/source --html --html-details -o kernel_coverage.html

gcovr 将汇总覆盖率数据并生成详细的 HTML 格式报告。

4. 用户态程序的代码覆盖率

对于用户态程序的覆盖率分析,步骤相对简单。首先需要确保 GCC 在编译程序时启用了覆盖率支持。

4.1 编译用户态程序

使用 -fprofile-arcs-ftest-coverage 选项编译用户态程序,这会生成 .gcno.gcda 文件,供后续分析使用:

bash
<button class="flex gap-1 items-center">复制代码</button>
gcc -fprofile-arcs -ftest-coverage -o my_program my_program.c

4.2 运行测试

执行编译好的程序以生成覆盖率数据:

bash
<button class="flex gap-1 items-center">复制代码</button>
./my_program

此时,程序目录下会生成 .gcda 文件,这些文件包含了覆盖率信息。

4.3 生成覆盖率报告

和内核相同,使用 gcovr 工具生成用户态程序的覆盖率报告:

bash
<button class="flex gap-1 items-center">复制代码</button>
gcovr -r . --html --html-details -o user_program_coverage.html

5. 分析覆盖率报告

生成的 HTML 报告会详细展示每个文件的覆盖率,包括行覆盖率和分支覆盖率。通过这些报告,你可以清晰地看到哪些代码被测试覆盖,哪些部分尚未被测试,便于进一步优化测试用例。

结论

通过 gcovgcovr,我们可以轻松生成 Linux 内核代码和用户态程序的覆盖率报告。这不仅有助于提升代码质量,还可以帮助开发人员发现未覆盖的代码路径,优化测试策略。

0条评论
作者已关闭评论
杨****萌
5文章数
1粉丝数
杨****萌
5 文章 | 1 粉丝
原创

使用 gcov 和 gcovr 进行内核和用户态程序的代码覆盖率分析

2024-09-10 09:23:24
63
0

代码覆盖率是衡量测试套件质量的重要指标。通过检测哪些代码行被执行,可以帮助我们识别未测试的代码部分,从而提高测试的全面性。本教程将介绍如何使用 gcovgcovr 工具生成 Linux 内核代码和用户态程序的覆盖率报告。

工具介绍

  • gcovgcov 是 GCC 提供的代码覆盖率分析工具,能够生成程序的行级别和分支覆盖率信息。
  • gcovrgcovr 是一个轻量级 Python 脚本,可以将 gcov 的输出汇总并生成 HTML 或 XML 格式的覆盖率报告,便于集成和展示。

前置条件

  • Linux 内核 源代码
  • 用户态程序 源代码
  • GCC 编译器
  • Python 解释器(用于安装 gcovr

安装与配置

1. 安装必要工具

在进行覆盖率分析前,我们需要安装一些必要的工具,包括 GCC、gcovgcovr。可以通过以下命令安装这些工具:

bash
<button class="flex gap-1 items-center">复制代码</button>
# 安装GCC和gcov sudo yum install gcc gcc-c++ # 安装gcovr sudo pip install gcovr

2. 为内核编译启用覆盖率支持

为了获得内核的代码覆盖率,首先需要在编译内核时启用覆盖率支持。具体步骤如下:

2.1 下载并解压内核源码

首先获取 Linux 内核源码:

bash
<button class="flex gap-1 items-center">复制代码</button>
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.tar.xz tar -xvf linux-5.10.tar.xz cd linux-5.10

2.2 配置内核编译选项

启用覆盖率配置项,在编译内核时生成覆盖率信息:

bash
<button class="flex gap-1 items-center">复制代码</button>
make menuconfig

Kernel hacking 选项下,启用如下配置:

  • Compile the kernel with profiling information (CONFIG_GCOV_KERNEL)
  • Enable GCOV-based kernel profiling (CONFIG_GCOV_PROFILE_ALL)

保存配置并退出。

2.3 编译内核

编译带有覆盖率支持的内核:

bash
<button class="flex gap-1 items-center">复制代码</button>
make -j$(nproc) sudo make modules_install sudo make install

编译完成后,重启并进入新的内核:

bash
<button class="flex gap-1 items-center">复制代码</button>
sudo reboot

3. 生成内核覆盖率报告

内核启动后,使用以下步骤获取覆盖率信息:

3.1 收集覆盖率数据

运行需要测试的内核模块或功能,确保测试代码覆盖足够多的路径。执行完测试后,使用如下命令收集 gcov 数据:

bash
<button class="flex gap-1 items-center">复制代码</button>
cd /sys/kernel/debug/gcov

此目录下包含每个内核模块或文件的覆盖率数据。

3.2 使用 gcovr 生成报告

gcov 生成的 .gcda 文件中生成 HTML 报告:

bash
<button class="flex gap-1 items-center">复制代码</button>
gcovr -r /path/to/kernel/source --html --html-details -o kernel_coverage.html

gcovr 将汇总覆盖率数据并生成详细的 HTML 格式报告。

4. 用户态程序的代码覆盖率

对于用户态程序的覆盖率分析,步骤相对简单。首先需要确保 GCC 在编译程序时启用了覆盖率支持。

4.1 编译用户态程序

使用 -fprofile-arcs-ftest-coverage 选项编译用户态程序,这会生成 .gcno.gcda 文件,供后续分析使用:

bash
<button class="flex gap-1 items-center">复制代码</button>
gcc -fprofile-arcs -ftest-coverage -o my_program my_program.c

4.2 运行测试

执行编译好的程序以生成覆盖率数据:

bash
<button class="flex gap-1 items-center">复制代码</button>
./my_program

此时,程序目录下会生成 .gcda 文件,这些文件包含了覆盖率信息。

4.3 生成覆盖率报告

和内核相同,使用 gcovr 工具生成用户态程序的覆盖率报告:

bash
<button class="flex gap-1 items-center">复制代码</button>
gcovr -r . --html --html-details -o user_program_coverage.html

5. 分析覆盖率报告

生成的 HTML 报告会详细展示每个文件的覆盖率,包括行覆盖率和分支覆盖率。通过这些报告,你可以清晰地看到哪些代码被测试覆盖,哪些部分尚未被测试,便于进一步优化测试用例。

结论

通过 gcovgcovr,我们可以轻松生成 Linux 内核代码和用户态程序的覆盖率报告。这不仅有助于提升代码质量,还可以帮助开发人员发现未覆盖的代码路径,优化测试策略。

文章来自个人专栏
操作系统
3 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0