Linux编程时遇到Oops提示该如何排查?

2018-11-28 07:16:00 来源:EEFOCUS
标签:

 

各位工程师在Linux下开发程序时,有没有遇到由于系统中存在某些小故障而跳出了“Oops”提示的情况,此时你是如何排查故障?一行行的查看代码吗?其实不用那么复杂,本文将为你介绍一种高效的Linux编程的故障排除方法。
 
在分析Oops之前,我们先来看以下这么一个例子,使用GPIO的中断做掉电检测,参考《嵌入式Linux开发教程下册》的驱动框架,设计如下程序框图:
 
 
这个框架设计之初的理想流程为:应用启动->程序初始化->应用open设备->等待中断事件,但实际项目开发时,往往发生许许多多不可预测的事情。如小王正在调Qt应用,发现老王的进程老在打印,那就不让老王的进程开机自启动,调了两三天后,不定时地提示个Oops提示,小王按照“以前代码不出现,新加的出现,那么起因绝对在新代码内”的惯性思维,认为是新加的Qt导致的,然后小王就不断测试,不断查找bug中.......这样就过去了十年。
 
但原因其实是小王没有open设备,即驱动层没有初始化定时器队列,那么中断处理函数中50ms触发的队列就为一个空值,空指针时Linux内核当然“哎呦”一下提醒你了,而不定时地提示其实就是因为电源不定时地松动,gpio检测到掉电了所以触发了中断。
 
实际上,这样的案例十分常见,原本想A->B->C,实际使用是A->D->C,又或者驱动中有某个变量忘记初始化等等,这时分析Oops就可以十分快速地解决问题。那接下来我们就用Linux中标准驱动去触发一个Oops,对的你没看错,Linux内核标准源码也存在这样的异常,而且我们也可以去修复这样的问题。
 
使用我司的EasyARM-iMX283开发板,内核源码为光盘内的Linux-2.6.35.3.tar.bz2,编译方法请参考光盘资料,我们需要把lcd的背光驱动修改为ko模式。
 
 
烧录完新内核,加载新编译出来的drivers/video/backlight/mxs_bl.ko文件就会提示以下Oops信息:
 
 
乍看之下,这段信息跟乱码差不多,但只要你一层层地分析,你就会发现,这些信息已经告诉了我们错误的原因。接下来就开始我们的Oops分析之旅。
 
1、主要错误信息
 
 
用于提示错误的类型,这里表示使用空指针。
 
2、操作入口
 
 
用于提示错误的操作,这里表示加载mxs_bl模块时出错,对应于加载操作insmod mxs_bl.ko。
 
3、PC指针
 
 
用于提示出错时的PC指针位置,PC指针即当前程序运行点的地址,这里提示表示错误函数为regulator_set_current_limit,偏移地址为0xc。
 
4、LR指针
 
 
用于提示出错时的LR指针位置,LR指针即调用子函数的上一个函数名以及入口偏移量,这里表示上一个函数为set_bl_intensity,偏移地址为0xd8。即set_bl_intensity调用regulator_set_current_limit时出错。
 
5、寄存器值
 
 
用于记录出错时各个寄存器的值,对于汇编比较熟悉的同志们可以研究一下这段信息。
 
6、出错进程信息
 
 
用于提示出错的进程id号与进程名称。出错进程为insmod, PID号2261,对于多任务系统中,可能存在多个PID调用同一个接口的情况。
 
7、出错时的堆栈信息
 
 
用于提示出错时堆栈内保存的寄存器信息,当程序由于中断发生或子程序调用时,会执行压栈操作,即将运行环境保存到堆栈内,保证退出中断或跳出子程序后,运行环境不发生改变。
 
而此处的堆栈信息即记录了程序运行时的环境信息。从中我们可以找到许多LR地址,从而分析出函数调用关系,与下一段的信息有类似作用。
 
8、函数执行的回溯关系
 
 
用于表示函数的调用关系,通过这段信息我们可以知道,函数的整个执行流程,知道它的函数调用关系,最后整理出来的函数执行流程如下:
 
 
从中我们看到了熟悉的init函数、probe函数、以及清楚probe函数下执行的操作过程是到哪一步出错的。现在我们知道了代码的执行流程,出错的PC指针的位置,但还是看不到代码,出错指针处我们只看到了一串数字,那么接下来我们就操作一下,把pc指针的数据变为有意义的代码。
 
关注与非网微信 ( ee-focus )
限量版产业观察、行业动态、技术大餐每日推荐
享受快时代的精品慢阅读
 

 

继续阅读
这家公司用真人假扮AI写程序,竟然还挣了一个多亿?

有多少公司正以AI之名,行人工之实? 在AI落地大潮下,谁有真本事,谁只会玩概念,已经开始显现出来。

红旗系统的风光一时,鸿蒙诞生真的能打好反击战?
红旗系统的风光一时,鸿蒙诞生真的能打好反击战?

1999年,时任科技部部长徐冠华就曾说过,“中国信息产业缺芯少魂”。其中的“芯”指的是芯片,而“魂”则是指操作系统。

作为一款手机可用的 OS,鸿蒙与安卓究竟有何区别?
作为一款手机可用的 OS,鸿蒙与安卓究竟有何区别?

在上周,华为正式发布了备受期待的鸿蒙操作系统。此前外界曾猜测鸿蒙OS将会成为Android的替代,供华为和荣耀的智能手机所使用。但从官方公布的诸多信息来看,鸿蒙OS的使命可远不止替代Android那么简单。

如何制作Linux SD系统启动卡?
如何制作Linux SD系统启动卡?

SD卡启动是开发板系统启动方式的一种。SD系统启动卡共有boot分区、rootfs分区和rootfs-backup分区三个分区,其中boot分区为FAT32格式、rootfs分区和rootfs-backup分区为EXT4格式。

新晋面世的华为方舟编译器到底有何神奇?
新晋面世的华为方舟编译器到底有何神奇?

2017年5月的一个凌晨,华为某实验室里,方舟编译器上第一个Java程序“Hello, World”跑通了。

更多资讯
Qualcomm董事会任命Mark McLaughlin担任董事长

Qualcomm Incorporated(NASDAQ: QCOM)今日宣布任命Mark McLaughlin接替Jeff Henderson担任董事会董事长,该任命于2019年8月13日生效。

科技成就品质生活 戴森举办“智享-净鉴”杭州分享会

今日,戴森在杭州举行地板清洁类新品媒体分享会,旨在为当地家庭提供完整的家居清洁方案。Dyson V11 Absolute智能无绳吸尘器、Dyson V7 Mattress手持除螨吸尘器及Dyson 360 Heurist智能吸尘机器人皆为现代繁忙生活背景下的各类清洁难题设计,协助用户吸除日常生活中的常见微尘,有害颗粒及过敏原[1],以科技

FPGA是否可以脱离CPU独立部署?

作为一种硬件可重构的体系结构,FPGA经常被用作专用芯片(ASIC)的小批量替代品,随着全球数据中心的大规模部署,以及人工智能应用的落地,FPGA凭借强大的计算能力和高度的灵活性有了更多的用武之地。

FPGA 设计经验分享

从大学时代第一次接触FPGA 至今已有10多年的时间,至今记得当初第一次在EDA实验平台上完成数字秒表、抢答器、密码锁等实验时那个兴奋劲。

如何寻找并使用一个适用于FPGA的机器学习平台?
如何寻找并使用一个适用于FPGA的机器学习平台?

随着摄像头和其他设备产生的数据在快速增长,促使人们运用机器学习从汽车、安防和其他应用产生的影像中提取更多有用的信息。专用器件有望在嵌入式视觉应用中实现高性能机器学习 (ML) 推理。但是此类器件大都处于早期开发阶段,因为设计人员正在努力寻找最有效的算法,甚至人工智能 (AI) 研究人员也在迅速推演新方法。