如何在Linux系统中获取程序执行时按时间顺序排列的被调用函数列表
Linux环境下按时间顺序追踪函数调用的低负载方案
- ftrace(内核内置追踪框架)
ftrace是Linux内核原生自带的追踪能力,无需额外安装,追踪开销远低于编译插桩,是该场景的首选方案:
操作步骤如下:- 挂载tracefs文件系统:
mount -t tracefs nodev /sys/kernel/tracing - 切换到函数调用追踪模式,若需要完整调用层级使用function_graph跟踪器:
echo function_graph > /sys/kernel/tracing/current_tracer;若仅需函数进入事件,可使用更精简的function跟踪器 - 绑定要追踪的目标进程PID:
echo 你的进程PID > /sys/kernel/tracing/set_ftrace_pid - 开启追踪:
echo 1 > /sys/kernel/tracing/tracing_on - 目标程序运行结束后关闭追踪,读取按时间排序的调用记录:
echo 0 > /sys/kernel/tracing/tracing_on && cat /sys/kernel/tracing/trace
输出结果会天然按调用时间排序,同时标注函数的进入/退出时间戳、父子调用层级关系。
- 挂载tracefs文件系统:
- perf(系统性能分析工具)
perf是绝大多数Linux发行版默认预装的性能工具,支持采样/全量两种追踪模式,负载可控:
若可以接受极低比例的采样丢失,使用采样模式负载几乎可以忽略:perf record -g -p 目标进程PID -- sleep 追踪时长,采集完成后执行perf script即可输出按时间顺序排列的函数调用记录。
若需要全量捕获所有函数调用,可调整参数为perf record -e function:call -g -p 目标进程PID,该模式负载比采样模式高,但仍远低于编译插桩方案。 - 关于dtrace的补充:Linux平台也有dtrace的移植版本,但默认没有集成到主流发行版中,需要手动编译内核、配置启动参数,易用性远低于上述两个原生工具,非特殊需求不推荐使用。
内容的提问来源于stack exchange,提问作者A. K.
相关产品推荐
相关产品推荐

