在使用gcov工具前,请确认编译程序时并没有用到“优化”选项。
gcc -fprofile-arcs -ftest-coverage sourcefile.c -o sourcefile
此时目录下会生成 sourcefile.gcno
./sourcefile
此时目录下会生成 sourcefile.gcda
gcov sourcefile.c
此时目录下会生成 sourcefile.c.gcov
gcov中记录的执行次数是累计的,即如果不删除之前的.gcda文件就再次执行程序,则记录的执行次数会累加。
该工具需要有gcov生成的.gcno和.gcda文件,不需要.gcov
lcov --capture --directory projrct-dir --output-file coverage.info
genhtml coverage.info --output-derectory out
以上两行命令的简化
lcov -c -d project_dir -o coverage.info
genhtml coverage.info -o out
用浏览器打开out目录下的index.html即可。
用户手册
在编译时加上 -pg 选项。
运行可执行程序,此时会在同路径下生成gmon.out文件。
gprof executable_name gmon.out 输出分析报告。
分析报告内容:
flat profile 表格显示每个函数消耗的处理器时间、调用次数等。
call graph 表格显示每个函数的调用关系,调用花费了多少时间。
如果嫌gprof的输出不太直观,可以使用 gprof2dot 工具,自动用dot语言画出流程图。
(1) gcov是 MinGW 自带的,在 MinGW\bin\gcov.exe,编译时加入 “-fprofile-arcs -ftest-coverage -g -O0” 参数(添加这些参数的办法详见我之前的文章 不折腾好环境不学习(1)—— VSCode 使用cmake &boost - ),就会生成类似 linux 中生成的 .gcno &.gcda 文件了
(2) 这时候类似 linux *** 作,进入 “CMakeFiles/p_test.dir/src” 目录,运行 “gcov p_test.gcno”,gcov 部分的工作就结束了
(1) lcov 其实就是几个 perl 语言写得脚本,为了将 lcov 移植到 windows 环境里,许多人已经在这几个 perl 脚本调整上做了很多工作,比如 GitHub - valbok/lcov: LCOV for Windows 和 Code coverage - HTML reports using LCOV on windows ,但是这些现成的脚本在我实际实践时都会有很多问题。
(2) lcov.bat, lcov.perl, geninfo.perl 遇到不同系统移植带来的 bug ,通过简单浏览一下,不难解决问题,但是 genhtml.perl 过于复杂,待我初略学习 perl 语言一番后再来完善
1. 在上一种办法搞到最后还是因为不会 perl 语言,没改好 genhtml.perl 而不能生成 coverage.html 因此快要崩溃的时候,我忽然想到一个问题—— “既然 lcov 只是一个 perl 语言写的脚本,那么为什么就不可能有 python 写的 lcov 脚本呢?!”
2. 抱着这个想法我去Google上搜,调整了 3 次关键词之后终于发现了一个 python 版本的脚本—— gcovr ! 这个脚本只需要编译时加入 “-fprofile-arcs -ftest-coverage -g -O0” 参数,从而能够生成 .gcno &.gcda 文件就可以了! 官方说明如下:
注意要在项目的根目录下运行 gcovr 命令!
1. gcov
gcov程序的输入是一个.c文件,前提是已经编译生成了.gcno文件并运行可执行程序生成.gcda文件;gcov根据.c文件相应的.gcda文件和.gcno文件生成相应的.c.gcov并报告覆盖率测试结果。
1.1 gcov必须的文件
(1)实现文件
根据"Linux平台代码覆盖率测试-GCC如何编译生成gcov/gcov-dump程序及其bug分析"一文的讨论,gcov所需的.c文件有gcov.c, gcov-io.c, intl.c, error.c, version.c。
注:gcov-io.c在编译gcov时并没有显示被编译(成.o文件),实际上,gcov-io.c被包含进了gcov.c文件中,请参考gcov.c代码。
因此,我们需要将这些.c文件及其.h文件抽取出来。
(2)版本文件
gcov-iov.h:该文件的内容由./gcc/gcov-iov程序生成。请参考"Linux平台代码覆盖率测试工具GCOV相关文件分析"一文。内容如下。
[cpp] view plaincopy
/* Generated automatically by the program `./gcov-iov'
from `4.1.2 (4 1) and p (p)'. */
#define GCOV_VERSION ((gcov_unsigned_t)0x34303170) /* 401p */
(3)配置文件
auto-host.h
config.h
其中,
auto-host.h文件可以使用./gcc/configure程序自动生成,当然,这里的auto-host.h文件只需要包含在gcov程序中需要的常量,且有些常量需要修改,内容如下。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)