如何用perf测量进程中所有函数执行时间并批量创建探针事件?
批量创建函数perf探针事件的方案
针对你需要批量跟踪大量函数执行时间的场景,以下几种方法可以避免逐个手动创建探针:
1. 利用perf probe的通配符匹配
perf probe支持通配符批量匹配函数名,直接为符合规则的所有函数创建入口和返回探针:
匹配二进制文件中所有函数
# 为目标二进制的所有函数添加入口和返回探针 sudo perf probe -x ./binary_file_name --add '*' --add '*%return'
按规则过滤函数
如果不需要跟踪所有函数(比如排除编译器生成的内置函数),可以用通配符或过滤规则精准匹配:
# 仅跟踪以"calc_"开头的业务函数 sudo perf probe -x ./binary_file_name --add 'calc_*' --add 'calc_*%return' # 排除以"__"开头的内置函数 sudo perf probe -x ./binary_file_name --add '*' --add '*%return' --filter 'name !~ "^__"'
2. 结合nm工具批量生成探针命令
通过nm工具提取二进制文件中的函数列表,再批量生成perf probe命令:
步骤1:提取全局函数列表
# 提取二进制中的全局函数(T标记),过滤掉内置函数 nm -D ./binary_file_name | grep ' T ' | grep -v '__' | awk '{print $3}' > func_list.txt
步骤2:批量创建探针
# 循环处理函数列表,逐个添加入口和返回探针 cat func_list.txt | while read func; do sudo perf probe -x ./binary_file_name --add "$func" --add "$func%return" done
或者用xargs简化命令:
nm -D ./binary_file_name | grep ' T ' | grep -v '__' | awk '{print "--add "$3" --add "$3"%return"}' | xargs sudo perf probe -x ./binary_file_name
3. 改用ftrace的function_graph跟踪器
如果不需要单独的perf探针事件,ftrace的function_graph追踪器可以直接记录所有函数的调用、返回及执行时长,无需手动创建探针:
记录函数调用数据
# 跟踪目标程序的所有函数调用,生成trace文件 sudo trace-cmd record -p function_graph ./a.out
查看执行时间报告
# 解析trace文件,查看每个函数的调用次数和执行时长 sudo trace-cmd report
该方案输出会按函数展示调用次数、平均执行时间、总耗时等数据,更适合批量跟踪场景。
内容的提问来源于stack exchange,提问作者AlxDidorenko
相关产品推荐
相关产品推荐

