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

How do I produce a graphical code profile report for C++ code compiled with Clang LLVM?

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

我可以完全控制 C++ 源代码和 Makefile。

它必须是 LLVM clang++(GNU g++ 对我来说不是一个选项)。 Xcode 也不适合我。

如前所述,gprof 是您可以使用的一种分析工具。但是有一个问题,它只计算 CPU-time-in-process,它基本上看不到 I/O 调用。它也被递归混淆了。 Callgrind 也有类似的问题,KCacheGrind 使用 Valgrind,它实际上解释了所有代码。然而,归根结底,就我个人而言,这些是小规模的选项,我会选择 gprof 仅仅是因为它的可用性和文档。

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

What command-line options to I pass to clang++ to instruct it to gather profiling data when the code is executed?

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

Into which file(s) is the gathered profiling data stored?

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

What are the post-processing steps to convert the collected profile data into a graphical report that shows how often each function is called, what percentage of time is spent in each function

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

    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 和 find/create 程序以生成报告你.
  • 对于 gcov 兼容的输出:

    1. 使用lcovgcovr生成HTML输出。这使您可以轻松查看每个文件的行和分支覆盖范围。我倾向于使用 gcovr,因为如果您没有安装它,只需 pip install gcovr 即可。那么用法将是 gcovr --gcov-executable "llvm-cov gcov" -r . --html --html-details -o out.html.

and from which functions each function is called (similar to https://s3-us-west-2.amazonaws.com/brunorijsman-public/example-rift-python-code-profile.png)?

对于此类信息,我会尝试查看 Callgrind 和 KCacheGrind。在给定 *.profdata*.gcda 文件的情况下,我还没有找到任何可以生成此类信息的工具。