Linux内核 -- ftrace 调试工具培训

ftrace 技术培训文档

技术背景

ftrace 是 Linux 内核中的一个跟踪框架,用于调试和分析内核中的性能问题。它允许开发者跟踪内核函数的调用和执行情况,从而帮助定位性能瓶颈和异常行为。

编译和部署 ftrace

开启 ftrace 内核选项

  1. 配置内核选项

    在编译内核时,需要确保以下选项被启用。运行 make menuconfig,并在菜单中找到 ftrace 相关选项进行配置:

    Kernel hacking  --->
        Tracers  --->
            [*] Tracing support
            [*]   Kernel Function Tracer
            [*]   Kernel Function Graph Tracer
            [*]   Interrupts-off Latency Tracer
            [*]   Preemption-off Latency Tracer
            [*]   Scheduling Latency Tracer
            [*]   Trace syscalls
            [*]   Enable ftrace-based function graph anomaly detection
    
  2. 编译并安装内核

    完成配置后,编译并安装新的内核。

    make -j$(nproc)
    make modules_install
    make install
    reboot
    

使用 ftrace

  1. 挂载 debugfs

    ftrace 的信息存储在 debugfs 文件系统中。首先需要挂载 debugfs

    mount -t debugfs none /sys/kernel/debug
    
  2. 启用跟踪

    可以通过以下步骤来启用和查看跟踪信息:

    • 启用功能跟踪

      echo function > /sys/kernel/debug/tracing/current_tracer
      
    • 启动跟踪

      echo 1 > /sys/kernel/debug/tracing/tracing_on
      
    • 查看跟踪输出

      cat /sys/kernel/debug/tracing/trace
      
    • 停止跟踪

      echo 0 > /sys/kernel/debug/tracing/tracing_on
      
    • 清除跟踪缓冲区

      echo > /sys/kernel/debug/tracing/trace
      

示例脚本

下面是一个简单的脚本示例,用于启用 ftrace 并捕获一些内核函数调用的跟踪信息:

#!/bin/bash

# 挂载 debugfs
mount -t debugfs none /sys/kernel/debug

# 选择 function tracer
echo function > /sys/kernel/debug/tracing/current_tracer

# 启用跟踪
echo 1 > /sys/kernel/debug/tracing/tracing_on

# 运行一些命令以生成跟踪信息
ls / > /dev/null

# 停止跟踪
echo 0 > /sys/kernel/debug/tracing/tracing_on

# 显示跟踪信息
cat /sys/kernel/debug/tracing/trace

# 清除跟踪缓冲区
echo > /sys/kernel/debug/tracing/trace

分析 ftrace 输出

当您执行 cat /sys/kernel/debug/tracing/trace 时,输出的格式通常如下:

# tracer: function
#
#           TASK-PID    CPU#    TIMESTAMP  FUNCTION
#              | |       |         |         |
          ls-2516    [000]    123.456789:  vfs_open <-do_sys_open
          ls-2516    [000]    123.456799:  do_sys_open <-sys_open
          ls-2516    [000]    123.456812:  sys_open <-__x64_sys_open

每行的信息如下:

  1. TASK-PID:任务名和进程 ID。
  2. CPU#:CPU 核心编号。
  3. TIMESTAMP:时间戳,通常是自系统启动以来的秒数。
  4. FUNCTION:调用的函数名,箭头 <- 后面的函数表示被调用者。

示例输出解释

以下是一个示例输出及其解释:

# tracer: function
#
#           TASK-PID    CPU#    TIMESTAMP  FUNCTION
#              | |       |         |         |
          ls-2516    [000]    123.456789:  vfs_open <-do_sys_open
          ls-2516    [000]    123.456799:  do_sys_open <-sys_open
          ls-2516    [000]    123.456812:  sys_open <-__x64_sys_open
  • 第一行

    • 任务名:ls
    • 进程 ID:2516
    • CPU 核心编号:0
    • 时间戳:123.456789
    • 函数调用:vfs_opendo_sys_open 调用
  • 第二行

    • 任务名:ls
    • 进程 ID:2516
    • CPU 核心编号:0
    • 时间戳:123.456799
    • 函数调用:do_sys_opensys_open 调用
  • 第三行

    • 任务名:ls
    • 进程 ID:2516
    • CPU 核心编号:0
    • 时间戳:123.456812
    • 函数调用:sys_open__x64_sys_open 调用

其他有用的文件

ftracedebugfs 目录中,有一些其他有用的文件,可以帮助您更好地分析和控制跟踪:

  • set_ftrace_filter:指定要跟踪的函数。
  • set_ftrace_notrace:指定不需要跟踪的函数。
  • trace_pipe:类似于 trace 文件,但可以实时输出跟踪信息,适用于流式处理。

进一步的分析工具

可以使用其他工具来更方便地分析 ftrace 的输出。例如:

  • trace-cmd:一个强大的命令行工具,可以捕获和分析 ftrace 数据。
  • kernelshark:一个图形化工具,可以更直观地分析 ftrace 输出。

示例脚本:使用 trace-cmd

#!/bin/bash

# 开始记录跟踪数据
trace-cmd record -e sched_switch

# 运行一些命令
ls /

# 停止记录并显示跟踪数据
trace-cmd report

通过这些工具和方法,您可以更高效地分析内核函数调用,理解系统行为,并进行性能优化和调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值