【问题标题】:How do I produce a graphical code profile report for C++ code compiled with Clang LLVM?如何为使用 Clang LLVM 编译的 C++ 代码生成图形代码配置文件报告?
【发布时间】:2020-04-04 00:55:57
【问题描述】:

如何为使用 Clang LLVM 编译的 C++ 代码生成图形代码配置文件报告?

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

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

【问题讨论】:

  • 您是否正在寻找类似vcperf for Linux 的东西(也在this CppCast episode 上进行了深入讨论)? IncrediBuild 可在 Linux 上免费试用,它生成类似的图表,但粒度不同(它涵盖文件构建时间并显示并行瓶颈,而不是模板实例化时间和标头处理时间等粒度指标)。
  • @metal 似乎 vcperf 和 incredibuild 提供了一份关于构建我的代码所花费时间的报告。如果是这样,那不是我要找的。我想知道执行我的代码所花费的时间。
  • 哦,那它是clang还是gcc可能并不重要。您可以使用gprofcallgrind 和/或kcachegrindHere's a video 来自 CppCon 2017,关于分析和优化。有关更多信息,请参阅 Chandler Caruth 的其他演讲。
  • @metal 啊,我不知道它是 gcc 还是 clang 都没有关系。我认为 clang 有自己的分析工具链,与 gcc 的工具链不同。让我试试 gprof 或你的其他建议。谢谢!

标签: c++ clang profiling llvm


【解决方案1】:

Clang 支持几种不同的代码覆盖率实现(还可以输出一行被执行的频率),例如Source-Based Code Coverage 和一个与 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. 使用lcovgcovr 生成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 文件的情况下,我还没有找到任何可以生成此类信息的工具。

【讨论】:

  • 在到期前奖励赏金,虽然我还没有机会尝试这个答案中的所有建议(到目前为止看起来很有希望)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2019-09-22
    • 2015-08-25
    • 1970-01-01
    相关资源
    最近更新 更多