0%

llvm Coverage 可视化

Google 提供的工具

Google 提供了一个工具 https://cs.chromium.org/chromium/src/tools/code_coverage/coverage.py

1
2
3
4
5
6
7
8
$ gn gen out/coverage \
--args='use_clang_coverage=true is_component_build=false dcheck_always_on=true'
$ python tools/code_coverage/coverage.py \
crypto_unittests url_unittests \
-b out/coverage -o out/report \
-c 'out/coverage/crypto_unittests' \
-c 'out/coverage/url_unittests --gtest_filter=URLParser.PathURL' \
-f url/ -f crypto/

一些参数的含义:

1
2
3
4
-b 测试 coverage 的 target 的路径
-o 输出报告的路径
-c 测试 coverage 的命令行
-f 过滤,只显示某些路径的 coverage

workflow

实际操作表明, coverage.py 不是太好用。 还是需要一步一步来,比较稳妥。

(0) 编译

在 chromium 项目下,可以直接使用 use_clang_coverage=true and is_component_build=false
如果不是 chromium 项目, 则需要自己 指定参数, 例如在 skia 项目中,可以这么写:

args.gn

1
2
3
4
cc = "/home/henices/clang7/bin/clang"
cxx = "/home/henices/clang7/bin/clang++"
extra_cflags = [ "-fprofile-instr-generate", "-fcoverage-mapping" ]
extra_ldflags = [ "-fprofile-instr-generate", "-fcoverage-mapping" ]

如果是自己的项目,使用 clang 编译时加上这两个参数 -fprofile-instr-generate -fcoverage-mapping

(1) 生成 Raw Profiles 文件

export LLVM_PROFILE_FILE="out/report/target.%4m.profraw" 使用这个命令
限制 profraw 文件的个数。

%p 进程 ID
%h hostname
%Nm 生成几个 profraw 文件

写个循环,将所有的样本跑一遍。 timeout 10 指定程序超时时间。

1
for i  in path ; do timeout 10 target  $i ; done

将在 out/report 目录下, 生成 profraw 文件, 如果没有生成, 则说明上面的代码编译出了问题。

(2) 生成 Indexed Profile

/home/henices/clang7/bin/llvm-profdata merge -j=1 -sparse -o out/report/coverage.profdata out/report/*.profraw

-sparse 能大幅减小 profraw 文件大小

(3) 生成 Coverage report

1
2
3
/home/henices/clang7/bin/llvm-cov show -output-dir=out/report -format=html \
-Xdemangler c++filt -Xdemangler -n -instr-profile=out/report/coverage.profdata \
-object=out/coverage/target

打开 out/report/index.html 可以看到详细的 html 报告,非常不错。

llvm-coverge-html

参考链接