作为精通IT系统的工程师,我将分享Linux内核故障调试的核心方法和工具,帮助你快速定位和解决内核级问题。
dmesg - 查看内核环形缓冲区消息
dmesg | tail -n 50 # 查看最近50条内核消息
dmesg --level=err,warn # 只查看错误和警告
journalctl - 系统日志查询工具
journalctl -k # 查看内核日志
journalctl --since "1 hour ago" # 查看最近1小时日志
strace - 系统调用跟踪器
strace -p <PID> # 跟踪运行中进程
strace -f command # 跟踪命令及其子进程
perf - 性能分析工具
perf top # 实时性能分析
perf record -a -g # 记录系统范围调用图
处理内核Oops
addr2line -e /usr/lib/debug/boot/vmlinux-$(uname -r) <地址>
分析内核转储(crash dump)
crash /usr/lib/debug/boot/vmlinux-$(uname -r) /var/crash/vmcore
动态打印
echo 'file kernel/module.c +p' > /sys/kernel/debug/dynamic_debug/control
ftrace跟踪
echo function > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/tracing_on
cat /sys/kernel/debug/tracing/trace_pipe
kprobes动态插桩
echo 'p:myprobe do_sys_open' > /sys/kernel/debug/tracing/kprobe_events
检测内存泄漏
echo scan > /sys/kernel/debug/kmemleak
cat /sys/kernel/debug/kmemleak
检测内存越界
火焰图生成
perf record -F 99 -a -g -- sleep 30
perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > perf.svg
锁竞争分析
perf lock record
perf lock report
获取符号信息
nm /boot/vmlinux-$(uname -r) | grep <函数名>
调试模块加载问题
insmod -f -v module.ko # 强制加载并显示详细信息
modinfo module.ko # 查看模块信息
内核配置检查
zcat /proc/config.gz | grep CONFIG_DEBUG
掌握这些工具和方法后,你将能够系统性地分析和解决大多数Linux内核问题。记住,调试内核问题需要耐心和系统性思维,从日志和错误信息入手,逐步缩小问题范围。