如何用lcov对比两次执行的代码差异?支持llvm-cov方案
用LCOV/LLVM-Cov对比执行流程分支差异的高效方案
LCOV 实操步骤
- 先编译带覆盖率的程序:添加编译选项
-fprofile-arcs -ftest-coverage - 生成失败场景的覆盖率数据:用触发失败的输入运行程序,生成
*.gcda文件后,执行lcov -c -d . -o fail.info - 生成修复后的覆盖率数据:应用临时修复代码,用同一输入再跑一次,执行
lcov -c -d . -o fix.info - 生成差异报告:
- 合并两次数据:
lcov -a fail.info -a fix.info -o combined.info - 生成带差异的HTML报告:
genhtml combined.info -o diff_report --show-diff,报告会高亮两次执行的分支差异,红/绿标记的位置就是分支执行状态变化的关键区域,直接聚焦这些位置即可
- 合并两次数据:
- 过滤无关代码:如果报告包含测试代码、第三方库等噪音,用
lcov -r combined.info '*/test/*' '*/third-party/*'过滤掉,专注排查业务代码
LLVM-Cov 方案
- 编译时添加Clang覆盖率选项:
-fprofile-instr-generate -fcoverage-mapping - 生成失败场景的profile:
LLVM_PROFILE_FILE="fail.profraw" ./your_program llvm-profdata merge -sparse fail.profraw -o fail.profdata - 生成修复后的profile:
LLVM_PROFILE_FILE="fix.profraw" ./your_program llvm-profdata merge -sparse fix.profraw -o fix.profdata - 生成差异报告:
- HTML可视化:
llvm-cov show ./your_program -instr-profile=fail.profdata -instr-profile=fix.profdata -format=html -o llvm_diff_report,同一页面会展示两次执行的分支覆盖差异,鼠标悬停可查看具体执行次数变化 - 文本快速排查:
llvm-cov report ./your_program -instr-profile=fail.profdata -instr-profile=fix.profdata,查看每个函数的分支覆盖变化,先锁定可疑函数再深入细节
- HTML可视化:
额外小技巧
- 如果已有怀疑的分支,直接用
gdb/lldb在分支处加断点,对比两次执行时的变量值,验证优化后的数值是否触发了错误分支 - LCOV生成的
*.gcov文件可直接用diff对比:diff fail_gcov_dir/file.gcov fix_gcov_dir/file.gcov,快速定位分支执行状态变化的代码行
内容的提问来源于stack exchange,提问作者Andrew Benor
相关产品推荐
相关产品推荐

