【定位工具】如何定位驱动(ko)模块的oops问题

Linux内核调试 | 分析Oops错误 1:'G'如果所有装载的模块都有GPL或相容的许可证,'P'如果装载了任何的专有模块。可以看到oops_test模块里的init_module的汇编情况,第24~28字节的指令用于把0赋值给x0寄存器,然后往x0寄存器写入0,wzr是一种特殊寄存器,值为0,所以这里发生写空指针错误。CPU后的数字是错误所在逻辑CPU的编号,这里是CPU0,表示CPU0发生的错误,PID:1458表示正在运行的进程ID1458,内核污染原因(G),内核版本( 5.10.66-rt53)。如果涉及到了某项原因,就会显示为。 阅读详情
AI摘要

本文介绍在Linux内核模块(.ko)加载过程中发生Oops时的系统化定位流程:通过解析Oops日志获取异常PC地址,结合objdump反汇编确定函数内偏移,再利用addr2line将地址映射到源码行。强调调试符号启用(如-g、-DDEBUG)为前提,覆盖空指针解引用等典型错误场景。

我们在insmod xxx.ko的时候经常会遇到系统宕机,打印一堆oops信息,下面我根据自己遇到的一个案例来分析下我们如何定位此类问题?遇到问题不要慌,冷静下来一步步分析,就像上学时做数学题一样,一步步分析推理…

根据oops信息找到出问题的代码行
我的案例:oops信息如下

[   40.389877] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
[   40.440158] Mem abort info:
[   40.442967]   ESR = 0x96000005
[   40.446034]   EC = 0x25: DABT (current EL), IL = 32 bits
[   40.451357]   SET = 0, FnV = 0
[   40.454425]   EA = 0, S1PTW = 0
[   40.457579] Data abort info:
[   40.460457]   ISV = 0, ISS = 0x00000005
[   40.464306]   CM = 0, WnR = 0
[   40.467271] user pgtable: 4k pages, 39-bit VAs, pgdp=00000001065c5000
[   40.473716] [0000000000000000] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000
[   40.482423] Internal error: Oops: 96000005 [#1] SMP
[   40.487297] Modules linked in: uplatdrv(O+) iopin_complex(O)
[   40.492964] CPU: 3 PID: 810 Comm: insmod Tainted: G           O      5.10.110 #105
[   40.500525] Hardware name: Rockchip RK3588 EVB4 LP4 V10 Board (DT)
[   40.506698] pstate: 60400009 (nZCv daif +PAN -UAO -TCO BTYPE=--)
[   40.512732] pc : free_dma_rx_desc_resources+0x54/0xf0 [uplatdrv]
[   40.518758] lr : stmmac_release+0x2c/0x70 [uplatdrv]
[   40.523716] sp : ffffffc013ed3810
[   40.527027] x29: ffffffc013ed3810 x28: 0000000000000013 
[   40.532337] x27: ffffffc011f6f770 x26: ffffffc01011cde0 
[   40.537647] x25: 0000000000000006 x24: ffffff8100ee6410 
[   40.542956] x23: ffffff810266c480 x22: ffffff8105ff01c0 
[   40.548266] x21: ffffff8105ff0000 x20: ffffff8105ff00c0 
[   40.553575] x19: 0000000000000000 x18: 0000000000000001 
[   40.558885] x17: 0000000000000000 x16: 0000000000000000 
[   40.564194] x15: 0000000000000000 x14: ffffff81008244c0 
[   40.569504] x13: ffffffc2ecdf3000 x12: 0000000000000006 
[   40.574813] x11: ffffffc0118bd4c0 x10: 0000000000000000 
[   40.580123] x9 : ffffffc00919fbfc x8 : ffffffc0120e9200 
[   40.585432] x7 : 0000000000000018 x6 : ffffff81043f7000 
[   40.590741] x5 : ffffffc0120f6678 x4 : 0000000000000000 
[   40.596050] x3 : 0000000000000002 x2 : 0000000000000000 
[   40.601360] x1 : 0000000000000000 x0 : 0000000000000000 
[   40.606669] Call trace:
[   40.609141]  free_dma_rx_desc_resources+0x54/0xf0 [uplatdrv]
[   40.614820]  stmmac_release+0x2c/0x70 [uplatdrv]
[   40.619454]  rk_gmac_probe+0x720/0x820 [uplatdrv]
[   40.624163]  platform_drv_probe+0x60/0xb4
[   40.628172]  really_probe+0x110/0x514
[   40.631833]  driver_probe_device+0x7c/0x170
[   40.636011]  device_driver_attach+0xcc/0xd4
[   40.640188]  __driver_attach+0xd8/0x17c
[   40.644027]  bus_for_each_dev+0x7c/0xe0
[   40.647867]  driver_attach+0x30/0x40
[   40.651442]  bus_add_driver+0x12c/0x23c
[   40.655282]  driver_register+0x84/0x140
[   40.659121]  __platform_driver_register+0x54/0x60
[   40.663850]  rk_gmac_init_module+0x30/0x5c [uplatdrv]
[   40.668927]  drv_init+0x7c/0xf0 [uplatdrv]
[   40.673022]  do_one_initcall+0x68/0x290
[   40.676863]  do_init_module+0x50/0x25c
[   40.680607]  load_module+0x22dc/0x2a00
[   40.684351]  __do_sys_finit_module+0xd0/0x130
[   40.688708]  __arm64_sys_finit_module+0x2c/0x40
[   40.693236]  el0_svc_common.constprop.0+0xa4/0x2a0
[   40.698026]  do_el0_svc+0x78/0xa0
[   40.701341]  el0_svc+0x20/0x30
[   40.704400]  el0_sync_handler+0xe8/0xf0
[   40.708239]  el0_sync+0x1a0/0x1c0
[   40.711550] 
[   40.711550] PC: 0xffffffc00919f4e8:
[   40.716506] f2e8  f9400001 b4000121 f9406424 b40000e4 b9409002 52800003 52800021 7100005f
[   40.724699] f308  1a9f07e2 d63f0080 f94ee280 52800013 29525c15 6b1302ff 54000180 f9402280

很明显这是一个访问空指针的问题,老生常谈了,遇到这个问题,首先想到的就是找出代码里,什么变量是空指针且访问了。

使用objdump反汇编,然后根据oops中的异常点找出偏移地址
异常的位置:pc : free_dma_rx_desc_resources+0x54/0xf0 [uplatdrv] (0x54是指从函数的基地址开始偏移0x54就是发生问题的地方,0xf0是指函数的大小)
反汇编指令:

objdump -D bin/xxxx.ko > 1.txt

查看1.txt找到free_dma_rx_desc_resources+0x54在这个ko的偏移地址是0x000094e8,其中free_dma_rx_desc_resources函数的基地址是0x00009494

使用addr2line来定位详细的代码行

addr2line -C -f -e xxxx.ko 0x94e8
stmmac/stmmac_main.c:429

注意:以上操作必须建立在ko文件在编译时打开调试选项的基础上

linux宕机时Oops分析及问题定位 以下面这个例子说明(下面这个例子就是造一个野指针所引发的错误): /* * test-debug-scr.c * * Copyright (C) 2012 - 2021 Reuuimlla Limited * * Adapt to support xxx */ #include <linux/types.h> #include <linux/kernel.h> #include <linux/delay.h> #include <linux/id 阅读详情

相关推荐

高通开发系列 - 驱动模块Oops后如何找到出错位置

高通开发系列 - 驱动模块Oops后如何找到出错位置

fulinux的博客 1303

linux之Oops原理及解析

linux之Oops原理和分析

gy794627991的博客 1万+

RK3588平台开发系列讲解(内核调试篇)oops分析

📢当系统内核发生`kernel panic`的时候,系统会打印出`oops`信息,本篇主要介绍如何根据`oops`定位问题。

内核笔记 5726

linux的oops界面,Linux编程时遇到Oops提示该如何排查?

用于表示函数的调用关系,通过这段信息我们可以知道,函数的整个执行流程,知道它的函数调用关系,最后整理出来的函数执行流程如下:本文引用地址:http://www.eepw.com.cn/article/201811/395128.htm从中我们看到了熟悉的init函数、probe函数、以及清楚probe函数下执行的操作过程是到哪一步出错的。现在我们知道了代码的执行流程,出错的PC指针的位置,但还是看...

weixin_39979489的博客 296

OOPS 定位故障代码行

通过OOPS分析定位找到代码行

从实验室到晶圆厂:一文看懂二维半导体(如MoS2)的CVD生长与晶体管制造挑战

本文深入探讨了二维半导体(如MoS2)从实验室研究到晶圆厂量产的CVD生长与晶体管制造关键技术挑战。重点分析了晶圆级二维半导体的CVD生长工艺优化、晶体管制造的四大界面工程难题,以及掺杂与集成的产业化解决方案,为二维半导体在集成电路领域的应用提供技术参考。

weixin_42651748的博客 472

Linux内核oops panic简析

内核异常的级别大致分为三个:BUG、oops、panic。BUG是指那些不符合内核的正常设计,但内核能够检测出来并且对系统运行不会产生影响的问题,比如在原子上下文中休眠,在内核中用 BUG 标识。Oops杀死导致异常的进程或者挂起系统。panic本意是“恐慌”的意思,这里意旨 kernel 发生了致命错误导致无法继续运行下去的情况。根据实际情况 Oops最终也可能会导致panic 的发生。本文将简单分析下这三种异常的流程。

私房菜 6107

Win10网络图标消失,网络图标变成灰色,打开网络设置闪退等问题解决

介绍 主要解决如下问题 网络图标消失 常用方法配置中出现的网络图标变成灰色没有办法打开 打开网络和Internet闪退 错误提示`网络发现已关闭。网络计算机和设备不可见。请启动网络和共享中心的网络发现。 连不上网,诊断结果为 依赖服务或组无法启动 这个问题大概率通过重装系统不能解决,请大家谨慎测试之后最后选择重装这个路线。 方法1:这一步一定要做(卸载三方软件) 把360安全卫士,软件管家这些东西都卸载掉。 我的问题一开始就是这个软件引起的,可能他检测到我还给台式机配了无线网卡,然后就把有线网络的一些

呆呆象呆呆的博客 3万+

36.Linux驱动调试-根据oops定位错误代码行 --------- Good

come from :https://www.cnblogs.com/lifexy/p/8006748.html 1.当驱动有误时,比如,访问的内存地址是非法的,便会打印一大串的oops出来 1.1以LED驱动为例 将open()函数里的ioremap()屏蔽掉,直接使用物理地址的GPIOF,如下图所示: 1.2然后编译装载26th_segmentfault并执行测试程序后,内核便...

zmjames2000 Just record 962

4相5线步进电机驱动原理

步进电机驱动

while(1) 3万+

FastAdmin框架Token验证实战:从登录到API调用的完整流程

本文详细解析了在FastAdmin框架中实现Token验证的完整流程,从数据表设计、登录接口签发Token,到核心验证中间件的编写与路由配置,并探讨了在业务API中的调用与安全实践。内容涵盖Token生成策略、有效期管理及安全增强措施,为开发者提供了一套可落地的API身份验证解决方案。

nnn11的博客 917

oops问题定位记录

编译:内核 / 模块添加 -g -O0,保留调试符号;抓日志:获取 Oops 日志,提取 函数+偏移量;快速定位:使用 addr2line 直接映射源码行;深度验证:使用 objdump 反汇编,确认汇编与源码对应关系;修复问题:根据定位的代码行分析空指针、内存越界等崩溃根因。

qq_40642828的博客 401

CoppeliaSim+matlab+simulink七轴机械臂仿真

七轴机械臂vrep+matlab+simulink 仿真

a1233219的博客 3548

linux设备驱动第四篇:从如何定位oops的代码行谈驱动调试方法

上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试。在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序,那么驱动程序如何调试呢?我们知道在调试程序时经常遇到的问题就是野指针或者数组越界带来的问题,在应用程序中运行这种程序就会报segmentation fault的错误,而由于驱动程序的特殊性,出现此类

haomcu的专栏 4220

大模型的实践应用31-基于通义千问大模型改进台风和海浪预测研究,利用机器学习与通义千问结合的思路实现对台风和海浪预测分析

通义千问大模型是阿里巴巴云推出的一款大规模语言模型,旨在通过强大的自然语言处理能力提供更广泛的服务。从最初的构想到如今的广泛应用,通义千问的发展见证了人工智能领域尤其是自然语言处理技术的巨大进步。自发布以来,通义千问不断迭代升级,不仅在规模上实现了飞跃式的增长,在性能方面也得到了显著提升。本次研究尝试将通义千问强大的自然语言处理能力与经典的时间序列预测算法相结合,旨在提高对未来天气状况预测的精度。具体来说,首先使用通义千问生成高质量的文字描述来增强特征表达力;

微学AI的博客 935

Claude Code 安装指南(Windows / macOS)

本文介绍了Claude Code的安装准备和基本流程。作为开发者工具,安装前需具备命令行操作能力、可用的Claude账号和稳定网络环境。Windows和macOS的安装都需通过终端完成,安装后以命令行形式运行。首次使用建议在熟悉项目中执行简单任务,逐步建立使用习惯。强调安装只是开始,后续需学习如何有效使用工具,包括任务提交流程和上下文提供方法。核心要点是:Claude Code是开发者工具,网络和终端环境是关键,建议先运行再深入理解。

sg_knight的专栏 4485

解锁内核Oops定位密码:Addr2line与Objdump深度协作

本文介绍了Linux内核Oops的概念及其常见触发场景,如空指针解引用、堆栈溢出等。详细讲解了使用Addr2line和Objdump工具定位内核Oops的步骤:获取Oops日志、提取关键信息、反汇编分析和源代码定位。通过一个空指针解引用的实际案例,演示了如何从Oops日志到源代码行号的完整定位过程。文章还总结了工具使用中的常见问题及解决方法,强调了这些工具在内核调试中的重要性。掌握这些工具和方法能有效提高内核开发者的调试效率。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 941

智能车图像处理14-进阶篇6--坡道的判定

这篇文章主要讲述智能车图像处理中 : 如何判断坡道

taiyuezyh的博客 9228

linux oops问题调试

36.Linux驱动调试-根据oops定位错误代码行 1.当驱动有误时,比如,访问的内存地址是非法的,便会打印一大串的oops出来 1.1以LED驱动为例 将open()函数里的ioremap()屏蔽掉,直接使用物理地址的GPIOF,如下图所示: 1.2然后编译装载26th_segmentfault并执行测试程序后,内核便打印了oops出来,如下图所示: 2.接下来,我...

osnet的博客 1983

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Linux驱动调试-根据oops定位错误代码行(一)

1.当驱动有误时,比如,访问的内存地址是非法的,便会打印一大串的oops出来 1.1以LED驱动为例 将open()函数里的ioremap()屏蔽掉,直接使用物理地址的GPIOF,如下图所示: 1.2然后编译装载26th_segmentfault并执行测试程序后,内核便打印了oops出来,如下图所示: 2.接下来,我们便来分析oops: 复制代码 Unable...

boyemachao的专栏 457

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

利用addr2line与objdump协同分析Linux内核Oops错误源码定位

本文详细介绍了如何利用addr2line与objdump工具协同定位Linux内核Oops错误。通过解析Oops日志中的程序计数器地址,结合带调试信息的内核镜像或模块文件,可以精准地将崩溃点映射到源代码的具体行号,是Linux内核开发与驱动调试中排查崩溃问题的核心方法。

blue42的博客 619

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Oops 概念

Oops 是 Linux 内核的一种自我错误检测和报告机制。它在检测到内部严重错误但尚可控制时,主动停止错误上下文,并生成一份包含调用栈等关键信息的详细报告,从而在保证系统最大程度稳定的同时,为开发者提供了强大的问题定位能力。它是 Linux 内核健壮性和可维护性的基石之一。

ZhiqianXia 844

Linux内核模块反编译,内核oops错误调试学习笔记

驱动开发中遇到的 oops 问题,导致内核崩溃,log 一般如下形式Unable to handle kernel paging request at virtual address bfb10be0pgd = c0003000[bfb10be0] *pgd=80000040006003, *pmd=47ab3003, *pte=00000000Internal error: Oops: 8000...

weixin_36033929的博客 1833

Linux驱动调试-根据oops定位错误代码行

1.当驱动有误时,比如,访问的内存地址是非法的,便会打印一大串的oops出来 1.1以LED驱动为例 将open()函数里的ioremap()屏蔽掉,直接使用物理地址的GPIOF,如下图所示: 1.2然后编译装载26th_segmentfault并执行测试程序后,内核便打印了oops出来,如下图所示: 2.接下来,我们便来分析oops: Unable to handl...

xinghuah的专栏 286

内核oops错误调试学习笔记

驱动开发中遇到的 oops 问题,导致内核崩溃,log 一般如下形式 Unable to handle kernel paging request at virtual address bfb10be0 pgd = c0003000 [bfb10be0] *pgd=80000040006003, *pmd=47ab3003, *pte=00000000 Internal error: Oo...

我的学习笔记 2914
上一篇: uboot
下一篇: PCIE设备树解析
程序员毛毛~
博客等级 码龄11年 46粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值