如何为使用 Clang LLVM 编译的 C++ 代码生成图形代码分析报告?
How do I produce a graphical code profile report for C++ code compiled with Clang LLVM?
如何为使用 Clang LLVM 编译的 C++ 代码生成图形代码分析报告?
我将哪些命令行选项传递给 clang++ 以指示它在执行代码时收集分析数据?
收集的分析数据存储在哪个文件中?
将收集的配置文件数据转换为图形报告的 post 处理步骤是什么,该报告显示每个函数被调用的频率,每个函数花费的时间百分比,以及从哪些函数调用每个函数(类似于 https://s3-us-west-2.amazonaws.com/brunorijsman-public/example-rift-python-code-profile.png)?
我可以完全控制 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
对于基于源的代码覆盖率:
- 将您的
.profraw
文件索引到 .profdata
文件中:llvm-profdata merge -o default.profdata -sparse=true default.profraw
- 要么使用
llvm-cov show --instr-profile default.profdata ./your_program
在终端中查看覆盖范围,要么使用 llvm-cov export ./your_program --instr-profile default.profdata > out.json
将您的分析数据转换为 JSON 和 find/create 程序以生成报告你.
对于 gcov 兼容的输出:
- 使用
lcov
或gcovr
生成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
文件的情况下,我还没有找到任何可以生成此类信息的工具。
如何为使用 Clang LLVM 编译的 C++ 代码生成图形代码分析报告?
我将哪些命令行选项传递给 clang++ 以指示它在执行代码时收集分析数据?
收集的分析数据存储在哪个文件中?
将收集的配置文件数据转换为图形报告的 post 处理步骤是什么,该报告显示每个函数被调用的频率,每个函数花费的时间百分比,以及从哪些函数调用每个函数(类似于 https://s3-us-west-2.amazonaws.com/brunorijsman-public/example-rift-python-code-profile.png)?
我可以完全控制 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
对于基于源的代码覆盖率:
- 将您的
.profraw
文件索引到.profdata
文件中:llvm-profdata merge -o default.profdata -sparse=true default.profraw
- 要么使用
llvm-cov show --instr-profile default.profdata ./your_program
在终端中查看覆盖范围,要么使用llvm-cov export ./your_program --instr-profile default.profdata > out.json
将您的分析数据转换为 JSON 和 find/create 程序以生成报告你.
- 将您的
对于 gcov 兼容的输出:
- 使用
lcov
或gcovr
生成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
文件的情况下,我还没有找到任何可以生成此类信息的工具。