为何无法通过ftrace追踪指定函数dev_gro_receive?
函数被内联编译:内核编译时,若
dev_gro_receive()被编译器自动优化为内联函数(或代码中显式标记inline),ftrace的function_graph追踪无法捕获这类函数——因为内联函数不会以独立的函数调用节点存在于指令流中。而bpftrace基于eBPF的kprobe机制,即使函数内联也能通过探针触发捕获。可执行cat /proc/kallsyms | grep dev_gro_receive验证:若输出无对应符号或符号类型异常,大概率是内联导致。函数不在ftrace支持的追踪列表中:ftrace仅能追踪内核编译时开启了ftrace钩子的函数。执行
cat /sys/kernel/tracing/available_filter_functions | grep dev_gro_receive,若无结果,说明该函数未被添加到ftrace的可追踪集合,可能是编译内核时未开启相关ftrace选项,或函数被特殊编译处理跳过了钩子注入。追踪范围限制:若ftrace设置了特定PID或CPU过滤,而
dev_gro_receive()在受限范围外的上下文(如软中断、内核线程)执行,就不会被记录。检查cat /sys/kernel/tracing/set_ftrace_pid,若输出非0则仅追踪指定进程;检查cat /sys/kernel/tracing/set_ftrace_cpu,若输出非全CPU列表则仅追踪指定CPU。trace buffer被覆盖:
dev_gro_receive()属于网络路径高频调用函数,若ftrace的buffer容量过小,其调用记录可能被后续高频出现的idle_cpu()等函数记录覆盖。可先增大buffer:echo 1024000 > /sys/kernel/tracing/buffer_size_kb,再清空trace:echo > /sys/kernel/tracing/trace,触发网络流量后重新查看。
内容的提问来源于stack exchange,提问作者user2233706

