Linux内核崩溃?教你用crash_arm轻松解决

点击“硬核王同学”,选择“关注+点赞”

福利干货第一时间送达

大家好,我是硬核王同学。

今天给大家分享下工作当中,当内核崩溃时,用crash_arm工具定位问题点并解决的过程。

问题现象:当SD卡未完全插入时,内核已经检测插入了SD卡,此时立马弹出SD卡,会造成内核崩溃!

那么该如何解决呢?

1.查找log

当内核发生崩溃时,产品会自动重启将内核崩溃的日志写到log中。

图片

再敲命令:cat  sysdump.*  > sysdump.core 生成sysdump.core文件,后面查找出错代码时会用到。

2.利用crash_arm工具排查出错

cp sysdump.core、vmlinux 到 /M901/vendor/sprd/tools/crash下,利用crash_arm工具查找出错的代码

在命令行输入./crash_arm sysdump.core vmlinux,根据给定的sysdump.core文件和vmlinux文件来执行一个ARM架构的程序崩溃分析。

图片

可以看到错误是有一个 "Unable to handle kernel NULL pointer dereference at virtual address 000001db"

在内核中发生了一个无法处理的空指针解引用错误,虚拟地址是000001db。这通常意味着内核代码中的一个指针变量没有被正确初始化,导致在对其进行解引用(访问其指向的内存)时发生错误。解决这个问题可能需要检查内核代码中与指针相关的部分,确保正确初始化并避免空指针解引用。

敲击命令详细查看内核崩溃原因:

crash_arm> dmesg

翻到最后,可以看到:

图片

当前程序是处于mmc_notify_sc_work+0x1c/0xb4附近发生了错误

命令行输入:

图片

可以查看该处源文件和附近代码:

图片

再结合命令行进行反汇编查看PC处的值:

图片

该指令从r3寄存器的偏移地址为475的内存位置中加载一个字节的数据到r3寄存器中。

3.排查代码

可以确定是函数mmc_notify_sc_err里这段代码发生错误:

图片

可以看出该函数中有潜在的风险问题:

空指针引用:在函数开始处,没有对hostcard进行空指针检查。如果hostcard为空指针,那么在调用mmc_notify_sc_err时可能会导致程序崩溃。

可以优化代码排除风险:

图片

此时再复现内核崩溃场景,无法复现,问题解决!

------END------

如果觉得有用请点个免费的赞

您的支持就是我最大的动力,这对我很重要!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬核王同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值