llvm Coverage 可视化
Google 提供的工具
Google 提供了一个工具 https://cs.chromium.org/chromium/src/tools/code_coverage/coverage.py
$ 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/
一些参数的含义:
-b 测试 coverage 的 target 的路径
-o 输出报告的路径
-c 测试 coverage 的命令行
-f 过滤,只显示某些路径的 coverage
实际操作表明, coverage.py 不是太好用。 还是需要一步一步来,比较稳妥。
(0) 编译
在 chromium 项目下,可以直接使用 use_clang_coverage=true and is_component_build=false
如果不是 chromium 项目, 则需要自己 指定参数, 例如在 skia 项目中,可以这么写:
args.gn
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 指定程序超时时间。
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
/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 Coverage 可视化
https://usmacd.com/cn/llvm_coverage/