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 )
限量版产业观察、行业动态、技术大餐每日推荐
享受快时代的精品慢阅读
 

 

继续阅读
瑞萨电子基于RZ/G Linux平台的安全解决方案将于2019年底上市

全球领先的半导体解决方案供应商瑞萨电子株式会社TSE:6723)今日宣布,将于2019年12月底推出基于RZ/G Linux平台、支持IEC62443-4-2国际安全标准认证的安全解决方案,保护工业控制系统免受网络攻击,并有效缩短用户所需的认证时间。

意法半导体推出STM32MP1微处理器及Linux发行版 加快物联网和智能工业创新

横跨多重电子应用领域的全球领先的半导体供应商意法半导体 (STMicroelectronics,简称ST;纽约证券交易所代码:STM) 利用多年积累的Arm® Cortex® 研发知识扩大STM32 MCU的功能

瑞萨电子推出四款RZ/G2系列64位MPU,提供业界领先的高性能,并可超长期支持Linux

全球领先的半导体解决方案供应商瑞萨电子株式会社(TSE:6723)今日宣布,推出RZ/G系列微处理器(MPU)的第二代产品——基于64位Arm® Cortex®-A57和Cortex®-A53核的RZG2系列MPU,面向工业与建筑自动化应用。

基于嵌入式系统的汽车移动终端软件系统设计

实时操作系统是嵌入式应用软件的基础和开发平台,应用程序都是建立在它之上。实时嵌入式操作系统的种类繁多,大体上可分为两种:商用型和免费型。商用型的实时操作系统功能稳定、可靠,有完善的技术支持和售后服务,但价格昂贵。免费型的实时操作系统在价格方面具有优势,目前主要有RTOS、μC/OS等。

使用32位单片机设计电能计量自动抄表系统

我国社会经济的快速增长直接促进了电力工业的迅猛发展,电力需求不断增加,供应日趋紧张,如今的电力系统已成为一个庞大复杂的多元化系统。为了保证电网正确、安全的商业化运营,必须有一套计量精确、功能强大的电能计量计费系统。

更多资讯
【技术分享】英特尔10纳米Agilex FPGA核心技术全解读

英特尔的10纳米FPGA终于来了。在四月刚刚结束的英特尔“以数据为中心创新日”中,曾经代号为Falcon Mesa的英特尔最新一代10纳米FPGA正式亮相,并正式命名为Agilex™。

【技术分享】使用EPROM或EEPROM配置FPGA大家都会,使用NOR闪存呢?

NOR闪存已作为FPGA(现场可编程门列阵)的配置器件被广泛部署。其为FPGA带来的低延迟和高数据吞吐量特性使得FPGA在工业、通信和汽车ADAS(高级驾驶辅助系统)等应用中得到广泛采用。汽车场景中摄像头系统的快速启动时间要求就是很好的一个例子——车辆启动后后视图像在仪表板显示屏上的显示速度是最为突出的设计挑战。

【技术分享】详解FPGA中的DDS技术

我知道,我对与电子有关的所有事情都很着迷,但不论从哪个角度看,今天的现场可编程门阵列(FPGA),都显得“鹤立鸡群”,真是非常棒的器件。如果在这个智能时代,在这个领域,想拥有一技之长的你还没有关注FPGA,那么世界将抛弃你,时代将抛弃你。

高云半导体研讨会圆满召开,累计出货已达1500万片

2019年4月12日,中国武汉,高云半导体FPGA技术研讨会系列活动于武汉凯悦酒店成功召开,现场气氛热烈,座无虚席。

高云半导体研讨会圆满召开,累计出货已达1500万

2019年4月12日,中国武汉,高云半导体FPGA技术研讨会系列活动于武汉凯悦酒店成功召开,现场气氛热烈,座无虚席。

Moore8直播课堂
开发板测评
技术讨论
电路方案

1970-01-01 08:00:00