分析函数执行情况
借助Valgrind 工具套件中的 Callgrind 工具,您可以检测与函数执行相关的问题。将 Callgrind 生成的数据文件加载到KCachegrind性能分析数据可视化工具中,即可浏览性能分析结果。
下载并安装 Valgrind 工具和 KCachegrind 后,您即可通过Qt Creator 使用 Callgrind 和 KCachegrind。
注意:您 可以在 Linux 系统上本地安装并运行 Callgrind 和 KCachegrind。您还可以从任意计算机远程运行位于其他 Linux 机器或设备上的 Callgrind。
构建用于性能分析的应用程序
Callgrind 会记录应用程序运行时执行的函数调用历史记录。它会收集已执行的指令数量、这些指令与源代码行之间的对应关系、函数之间的调用方与被调用方关系,以及此类调用的次数。您还可以使用缓存模拟或分支预测来收集有关应用程序运行时行为的信息。
由于调试版和发布版构建配置的运行时特性存在显著差异,针对一种构建配置的分析结果可能对另一种配置并不适用。 对调试构建进行性能分析时,通常会发现大部分时间消耗在低级代码(如容器实现)上,而由于发布构建中通常会进行内联和其他优化,同一应用程序的发布构建性能分析中则不会出现这些代码。
许多现代编译器允许您在生成优化应用程序的同时保留调试信息。例如,GCC 的典型选项是:-g -O2 。建议在进行 Callgrind 性能分析时采用此类设置。
收集数据
要分析应用程序:
- 进入“Projects ”模式,并选择一个发布版构建配置。
- 在模式选择器中,选择“Debug ” > “Callgrind ”。

- 选择“
”以启动应用程序。 - 使用该应用程序对其进行分析。
- 选择“
”以在“Functions ”视图中查看分析结果。
选择“
”以通过暂停事件记录来加快分析期间程序的执行速度。记录暂停期间不会统计任何事件。
选择“
”(Reset )以重置所有事件计数器。
选择“
”以丢弃所有已收集的数据。
选择“
”可在 KCachegrind 中查看数据。Qt Creator 将启动 KCachegrind 并将数据加载其中以供可视化。
查看收集的数据
分析结果将显示在“Callgrind ”视图中。您可以将视图分离并随意拖动。若要还原更改,请选择“Views ” > “Reset to Default Layout ”。
选择“Views ”可显示或隐藏视图及视图标题。默认情况下,“Visualization ”视图处于隐藏状态。当该视图显示时,选择“
”可刷新其中显示的数据。
作为收集数据的替代方案,您可以选择“
”将外部日志文件加载到“Callgrind ”视图中。

在“Filter ”字段中输入字符串以筛选结果。
将光标移至“Functions ”视图中的某个函数上,即可查看有关该函数的更多信息。
双击一个函数,可在“Callers ”视图中查看有关调用函数的信息,并在“Callees ”视图中查看有关被调用函数的信息。
选择“
”(Previous )和“
”(Next )可在“Callee ”视图中在各个函数之间切换。
要设置成本格式,请选择“$ ”。您可以查看绝对成本或相对成本,以及相对于父节点的相对成本。选择“
”仅查看源自该项目的性能分析信息。
要正确处理递归或循环函数调用,请通过选择“O ”来启用循环检测。
若要在显示函数名时移除模板参数列表,请选择“<> ”。
另请参阅 “使用 Memcheck 检测内存泄漏”、“在外部应用程序上运行 Valgrind 工具”、“为项目指定 Valgrind 设置”、“Valgrind Callgrind”和“Valgrind Memcheck”。
Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.