@page system_debug_tools_performance_gprof gprof(函数级性能分析工具) @ingroup system_debug_tools_performance @brief 通过编译期插桩统计“热点函数 + 调用关系”,辅助确定优化优先级。
@tableofcontents
@section gprof_overview 1. 工具定位与适用场景 gprof 是一种函数级性能分析工具:在程序运行过程中收集函数执行相关统计信息,并在结束后生成报告,用于定位性能热点与分析函数调用关系。:contentReference[oaicite:0]{index=0}
与其它性能分析工具的关注点不同:
- Trace / SystemView 更偏“时间轴与行为”(什么时候发生了什么调度/事件):contentReference[oaicite:1]{index=1}
- perf 更偏“CPU 时间消耗在哪些函数”(基于 PMU 采样):contentReference[oaicite:2]{index=2}
- gprof 更偏“程序主要停留在哪些函数上,以及函数之间如何调用”:contentReference[oaicite:3]{index=3}
因此,gprof 更适合:
- 定位函数级热点
- 判断哪些函数值得优先优化:contentReference[oaicite:4]{index=4}
@section gprof_config 2. 基本配置 以下为文档中给出的关键配置项::contentReference[oaicite:5]{index=5}
@subsection gprof_config_kconfig 2.1 Kconfig 选项 @code
开启 gprof 命令(必选)
CONFIG_SYSTEM_GPROF=y
设备侧使用:开启采样所需的 -pg 插桩(必选)
CONFIG_PROFILE_MINI=y
全局默认开启 -pg,采样数据包含函数调用次数和函数调用关系(可选)
CONFIG_PROFILE_ALL=y
SIM 环境下使用 gprof(按需)
CONFIG_SIM_GPROF=y @endcode
@note
- 如果只需要“热点函数大致分布”,可先启用最小必选项;若需要更完整的调用关系分析,再开启 CONFIG_PROFILE_ALL。:contentReference[oaicite:6]{index=6}
@section gprof_principle 3. 工作原理 gprof 的核心机制基于编译期插桩(Instrumentation),而不是硬件 PMU 或内核事件,因此具有较好的平台通用性。:contentReference[oaicite:7]{index=7}
在编译阶段启用 -pg 后,编译器会在每个函数入口处自动插入调用逻辑::contentReference[oaicite:8]{index=8}
- 记录当前函数的调用次数
- 记录函数之间的调用关系(caller/callee)
从而在运行过程中构建完整的 Call Graph,并统计调用频率。:contentReference[oaicite:9]{index=9}
@warning 插桩会引入额外开销(指令与数据记录),建议用于性能定位/验证阶段;不要在对性能极敏感的“最终发布配置”中默认长期开启(属于工程建议)。
@section gprof_usage 4. 使用方式(设备侧) 文档给出了一套典型流程(以 Arm32 QEMU 平台示例)::contentReference[oaicite:10]{index=10}
@subsection gprof_usage_cmd 4.1 采集命令 @code
开始采集
nsh> gprof start
停止采集
nsh> gprof stop
导出采集数据(生成 gmon.out)
nsh> gprof dump /tmp/gmon.out
@endcode
导出后会生成 gmon.out 文件用于 Host 端分析。:contentReference[oaicite:11]{index=11}
@section gprof_analysis 5. 结果分析(Host 侧)
将设备侧生成的 gmon.out 拉取到 Host 端后,使用交叉工具链中的 gprof 工具分析::contentReference[oaicite:12]{index=12}
@subsection gprof_analysis_cmd 5.1 分析命令 @code arm-none-eabi-gprof nuttx.elf gmon.out -b @endcode :contentReference[oaicite:13]{index=13}
@subsection gprof_analysis_output 5.2 输出解读要点 gprof 常见输出包括两部分:
- Flat profile:展示各函数的采样占比、累计耗时、调用次数等(用于快速锁定热点函数)。:contentReference[oaicite:14]{index=14}
- Call graph:展示函数间调用关系与链路上的自耗时/子耗时(用于分析“热点从哪里来”“被谁调用导致的放大效应”)。:contentReference[oaicite:15]{index=15}
@note 进行 Host 侧分析时,请确保:
- 使用与目标固件匹配的
nuttx.elf(符号要一致,否则符号解析会偏差)。(工程建议) - 如果需要可读性更强的报告,可结合 gprof 的更多参数进一步过滤/排序。(工程建议)