当前位置: 首页 > news >正文

四步定位linux内核oops原因

总结

1. 根据oops信息,找到出问题的函数xxx_func,以及对应的xxx文件

2. 根据gdb和xxx.o文件 ;使用《 disassemble /m  xxx_func 》来反汇编出代码,已经代码对应的汇编码;注意xxx_func若有内联函数的话,可能显示不全,建议不要用内联函数,而直接用代码替换

3. 根据oops信息找到出问题的pc指针,根据这个pc相对于xxx_func的偏移,找到出问题的代码行,代码下面会有汇编码,这个汇编的寄存器,又可以在oops信息里找到寄存器的快照(汇编不懂就用ai解释下)

4. 寄存器的值,再加上oops最开始的提示,比如会是nullptr(一般是错误使用空指针);还是*pte=00000(一般是被提前释放过了);还是abort on non-linefetch(一般是内存访问不了,可能硬件错误)

示例1

oops信息如下

<1> [54245.466372] Unable to handle kernel NULL pointer dereference at virtual address 00000010
<1> [54245.474729] pgd = c1794000
<1> [54245.477443] [00000010] *pgd=01090831, *pte=00000000, *ppte=00000000
<0> [54245.483879] Internal error: Oops: 17 [#1] PREEMPT THUMB2
<4> [54245.638361] CPU: 0 PID: 21542 Comm: iw Not tainted 3.10.33 #2
<4> [54245.644095] task: c1348000 ti: c13e2000 task.ti: c13e2000
<4> [54245.649524] PC is at nl80211_send_iface+0xc/0x160
<4> [54245.654221] LR is at nl80211_new_interface+0x1cf/0x224
<4> [54245.659345] pc : [<c02956ec>]    lr : [<c029a56f>]    psr: 40000033
sp : c13e3c40  ip : 0000005d  fp : 00000000
<4> [54245.670813] r10: 00000014  r9 : c13e3ca0  r8 : c0923100
<4> [54245.676028] r7 : 00000002  r6 : c17b8000  r5 : 00000000  r4 : c0923100
<4> [54245.682555] r3 : 00000000  r2 : 673be4b6  r1 : 00005426  r0 : c0923100
<4> [54245.689082] Flags: nZcv  IRQs on  FIQs on  Mode SVC_32  ISA Thumb  Segment user

反汇编打印如下,0xc的是12,其反汇编是ldr.w r9,[r5,#16],用于从由 r5 和偏移量 16 计算得到的内存地址加载 32 位数据到寄存器 r9 中;但是上面的寄存器信息中R5 = 0 ;所以对应到代码中就是wdev是空指针

示例2

 比如entry成员r1,加上四个字节的地址就是出问题的地址,这个地址的pte为0 ,证明被提前释放掉内存了

示例3

针对external abort相关的错误,上述方法会导致有可能软件确定不了出问题的地方,那基本上是硬件问题,比如发现pcie设备的参考时钟会断,导致pcie传输数据的时候,访问pcie内存空间失败

<1> [   23.834843] Unhandled fault: imprecise external abort (0xc06) at 0x01a9559c
<0> [   23.841827] Internal error: : c06 [#1] PREEMPT THUMB2
<4> [   23.900082] CPU: 0 PID: 952 Comm: kmodloader Not tainted 3.10.33 #12
<4> [   23.906426] task: c129b500 ti: c12aa000 task.ti: c12aa000
<4> [   23.911855] PC is at aicwf_pcie_host_init+0x13/0x82 [aic8800D80_fdrv]
<4> [   23.918321] LR is at rwnx_init_aic+0x50/0x8a [aic8800D80_fdrv]
<4> [   23.924146] pc : [<bf9046c0>]    lr : [<bf8ee9e3>]    psr: 80000033
sp : c12abbf8  ip : 00000000  fp : 00000000
<4> [   23.935614] r10: c1f92f40  r9 : bf919d18  r8 : bf90d5b4
<4> [   23.940830] r7 : c1f93000  r6 : c1f90440  r5 : cb1dc000  r4 : c11e0000
<4> [   23.947357] r3 : cb1dfb64  r2 : cb1dc048  r1 : cb1dc04c  r0 : 00000000
<4> [   23.953853] Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32  ISA Thumb  Segment user
<4> [   23.961173] Control: 50c53c7d  Table: 01238059  DAC: 00000015

 

相关文章:

  • dify 部署后docker 配置文件修改
  • 如何在Idea中编写Spark程序并运行
  • 缓存雪崩:高并发系统中的隐形杀手与应对策略
  • XSS 攻击:深入剖析“暗藏在网页中的脚本“与防御之道
  • 代码随想录算法训练营 Day39 动态规划Ⅶ 打家劫舍
  • ChromaDB调用BGE模型的两种实践方式
  • vscode 安装插件
  • java算法的核心思想及考察的解题思路
  • 制作一款打飞机游戏39:鼠标控制
  • 【大模型系列】使用fastapi为langchain应用快速对外提供restful api
  • 学习Linux的第四天
  • nginx 上传文件,413 request entity too large
  • 使用Milvus向量数据库构建具有长期记忆的对话机器人
  • 从人脸扫描到实时驱动,超写实数字分身技术解析
  • Java学习手册:数据库事务相关知识
  • Web 架构之动静分离:原理、实践与优化
  • SSL/TLS 证书与数字签名:构建互联网信任的详解
  • spark转换算子
  • 【Java项目脚手架系列】第三篇:Spring MVC基础项目脚手架
  • Excel处理控件Aspose.Cells教程:压缩Excel文件完整指南
  • 中美会谈前都发生了什么?美方为何坐不住了?
  • 《瞭望》周刊社原总编辑、党委书记姬斌逝世,享年67岁
  • 印巴开始互袭军事目标,专家:冲突“螺旋式升级”后果或不可控
  • 教育部答澎湃:2025世界数字教育大会将发布系列重磅成果
  • 视频丨雄姿英发!中国仪仗队步入莫斯科红场
  • 云南一餐馆收购长江野生鱼加工为菜品,被查处罚款