Bru*_*man 2 c++ profiling llvm clang
如何为使用 Clang LLVM 编译的 C++ 代码生成图形代码分析报告?
我将哪些命令行选项传递给 clang++ 以指示它在执行代码时收集分析数据?
收集到的分析数据存储在哪个文件中?
将收集到的配置文件数据转换为图形报告的后处理步骤是什么,该报告显示每个函数被调用的频率、每个函数花费的时间百分比以及每个函数是从哪些函数调用的(类似于https:// /s3-us-west-2.amazonaws.com/brunorijsman-public/example-rift-python-code-profile.png)?
我可以完全控制 C++ 源代码和 Makefile。
它必须是 LLVM clang++ (GNU g++ 对我来说不是一个选择)。Xcode 也不适合我。
Clang 支持几种不同的代码覆盖率实现(还输出一行的执行频率),例如基于源代码的代码覆盖率和与 gcov 兼容的代码覆盖率。一般来说,开源工具似乎对 gcov 输出有更好的支持,所以我会推荐这条路线。
我将哪些命令行选项传递给 clang++ 以指示它在执行代码时收集分析数据?
-fprofile-instr-generate -fcoverage-mapping编译时和-fprofile-instr-generate链接时。-fprofile-arcs -ftest-coverage收集到的分析数据存储在哪个文件中?
default.profraw当前工作目录中。可以通过重新编译或在运行可执行文件之前-fprofile-instr-generate=filename设置环境变量来更改分析数据文件名。LLVM_PROFILE_FILE*.gcda和*.gcno文件。将收集到的配置文件数据转换为图形报告的后处理步骤是什么,该报告显示每个函数的调用频率、每个函数花费的时间百分比
对于基于源的代码覆盖率:
.profraw将您的文件索引到.profdata文件中:llvm-profdata merge -o default.profdata -sparse=true default.profrawllvm-cov show --instr-profile default.profdata ./your_program在终端中查看覆盖范围,也可以使用llvm-cov export ./your_program --instr-profile default.profdata > out.json将分析数据转换为 JSON 并查找/创建一个程序来为您生成报告。对于 gcov 兼容的输出:
lcov或gcovr生成 HTML 输出。这使您可以轻松查看每个文件的行和分支覆盖范围。我倾向于使用 gcovr,因为pip install gcovr如果您没有安装它,它很简单。那么用法就是gcovr --gcov-executable "llvm-cov gcov" -r . --html --html-details -o out.html.以及每个函数是从哪些函数调用的(类似于https://s3-us-west-2.amazonaws.com/brunorijsman-public/example-rift-python-code-profile.png)?
对于此类信息,我会尝试查看 Callgrind 和KCacheGrind。我还没有找到任何可以生成此类给定信息*.profdata或*.gcda文件的工具。
| 归档时间: |
|
| 查看次数: |
2872 次 |
| 最近记录: |