如何为使用 Clang LLVM 编译的 C++ 代码生成图形代码分析报告?

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 也不适合我。

Jos*_*kar 6

Clang 支持几种不同的代码覆盖率实现(还输出一行的执行频率),例如基于源代码的代码覆盖率和与 gcov 兼容的代码覆盖率。一般来说,开源工具似乎对 gcov 输出有更好的支持,所以我会推荐这条路线。

我将哪些命令行选项传递给 clang++ 以指示它在执行代码时收集分析数据?

  • 对于基于源的代码覆盖率:根据llvm-cov,收集分析数据的正确标志是在-fprofile-instr-generate -fcoverage-mapping编译时和-fprofile-instr-generate链接时。
  • 对于 gcov 兼容输出:-fprofile-arcs -ftest-coverage

收集到的分析数据存储在哪个文件中?

  • 对于基于源的代码覆盖率:运行程序编译并使用上述标志链接后,覆盖率数据将存储在default.profraw当前工作目录中。可以通过重新编译或在运行可执行文件之前-fprofile-instr-generate=filename设置环境变量来更改分析数据文件名。LLVM_PROFILE_FILE
  • 对于 gcov 兼容输出:运行程序后,您将获得*.gcda和*.gcno文件。

将收集到的配置文件数据转换为图形报告的后处理步骤是什么,该报告显示每个函数的调用频率、每个函数花费的时间百分比

  • 对于基于源的代码覆盖率:

    1. .profraw将您的文件索引到.profdata文件中:llvm-profdata merge -o default.profdata -sparse=true default.profraw
    2. 可以使用llvm-cov show --instr-profile default.profdata ./your_program在终端中查看覆盖范围,也可以使用llvm-cov export ./your_program --instr-profile default.profdata > out.json将分析数据转换为 JSON 并查找/创建一个程序来为您生成报告。
  • 对于 gcov 兼容的输出:

    1. 使用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文件的工具。