Linux 内核之旅(五):ftrace/bpftrace

内核追踪的工具入门

Posted by pandaychen on January 5, 2025

0x00 前言

追踪类调试工具鸟瞰图

trace-tool

0x01 ftrace

工作原理

Ftrace的框架图如下,ftrace包括多种类型的tracers,每个tracer完成不同的功能,将这些不同类型的tracers注册进入ftrace framework,各类tracers收集不同的信息,并放入到Ring buffer缓冲区以供调用

ftrace

从上图可知,Ftrace是基于debugfs调试文件系统的,需要先挂载debugfsmount -t debugfs none /sys/kernel/debug

[root@VM-163-30-centos ]# ls /sys/kernel/debug/
acpi  boot_params  dynamic_debug  fnic  kprobes  rssd            suspend_stats  usb             x86
bdi   dma_buf      extfrag        hid   mce      sched_features  tracing        wakeup_sources

ftrace的hook机制

1、静态插桩方式

在Kernel中打开了CONFIG_FUNCTION_TRACER功能后,会增加-pg编译选项,编译器会在每个内核函数的入口处调用一个特殊的汇编函数mcount__fentry__,如果跟踪功能被打开,mcount/fentry 会调用当前设置的 tracer,tracer将不同的数据写入ring buffer

2、动态插桩方式

启用了CONFIG_DYNAMIC_FTRACE选项,编译内核时所有的mcount/fentry调用点都会被收集记录。编译时记录所有被添加跳转指令的函数,这里表示所有支持追踪的函数。在内核的初始化启动过程中,会根据编译期记录的列表,将mcount/fentry调用点替换为NOP指令( no-operation)并直接转到下一条指令。因此在没有开启跟踪功能的情况下,Ftrace不会对内核性能产生任何影响。在开启追踪功能时,Ftrace才会将NOP指令动态替换为mcount/fentry(这里的动态是指的动态修改函数指令),以实现追踪功能

dynamic

0x02 bpftrace

0x0 参考