安装linux系统报softlock,内核Panic和soft lockup分析及排错

本文介绍了Linux内核Panic和Soft Lockup的分析及排错方法,包括kdump工具、内核崩溃转储流程、内核设置选项以及panic实例分析。通过一个DNS请求处理中的panic问题,展示了如何利用crash工具和内核调试技巧定位问题,最终发现是skb_linearize()函数导致的内存错误。同时,文中也分享了一个Soft Lockup问题的解决过程,通过链表操作的错误发现代码逻辑问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

众所周知,从事linux内核开发的工程师或多或少都会遇到内核panic,亦或者是soft lockup,前者多半是因为内存泄露、内存互踩、访问空地址等错误导致的,而后者可以肯定是因为代码的逻辑不当,进而导致内核进入一个死循环。问题可大可小,当问题足够隐蔽又难以复现时通常会让程序猿们十分抓狂,我前些日子有幸体验了一把,足足花费了我一周时间才成功找到问题,为了让自己以后能从容的面对内核panic,也为了能积累更多的经验,还是用文字记录下来才是最好的形式。

提到内核panic就不得不提kdump,这是对付内核panic的利器,kdump实际上是一个工具集,包括一个带有调试信息的内核镜像(捕获内核),以及kexec、kdump、crash三个部分,kdump本质上是一个内核崩溃转储工具,即在内核崩溃时捕获尽量多的信息生成内核core文件。工作原理如下:

(1) kexec分为内核态的kexec_load和用户态的kexec-tools,系统启动时将原内核加载到内存中,kexec_load将捕获内核也一起加载到内存中,加载地址可在grub.conf中配置,默认为auto,kexec-tools则将捕获内核的加载地址传给原内核;

(2) 原内核系统崩溃的触发点设置在die()、die_nmi()、panic(),前两者最终都会调用panic(),发生崩溃时dump出进程信息、函数栈、寄存器、日志等信息,并使用ELF文件格式编码保存在内存中,调用machine_kexec(addr)启动捕获内核,捕获内核最终转储core文件。捕获内核通常可以采用两种方式访问原内核的内存信息,一种是/dev/oldmem,另一种则是/proc/vmcore;

(3) crash工具提供一些调试命令,可以查看函数栈,寄存器,以及内存信息等,这也是分析问题的关键,下面列举几个常用命令。

log:显示日志;

bt:加参数-a时显示各任务栈信息;

sym:显示虚拟地址对应的标志符,或相反;

ps:显示进程信息;

dis:反汇编函数或者虚拟地址,通过与代码对比,结合寄存器地址找出出错代码中相关变量的地址;

kmem:显示内存地址对应的内容,或slab节点的信息,若出错地方涉及slab,通过kmem则可看到slab的分配释放情况;

rd:显示指定内存的内容;

struct:显示虚拟地址对应的结构体内容,-o参数显示结构体各成员的偏移;

下面借用一下别人画的内核panic流程框图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值