内核Panic和soft lockup分析及排错

本文介绍了Linux内核panic和soft lockup的现象、原因及应对策略。通过kdump工具捕获内核崩溃信息,利用crash工具进行问题排查。在分析panic实例时,涉及DNS请求处理中的内存溢出问题,强调了通过完整信息记录和深入分析数据结构来定位问题的重要性。
摘要由CSDN通过智能技术生成

一、概述

       众所周知,从事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:显示指定内存的内容;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值