常用工具
ftrace
- ftrace:是一个针对linux kernel内核空间的debug工具,内核中会提供trace events供用户追踪。而ftrace则可以将events抓取出来,让用户能够直观地看到这些事件,同时也可以追踪内核的函数。
- 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:查看跟踪数据
可用的跟踪程序
function:一个无需参数的函数调用跟踪程序
function_graph:一个使用子调用的函数调用跟踪程序
- 追踪event
# 先注明要追踪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
- 追踪内核函数入参
选择跟踪mmap,其对应系统调用do_mmap,选择输出addr入参。
# 通过kprobe跟踪
echo 'p:probe1 do_mmap addr=%x1' > kprobe_events
# 启用kprobe
echo 1 > events/kprobes/probe1/enable
# 启动追踪
echo 1 > tracing_on
# 查看trace数据
- 追踪函数调用
# 选择追踪类型
echo function_graph > current_tracer
# 设置过滤进程pid
echo <pid> set_ftrace_pid
# 开始追踪
echo 1 > tracing_on
# 查看trace数据
strace
strace命令是一个诊断、调试工具,可以通过使用strace对应用的系统调用及信号传递来进行分析,从而达到解决问题或了解应用执行过程的目的。
可以通过strace -h
来查看strace提供了哪些功能。
最常用的使用方式(追踪xx命令,跟踪forks,打印时间,结果输出到output文件中)。
strace -f -tt -o output xx
kdump
- crash/kdump原理介绍
kdump是系统运行在某个时间点的内存状态的快照,便于运维人员debug分析系统挂掉的原因,常用于系统宕机和panic。
大致流程如下:
- 相关工具安装配置
# 使用yum安装相应软件包
yum install kernel-debuginfo-$(uname -r) kexec-tools crash -y
# 设置crashkernel预留内存大小
vim /etc/default/grub
# 重新生成grub配置文件
grub2-mkconfig -o /boot/efi/EFI/openEuler/grub.cfg
reboot
# 启动kdump服务
systemctl start kdump #启动kdump
systemctl enable kdump #设置开机启动
- crash触发
步骤1. 内核具备默认配置,当硬锁和oops的时候会触发panic。
步骤2. 用户可以修改该配置,以下相关命令可使配置生效一次,重启后失效。
# 设置软锁触发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生效。
kernel.hung_task_panic=1
kernel.hung_task_timeout_secs=60
kernel.softlockup_panic=1
vm.panic_on_oom=1
- crash分析
步骤1. 开启crash调试。
步骤2. 生成的vmcore文件一般会在“/var/crash/IP地址-时间”目录下。
步骤3. 执行如下命令即可进入crash调试。
crash {vmcore文件} {调试内核vmlinux}
crash调试命令格式为 command args,command为需要执行的命令,args为部分调试命令需要的参数。
命令 | 用途 |
---|---|
help | 打印命令的help信息,可展示支持命令,也可查看具体命令的help信息,如 help bt。 |
bt | 打印函数调用栈信息。 |
log | 打印系统消息缓冲区,可追加参数,如log。 |
ps | 显示进程的状态,>表示进程为活跃状态。 |
dis | 对给定函数或者地址进行反汇编,如dis -l [func]。 |
mount | 展示当前的文件系统信息 |