lcov的分支覆盖总会产生很多隐藏分支,为了解决这个问题,决定引入gcovr解决。网上关于gcovr的内容太少了,这几天自己琢磨出来一些使用方法,欢迎讨论。
本篇介绍一下gcovr各项参数
-v, --verbose
打印进度消息。可以查看报错
-r <root>, --root <root>
指定源码根目录,因为gcovr是需要依靠源码生成覆盖率报告的,所以如果gcno和gcda与源码不在同一个文件夹下的话,必须指定源码路径。
并且,必须是本机编译生成的gcno和gcda才可以生成覆盖率报告,用别的机子生成的在本机运行会报错。
--exclude-lines-by-pattern <exclude_lines_by_pattern>
排除与正则表达式匹配的行覆盖率
该参数不支持多次指定,如果需要可参考GCOVR exclude 多次指定的方式
--exclude-branches-by-pattern <exclude_branches_by_pattern>
排除与正则表达式匹配的分支覆盖率
该参数同样不支持多次指定,可参考上方链接
-o <output>, --output <output>
将输出打印到此文件名。默认为stdout。单独的输出格式可以覆盖这一点。
-b, --branches
导出分支覆盖率
--decisions
报告决策覆盖率,这个似乎比分支覆盖率更优异,只针对if switch进行分支覆盖,但是也会统计到for和while,并且无法进行覆盖
--html <output>
生成HTML报告。
与lcov不同的是,gcovr会将所有页面的覆盖率报告一同显示在一个文件夹内,在ubuntu环境下最好在指定的文件夹目录上一级创建一个软链接链接到主覆盖率报告。
--html-details <output>
用这个可以在覆盖率报告中看到分支覆盖率,不需要加-b
--html-nested <output>
可以在覆盖率报告中体现文件目录,不同于用上一种方式展现会把所有文件的覆盖率显示在一级目录中。
--html-title <title>
使用TITLE作为HTML报告的标题。但是不知道如何输入空格,欢迎讨论
--html-absolute-paths
使用这个之后,如果覆盖率报告文件被移动,会导致打开html文件显示找不到原文件,慎用。
-f <filter>, --filter <filter>
只保留与此筛选器匹配的源文件。可以多次指定。相对筛选器是相对于当前工作目录的,或者如果在配置文件中定义了相对筛选器。如果没有提供筛选器,则默认为–root。
-e <exclude>, --exclude <exclude>
排除与此筛选器匹配的源文件。可以多次指定。
--gcov-executable <gcov_cmd>
使用特定的gcov可执行文件。必须与您正在使用的编译器匹配。如果编译的时候用的不是系统的编译器而是别的编译器,需要用这个来指定编译器。
--exclude-unreachable-branches
从没有有用源代码的行中排除分支覆盖(通常是编译器生成的“死”代码)。似乎有用,但不多
--exclude-function-lines
在覆盖率报告中排除函数定义的行
--exclude-noncode-lines
从看似非代码的行中排除覆盖范围。感觉没什么用
--exclude-throw-branches
对于分支覆盖率,请排除编译器为异常处理生成的分支。这通常会导致更“合理”的报道。感觉没什么用
-k, --keep
处理后保留gcov文件。这既适用于gcovr生成的文件,也适用于通过–use gcov files选项提供的文件。
因为gcovr是在源码路径下分析,所以用了这个之后产生的文件也都在源码路径下,会污染源码文件夹,慎用。
-d, --delete
处理后删除gcda文件。
目前我有用过的参数就这些,举例说明一下gcovr的使用方式
----------------------------源码路径------------------ .代表读取当前目录下的gcno和gcda文件 -----------------------指定使用的编译器--------------------------------指定输出文件夹名称
gcovr -r /work/qnx/qnx-services/trace-icc-service/src . --gcov-executable /work/sdk/SDP710_EXP_Gen3_Gen4_QOS223_QHS222_20221202/host/linux/x86_64/usr/bin/ntox86_64-gcov -v --html-details coverage.html