如何利用ftrace过滤查看包含指定函数的完整调用栈?
如何用ftrace获取包含指定函数的完整调用图(含上游调用链)
是的,可以通过调整ftrace的配置,获取包含指定函数的完整调用链(包括调用它的上游函数和它调用的下游函数)。
原方法的局限
你之前使用set_graph_function = ksys_dup3的方式,只会从ksys_dup3开始追踪下游函数调用,所以会丢失上游的调用链路。要获取完整调用图,需要调整过滤和追踪的配置逻辑。
具体操作步骤
- 重置ftrace环境
先清理现有配置,确保环境干净:
echo nop > /sys/kernel/debug/tracing/current_tracer echo > /sys/kernel/debug/tracing/set_graph_function echo > /sys/kernel/debug/tracing/set_ftrace_filter echo 100 > /sys/kernel/debug/tracing/max_graph_depth # 设置足够大的调用深度上限
- 配置function_graph追踪器与过滤规则
启用函数调用图追踪,并指定只追踪涉及目标函数的调用路径:
echo function_graph > /sys/kernel/debug/tracing/current_tracer echo ksys_dup3 > /sys/kernel/debug/tracing/set_ftrace_filter
触发目标函数调用
在另一个终端执行会触发ksys_dup3的操作(例如调用dup3系统调用的程序或命令)。查看完整调用图
读取trace文件即可得到包含上下游的完整调用链:
cat /sys/kernel/debug/tracing/trace
示例输出
你会得到类似如下的完整调用图,包含从上游中断处理函数到ksys_dup3下游函数的完整层级:
# tracer: function_graph # # CPU DURATION FUNCTION CALLS # | | | | | | | 7) | el0_svc_handler() { 7) | el0_svc_common() { 7) | __arm64_sys_dup3() { 7) | ksys_dup3() { 7) 0.416 us | expand_files(); 7) | do_dup2() { 7) | filp_close() { 7) 0.405 us | dnotify_flush(); 7) 0.406 us | locks_remove_posix(); 7) | fput() { 7) 0.416 us | fput_many(); 7) 1.269 us | } 7) 3.819 us | } 7) 4.746 us | } 7) 6.475 us | } 7) 7.381 us | } 7) 8.362 us | } 7) 9.205 us | }
核心原理
set_ftrace_filter = ksys_dup3会让ftrace记录所有调用ksys_dup3的上游函数路径,以及ksys_dup3自身调用的下游函数。function_graph追踪器以嵌套格式展示函数调用的层级关系,清晰呈现完整调用链。max_graph_depth用于避免因调用层级过深导致的截断,确保完整记录所有链路。
内容的提问来源于stack exchange,提问作者Daniel Kleinstein
相关产品推荐
相关产品推荐

