服务器

版本:25.03

常用工具

ftrace

  1. ftrace:是一个针对linux kernel内核空间的debug工具,内核中会提供trace events供用户追踪。而ftrace则可以将events抓取出来,让用户能够直观地看到这些事件,同时也可以追踪内核的函数。
  2. ftrace的配置和使用:要使用ftrace,需要将其相关的依赖编译进内核,openEuler已经默认编译了ftrace选项,如果没开启可以在menuconfig里选择Kernel hacking -> Tracers -> Trace syscalls开启,同时还要编译debugfs,选择Kernel hacking -> Generic Kernel Debugging Instruments -> Debug Filesystem。
  • ftrace的功能配置

ftrace通过debugfs向用户空间提供访问接口,内核配置debugfs后,会创建/sys/kernel/debug目录,debugfs文件系统就是挂载到该目录。如果内核支持ftrace相关的配置项后,会在debugfs下创建一个tracing目录,debugfs文件系统会挂载到该目录,该目录内容如下图所示:

  • ftrace debugfs接口介绍

用户可看到ftrace通过debugfs文件系统提供的一些控制和输出文件,如下对常用的文件做简单说明:

available_tracers:可用的跟踪程序

current_tracer:正在运行的跟踪程序

available_events:列举了系统所有可用的trace events

events:该目录对events按模块做了区分。

set_event:列举当前要追踪的events

tracing_on:用于控制跟踪打开或停止,echo 0 > tracing_on表示关闭,1表示打开

trace:查看跟踪数据

  • 可用的跟踪程序

zh-cn_image_0000001373373585

function:一个无需参数的函数调用跟踪程序

function_graph:一个使用子调用的函数调用跟踪程序

  • 追踪event
shell
# 先注明要追踪ras的arm_event
echo ras:arm_event > /sys/kernel/debug/tracing/set_event

# 这个文件可以看到event的具体格式,会打印什么字段
cat /sys/kernel/debug/tracing/events/ras/arm_event/format

# 启动追踪
echo 1 > /sys/kernel/debug/tracing/tracing_on

#  观察trace的输出
tail -f /sys/kernel/debug/tracing/trace

c50cb9df64f4659787c810167c89feb4_1884x257

  • 追踪内核函数入参

选择跟踪mmap,其对应系统调用do_mmap,选择输出addr入参。

zh-cn_image_0000001373379529

shell
# 通过kprobe跟踪
echo 'p:probe1 do_mmap addr=%x1' > kprobe_events

# 启用kprobe
echo 1 > events/kprobes/probe1/enable

# 启动追踪
echo 1 > tracing_on

# 查看trace数据

zh-cn_image_0000001322379488

  • 追踪函数调用
shell
# 选择追踪类型
echo function_graph > current_tracer

# 设置过滤进程pid
echo <pid> set_ftrace_pid

# 开始追踪
echo 1 > tracing_on

# 查看trace数据

zh-cn_image_0000001322219840

strace

strace命令是一个诊断、调试工具,可以通过使用strace对应用的系统调用及信号传递来进行分析,从而达到解决问题或了解应用执行过程的目的。

可以通过strace -h来查看strace提供了哪些功能。

zh-cn_image_0000001322112990

最常用的使用方式(追踪xx命令,跟踪forks,打印时间,结果输出到output文件中)。

shell
strace -f -tt -o output xx

kdump

  1. crash/kdump原理介绍

    kdump是系统运行在某个时间点的内存状态的快照,便于运维人员debug分析系统挂掉的原因,常用于系统宕机和panic。

    大致流程如下:

    zh-cn_image_0000001321685172

  2. 相关工具安装配置

    shell
    # 使用yum安装相应软件包
    yum install kernel-debuginfo-$(uname -r) kexec-tools crash -y
    
    # 设置crashkernel预留内存大小
    vim /etc/default/grub

    zh-cn_image_0000001372821865

    shell
    # 重新生成grub配置文件
    grub2-mkconfig -o /boot/efi/EFI/openEuler/grub.cfg
    reboot
    
    # 启动kdump服务
    systemctl start kdump #启动kdump
    systemctl enable kdump  #设置开机启动
  3. crash触发

    步骤1. 内核具备默认配置,当硬锁和oops的时候会触发panic。

    zh-cn_image_0000001372824637

    步骤2. 用户可以修改该配置,以下相关命令可使配置生效一次,重启后失效。

    shell
    # 设置软锁触发panic
    echo 1 > /proc/sys/kernel/softlockup_panic
    
    # 设置kernel遇到OOM触发panic
    echo 1 > /proc/sys/vm/panic_on_oom
    
    # 进程出现hang时引发panic
    echo 1 > /proc/sys/kernel/hung_task_panic
    
    # 进程hangtask机制超时时间设置
    echo 60 > /proc/sys/kernel/kernel.hung_task_timeout_secs

    步骤3. 如需要重启自动重启配置,将下列参数写入/etc/sysctl.conf文件,执行sysctl -p生效。

    shell
    kernel.hung_task_panic=1
    kernel.hung_task_timeout_secs=60
    kernel.softlockup_panic=1
    vm.panic_on_oom=1
  4. crash分析

    步骤1. 开启crash调试。

    步骤2. 生成的vmcore文件一般会在“/var/crash/IP地址-时间”目录下。

    步骤3. 执行如下命令即可进入crash调试。

    shell
    crash {vmcore文件} {调试内核vmlinux}

    zh-cn_image_0000001372748125

    crash调试命令格式为 command args,command为需要执行的命令,args为部分调试命令需要的参数。

    命令用途
    help打印命令的help信息,可展示支持命令,也可查看具体命令的help信息,如 help bt。
    bt打印函数调用栈信息。
    log打印系统消息缓冲区,可追加参数,如log。
    ps显示进程的状态,>表示进程为活跃状态。
    dis对给定函数或者地址进行反汇编,如dis -l [func]。
    mount展示当前的文件系统信息