[发明专利]故障定位的方法和装置有效
申请号: | 200810089912.5 | 申请日: | 2008-04-09 |
公开(公告)号: | CN101261603A | 公开(公告)日: | 2008-09-10 |
发明(设计)人: | 李金虎;朱怀云 | 申请(专利权)人: | 中兴通讯股份有限公司 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 北京康信知识产权代理有限责任公司 | 代理人: | 尚志峰;吴孟秋 |
地址: | 518057广东省深圳市南*** | 国省代码: | 广东;44 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 故障 定位 方法 装置 | ||
技术领域
本发明涉及无内部互锁流水级的微处理器领域,并且特别地,涉及一种对无内部互锁流水级的微处理器的堆栈进行故障定位的方法和装置。
背景技术
无内部互锁流水级的微处理器(MIPS)作为三大RISC CPU(powerpc、arm、以及mips)之一,在嵌入式设备上得到广泛应用,越来越多的嵌入式程序运行于MIPS CPU之上。当应用程序因为空指针、错误指针、溢出等错误导致异常崩溃时,打印出的可供参考的信息寥寥无几。操作系统的异常处理程序里通常只是打印当前CPU的所有寄存器的值以及异常进程异常时用户空间程序指针(pc),堆栈指针(sp)的值等。
通常的定位故障的办法是先反汇编异常进程可执行文件,然后根据异常时打印的pc值去反汇编代码中查找异常发生所在的函数,然而,这种方法有存在以下问题:
第一,这种做法非常的繁琐,并且不够不直观,需要反汇编代码、查找。并且对开发人员有较高要求,很多上层业务开发人员并不熟悉这种反汇编定位故障的方法。
第二,不能解决所有问题。第一种情况是如果当前异常函数被很多函数调用,即使找到了异常函数,依然无法定位是上面哪个函数调用了以及哪个流程出了问题,实际上,定位故障是定位一条函数执行流程。第二种种情况是异常有时发生在库函数里(比如调用库函数的函数传给库函数参数错误),异常记录的pc值为库函数地址,在反汇编用户进程里是无法找到与此pc值对应的地址的。
目前,在现有技术中,尚未提出能够解决以上所述两个问题的技术方案。
发明内容
考虑到上述问题而做出本发明,为此,本发明的主要目的在于提供一种故障定位的方法和装置,以解决相关技术中故障定位繁琐、定位结果不直观、以及故障定位不准确的问题。
根据本发明的一个实施例,提供了一种故障定位方法,用于对无内部互锁流水级的微处理器的堆栈进行故障定位。
该方法包括:在由于函数调用异常导致进程出现异常的情况下,在程序空间中获取异常进程的程序指针的值和堆栈指针的值;根据获取的程序指针的值和堆栈指针的值获取堆栈指针指向的当前函数堆栈的大小以及当前函数堆栈的栈帧中所存储的返回指令;根据当前函数堆栈的大小和堆栈指针的值获取当前函数堆栈之后的函数堆栈的栈帧中存储的函数的返回指令;查找异常进程的可执行文件,并根据查找的可执行文件查找异常进程的符号表,根据在当前栈帧和其它栈帧中获取的返回指令在符号表中查找相应的函数。
此外,获取当前函数堆栈之后的函数堆栈的栈帧中存储的函数的返回指令的处理具体为:确定当前堆栈指针的值;获取当前函数堆栈中存储的返回地址;确定当前函数堆栈的大小;将确定的值和大小相加,将相加的结果作为当前函数堆栈的下一个函数堆栈的栈帧地址,并将下一个函数堆栈作为当前函数堆栈。
其中,在每次获取了一个函数堆栈的栈帧中存储的函数的返回指令后,进一步包括:判断获取的返回指令所对应的函数是否在调用异常的函数体内,如果判断为是,则继续查找下个函数堆栈;否则停止查找函数堆栈。进行判断的处理具体为:获取当前获取的函数堆栈的地址,并从程序空间获取该函数堆栈的大小,并根据当前获取的函数堆栈的地址和大小判断其是否在函数体范围内。
其中,根据获取的返回指令在符号表中查找相应的函数的处理具体为:将符号表中小于并且最接近于返回地址的函数地址作为对应于该返回地址的函数地址,并根据函数地址找到相应函数。
根据本发明的另一实施例,提供了一种故障定位装置,用于对无内部互锁流水级的微处理器的堆栈进行故障定位。
该装置包括:第一获取模块,用于在由于函数调用异常导致进程出现异常的情况下,在程序空间中获取异常进程的程序指针的值和堆栈指针的值;第二获取模块,用于根据获取的程序指针的值和堆栈指针的值获取堆栈指针指向的当前函数堆栈的大小以及当前函数堆栈的栈帧中所存储的返回指令;以及根据当前函数堆栈的大小和堆栈指针的值获取当前函数堆栈之后的函数堆栈的栈帧中存储的函数的返回指令;查找模块,用于查找异常进程的可执行文件,并根据查找的可执行文件查找异常进程的符号表,根据在当前栈帧和其它栈帧中获取的返回指令在符号表中查找相应的函数。
其中,第二获取模块获取当前函数堆栈之后的函数堆栈的栈帧中存储的函数的返回指令的处理具体为:确定当前堆栈指针的值;获取当前函数堆栈中存储的返回地址;确定当前函数堆栈的大小;将确定的值和大小相加,将相加的结果作为当前函数堆栈的下一个函数堆栈的栈帧地址,并将下一个函数堆栈作为当前函数堆栈。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中兴通讯股份有限公司,未经中兴通讯股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/200810089912.5/2.html,转载请声明来源钻瓜专利网。