在使用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语言画出流程图。
晕,据我所知,gcov是linux下代码覆盖率统计的一个东西,应该不是编译错误。你可以检查一下链接参数里面有没有-lgcov的项,希望去掉可以不用gcov生成代码覆盖率。在链接参数中加了-lgcov参数,程序运行之后就会生成.gcda文件,但是还要执行一些命令,才能生成我们能看到的代码覆盖率的文件。希望我的回答可以帮到你。 (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 命令!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)