点击“硬核王同学”,选择“关注+点赞”
福利干货第一时间送达
大家好,我是硬核王同学。
今天给大家分享下工作当中,当内核崩溃时,用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里这段代码发生错误:
可以看出该函数中有潜在的风险问题:
空指针引用:在函数开始处,没有对host
、card
进行空指针检查。如果host
、card
为空指针,那么在调用mmc_notify_sc_err
时可能会导致程序崩溃。
可以优化代码排除风险:
此时再复现内核崩溃场景,无法复现,问题解决!
------END------
如果觉得有用请点个免费的赞
您的支持就是我最大的动力,这对我很重要!!!