MIPS系统异常现场分析工具的设计与实现
MIPS是一款RISC体系结构的中央处理器,在嵌入式应用的场合,和ARM一样,MIPS核作为IP授权给各集成电路设计厂商根据自己的特定应用生产专用的SOC(single on chip)解决方案。
为节省成本,很多嵌入MIPS的SOC实现,省掉了MIPS的J—TAG支持;或者应用MIPS核的系统,在形成产品应用到实际环境时,才出现死机等异常情况。无论哪种情况,都使得要解决遇到的死机问题变得非常困难。
1 异常处理机制
任何一个CPU都要提供一个详细的异常和中断处理机制。一个软件系统,如操作系统,就是一个时序逻辑系统,通过时钟,外部事件来驱动整个预先定义好的逻辑行为。本文通过设计工具载入异常内存数据(dump),然后进行反汇编,得到系统发生异常情况,定位异常所在位置及引起异常的调用堆栈,反序列出函数调用清单。
2 工具设计与实现
2.1 设计思路及流程
产品软件在工作中,引起死机的原因,一般是非法指令或指令访问了非法地址。而这类非法访问,在支持虚拟地址的CPU体系中,都会引起系统的指令异常,从而进入异常服务程序。该工具根据异常的堆栈数据,配合整个程序空间的指令,列出引起死机问题的有效指令(引起异常的指令地址和函数调用返回的地址)的调用序列。从而避免到处怀疑代码,加入各种观察代码劳心费力的抓取死机现象来解决问题这种低效的方式。该工具对其他的硬件原因引起的死机问题,不在分析之列。流程图如图1。
2.2 设计准备
1)在发布系统程序前,确保系统中异常服务程序,处于活动状态;异常服务程序中,对于数据和指令引起的异常,要输出(dump)引起异常任务当时的堆栈数据。
2)发布系统程序时,保留源码和系统对应的反汇编代码备用。
3)在系统运行过程中,保持对系统串口的接收就绪状态,一旦系统发生异常引起死机,将接收的数据保存到文件(即所指的serial.log文件)。
2.3 反汇编解析
1)复制脚本文件disassemble.sh到ygwinsrcgnutoolsmipsisa32-elfbin目录下。
2)打开Cygwin,在命令行运行disassemble.shOBERON.elf,生成OBERON.elf.lst文件。如图2。
3)运行MStarAnaWexe软件,在反汇编文件栏添加OBERONelf.list文件,在输出记录栏添加serial.log文件,如图3。
4)添加serial.log文件之后系统自动切换到检查堆栈信息界面,如图4。
2.4 堆栈分析
1)一般情况下,本工具自动完成结果,在屏幕上依次显示堆栈调用情况,前面的是被调用函数,后面的是调用者。
2)在分析过程中,可能会需要使用者输入两个参数,这时需要使用这根据输出结果分析汇编代码,输入正确的值这两个值一个是汇编函数的返回地址所在的对边偏移,一个是本函数的堆栈使用情况。返回地址要查看两个相关的汇编代码,“jr ra”即为函数返回指令,与之相关的另一条指令为“swra,xx(sp)”,“lw ra,xx(sp)”,前者是将ra寄存器的值保存到以sp为基址偏移为xx的堆栈中,后者从以sp为基址偏移xx的堆栈中取得数据载入ra寄存器。因此只需要从其中任意一个指令都能得到返回地址在堆栈中的偏移当一个函数中有两个以上的单向改变sp内容的指令出现以后,本工具就无法推算出正确的函数占用堆栈情况了,此时需要使用者阅读汇编代码,输入正确的值。一般这类指令为
“addi sp,sp,-xx”,“addiu sp,sp,-xx”,“addiu sp,reg,mm”,只要sp跟在指令后面,那就有可能是改变了堆栈基指针。然后根据从函数开始到调用(屏幕上)上一个函数出现的位置,将其偏移值累加,相应的,“sw ra,xx(sp)”后面出现的sp变化值也要累加到返回值偏移上去。
3)就图3而言,在堆栈指针偏移栏中输入40,在返回地址基于堆栈指针的偏移栏中输入32,然后确定,就会自动跳转到如图5。
4)同样在相应的选项中输入对应的指针偏移量之后,确定。得到如图6。
5)堆栈分析完成,死机的情况是由于图5中的5个函数(最后俩个去除)引起。
6)可拷贝函数之前的地址(如:_Zapper_Signal函数的地址是80041e98)到OBERON.elf.lst文件查找对应的汇编运行代码,如图7。
7)依以上步骤查看导致错误的汇编代码或者在工程文件中对应函数加入调试,查看代码中存在那些错误。
3 结束语
正确快速查找出现的异常并能快速分析解决软件健壮性和稳定性的关键问题,该工具在满足以上条件的同时,实现如MIPS指令模拟器、MIPS断点调试等功能的扩展,具有比较强的推广性。
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码