CN100535870C - 嵌入式系统中进程异常跟踪定位的方法 - Google Patents

嵌入式系统中进程异常跟踪定位的方法 Download PDF

Info

Publication number
CN100535870C
CN100535870C CNB2006101673682A CN200610167368A CN100535870C CN 100535870 C CN100535870 C CN 100535870C CN B2006101673682 A CNB2006101673682 A CN B2006101673682A CN 200610167368 A CN200610167368 A CN 200610167368A CN 100535870 C CN100535870 C CN 100535870C
Authority
CN
China
Prior art keywords
address
function
jump
search
instruction
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CNB2006101673682A
Other languages
English (en)
Other versions
CN101211309A (zh
Inventor
蒋鲲鹏
缪敬
马力
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
ZTE Corp
Original Assignee
ZTE Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by ZTE Corp filed Critical ZTE Corp
Priority to CNB2006101673682A priority Critical patent/CN100535870C/zh
Publication of CN101211309A publication Critical patent/CN101211309A/zh
Application granted granted Critical
Publication of CN100535870C publication Critical patent/CN100535870C/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Abstract

本发明公开了一种嵌入式系统中进程异常跟踪定位的方法,解决了目前使用异常跟踪工具中需要存储空间大,配置麻烦,需要调试版本支持的问题。本发明根据发生异常时进程的内存信息,提取出发生异常的程序地址,处理器各寄存器内容,发生异常的可执行文件名字,并且智能回溯出异常发生的函数调用顺序,调用函数的名字和所属文件,并将这些信息保存到文件,通过保存的文件,可以清楚的看到导致进程异常的函数,函数的名字,进程指针等内容,从而定位发生异常的代码位置。同时,保存的文件去掉了不必要的冗余信息,所以保存文件的体积很小,特别适用于智能手机,PDA(个人数字助理)等高端嵌入式系统中应用。

Description

嵌入式系统中进程异常跟踪定位的方法
技术领域
本发明涉及嵌入式系统中进程的异常处理方法,特别涉及到异常进程的异常信息处理,提取的方法。
背景技术
在高端嵌入式系统如PDA,智能手机中,要求提供诸如文字处理,GUI界面,媒体播放器等复杂应用,并且用户可以自行安装和卸载新的程序,比如游戏、工具等等。在传统的嵌入式操作系统已经不能够满足需要了。因此,在高端嵌入式系统都采用如Linux操作系统,WinCE操作系统这些更复杂的操作系统。与传统的嵌入式操作系统相比,这些操作系统具有以下特点:
1、内核运行空间和用户程序运行空间分开,使得用户进程的错误不会造成整个系统的崩溃,提高了系统运行的稳定性;
2、不同的用户进程运行在不同的地址空间,使得一个用户程序的错误不会影响到其他用户程序的运行,提高了系统运行的稳定性;
3、提供了虚拟地址和物理地址映射的管理,使得系统的内存防问更加安全;
4、提供复杂的文件系统支持,提供应用程序和运行库动态链接的能力,运行库和应用程序分开,从而使得系统具备了无限升级的能力。
与传统嵌入式系统一样,高端嵌入式系统中应用程序的开发和调试也采用交叉开发模式,应用程序的编辑、编译都在开发主机上,在程序编译完成后,生成的可执行文件会被下载到嵌入式系统中运行,嵌入式系统上会同时运行交叉调试代理,开发主机上的调试器通过和嵌入式系统上的调试代理通信来控制应用程序的启动、运行和停止。在用户进程发生异常时,常使用异常跟踪工具来跟踪和分析异常:用户程序在发生异常时,操作系统内核运行一般是会正常工作的,内核可以把用户程序发生异常的相关信息保存为文件,利用这些异常信息文件,再结合用户程序的调试版本文件,利用异常跟踪工具(如GDB调试器的异常文件调试功能等)就可以对发生异常的代码进行错误定位。使用异常跟踪工具,可以直接定位到发生异常的函数源代码,得到异常发生的堆栈调用顺序,异常发生时的变量值。因此在用户程序的开发阶段非常有用。但是,这类工具有如下缺点:
1、这些工具要求保存用户程序对应的调试版本,否则就不能定位到异常发生的源代码,也不能够得到异常发生的堆栈调用顺序,因此,使用比较麻烦,尤其是在产品已经发布的情况下,用户程序发生的异常就很难使用这种方法;
2、应用程序和运行库是动态链接的,如果异常跟踪工具库的配置和程序运行时的库配置不一样,也会造成无法定位异常,或错误定位的情况;
3、这类工具都要使用操作系统在内核异常时保存的异常信息文件,而操作系统内核保存的异常文件是发生用户程序异常时对用户程序进程的内存空间的拷贝,用户程序使用的内存空间越大,则保存的文件也就越大,因此,操作系统内核在保存异常文件时都有一个大小的门限,超过门限的文件将无法保存,在开发阶段,嵌入式系统可以通过网络使用开发主机上的存储资源,这个门限可以设置相对较大,方便调试,但在产品发布后,这个门限必须设置得相对较小,以避免影响产品的功能。由于异常文件的大小不定,会出现用户进程异常不能保存的情况,给异常跟踪带来不便。
在传统的实时嵌入式操作系统中也有针对程序执行异常的分析工具,比如在VxWorks操作系统中使用tt(任务跟踪)工具。对于高端嵌入式操作系统来说,这类工具有如下缺点:
1、首先,它们只能使用在物理地址空间运行的情况下,不能使用在高端嵌入式操作系统中虚实地址空间分开的情况下使用;
2、其次,它们只能使用在应用程序与运行库做静态链接的情况下,不适用于高端嵌入式操作系统中使用动态链接库的情况;
3、最后,它们同样要求应用程序必须是调试版本,在编译时必须带有调试信息,否则就不能解析出函数名字。
发明内容
针对现有技术存在的缺陷和不足,本发明提供一种嵌入式系统中进程异常跟踪定位的方法。
为达到上述目的,本发明采用以下技术方案:本发明嵌入式系统中进程异常跟踪定位的方法,包括如下步骤:
步骤A,当进程发生异常时,获取发生异常的用户进程的寄存器值和相关信息;
步骤B,根据所述寄存器值,使用堆栈回溯的方法找到用户进程发生异常时函数的地址,以及调用该函数的函数序列;
步骤C,使用动态链接函数符号查找方法,根据步骤B得到的函数地址,在相应文件的符号表查找出函数的符号;
步骤D,将步骤A、B、C得到的结果保存到异常信息文件中。
优选的:在所述的嵌入式系统中进程异常跟踪定位的方法中,步骤A具体为:
步骤A1,获取发生异常的用户进程的寄存器值,主要有:程序计数寄存器值,堆栈帧寄存器值,堆栈寄存器值,程序状态寄存器值;
步骤A2,获取发生异常进程的相关信息,主要有:进程的任务名字,进程标识编号、进程的堆栈空间范围、进程的代码空间范围、进程全局变量的空间范围,进程动态分配的地址空间范围。
优选的:在所述的嵌入式系统中进程异常跟踪定位的方法中,步骤B具体为:
步骤B1,根据步骤A1获取的堆栈帧寄存器值找到堆栈帧,从堆栈帧找到本函数的返回地址;
步骤B2,判断该返回地址是否是在本进程内存执行空间内的有效的可执行地址;
步骤B3,如果是,以该返回地址为起点,向有效程序空间的低端搜索,搜索调用本函数的调用指令及其地址。
优选的:在所述的嵌入式系统中进程异常跟踪定位的方法中,步骤C具体为:
步骤C1,根据调用指令中的偏移地址,加上调用指令本身的地址,得到在调用本函数时的跳转地址;
步骤C2,判断该跳转地址是直接跳转还是间接动态跳转;
步骤C3,如果是直接跳转,就直接在本执行文件中搜索函数的符号;
步骤C4,如果是间接动态跳转,则查找对应于该间接跳转地址的实际跳转地址;
步骤C5,查找对应该实际跳转地址的函数名字;
步骤C6、将搜索到函数名字、函数地址、文件名字一起保存;
步骤C7,根据保存的堆栈帧寄存器值找到堆栈帧,从堆栈帧得到上层函数的堆栈帧地址,更新保存的堆栈帧寄存器值;
步骤C8,使用保存的堆栈帧寄存器值,判断该堆栈帧寄存器值是否在进程的堆栈空间范围内,同时判断搜索深度是否超过了最大限制,如果堆栈帧寄存器值有效,搜索深度也没有越界,则跳转到步骤B继续运行,否则,跳到步骤D。
优选的:在所述的嵌入式系统中进程异常跟踪定位的方法中,步骤C4具体为:
步骤C41,使用该间接动态跳转地址和操作系统提供的系统调用,找到该地址所属的可执行文件,以及该文件在操作系统进程中的虚拟地址区域,从虚拟地址区域得到该文件在进程内存空间中的映射偏移地址;
步骤C42,使用映射偏移地址和可执行文件,得到该文件在进程内存空间中进程链接表的入口地址;
步骤C43,利用入口地址判断输入地址是否在进程链接表中;如果不是,则输入地址为直接跳转的实际跳转地址,直接返回该地址,如果是,说明输入地址是间接跳转的;
步骤C44,利用输入地址和进程链接表表项的结构就可以得到由动态链接器放置在进程链接表表项中的实际跳转地址,返回该实际跳转地址。
优选的:在所述的嵌入式系统中进程异常跟踪定位的方法中,步骤C5具体为:
步骤C51,使用跳转指令和该指令的地址,得到该指令执行后的程序跳转地址;
步骤C52,判断该地址是否是有效的可执行地址,如果不是,退出处理,返回失败;
步骤C53,如果是,以该地址为起点,向有效程序空间的低端搜索,搜索调用本函数的跳转指令及实际跳转地址,即被调用函数的入口地址;
步骤C54,如果实际跳转地址是直接跳转的静态链接地址,则在当前可执行文件的符号表中搜索对应地址的函数名字,在符号表不存在的情况下,则直接返回地址和为零的函数名字,否则返回函数地址和在符号表中搜索到的函数名字;
步骤C55,如果实际跳转地址是间接跳转的动态链接地址,则找到实际跳转地址所在的可执行文件,然后在该可执行文件的动态符号表中查找与跳转地址对应的函数名字;
步骤C56,返回搜索到的函数地址,函数名字。
优选的:在所述的嵌入式系统中进程异常跟踪定位的方法中,步骤B3、C53具体为:
步骤1,设定最大循环搜寻次数,以返回地址为起始搜索地址,开始循环查找;
步骤2,将搜索地址减去一个指令长度,判断新的指令地址是否是有效的可执行的地址;
步骤3,如果是,取出新地址处的指令,判断该指令是否是改变了程序计数器值的指令;
步骤4,如果是,则跳出循环,退出处理,返回搜索成功和搜索结果;
步骤5,如果不是,将搜索次数加1,跳到步骤2开始继续搜索。
优选的:在所述的嵌入式系统中进程异常跟踪定位的方法中,在步骤B2、步骤B32、步骤C53中判断地址是否是有效的可执行地址的步骤为:
步骤1,输入函数的地址到操作系统内核提供的系统调用中,得出该地址是否在当前进程的一个虚拟地址空间区域内;
步骤2,如果是,判断该地址所属于的虚拟地址空间区域的属性是否是可执行的;如果是,就说明该函数的地址是有效的程序地址。
优选的:在所述的嵌入式系统中进程异常跟踪定位的方法中,步骤D还包括:给所述异常信息文件命名;命名方式有:1、保存时间-进程名字-进程编号,2、保存时间-进程编号-进程名字,3、保存时间-进程编号。
由于采用上述技术方案,本发明具有如下有益效果:
1、由于在符号查找方法的改进,使得本方案不仅可以在软件产品开发时使用,也可以在软件产品发布后的稳定测试,产品改进中使用;
2、克服了传统嵌入式操作系统工具的缺点,不仅可用于静态链接的应用程序,也可以适用于动态链接的应用程序;
3、需要保存的异常文件精简,而且大小固定,克服了操作系统内核保存的异常文件会随着应用程序的内存使用情况变化的缺点,使得本方案更适用于在高端嵌入式系统中使用。
附图说明
图1为本发明嵌入式系统中进程异常跟踪定位的方法流程图;
图2为可执行地址判断示意图;
图3为调用函数跳转指令搜索示意图;
图4为实际跳转地址获取示意图;
图5为函数地址和符号获取示意图。
具体实施方式
本发明的基本设计思想是通过在用户进程发生异常的时候做现场分析,包括堆栈回溯,符号查找,出错文件查找,结果保存。因为只保存分析结果,而不是内存的直接拷贝,所以保存的异常文件很小,而且也不会随着应用程序占有的内存变化而变化。同时,本发明使用分层设计、合理抽象的思想,将与处理器相关的处理、与操作系统的系统调用接口相关的处理都独立成为单独模块,同时固定相关接口,使得本发明可以方便的移植到不同的处理器和不同的操作系统上。将本方案的入口加到操作系统内核异常代码中,操作系统在异常处理中就可以直接调用本方案的异常处理了。
本发明的两个关键技术是:一个是堆栈回溯的方法,一个是动态链接库的符号查找方法。堆栈回溯的方法是:在针对C、C++等高级语言的编译中,对每一个函数都会构造一段堆栈空间,函数的局部变量,部分输入参数都放在堆栈空间内;在函数编译后,编译器会在函数的入口添加一段汇编代码,称之为编译序言,在这段汇编代码里,会保存一个堆栈帧到函数的堆栈空间,在这个堆栈帧里主要保存了:
1、本函数执行完之后的返回地址;
2、返回时的SP(堆栈寄存器)值;
3、返回时的FP(堆栈帧寄存器)值,也就是上一级函数FP的值,如果本函数已经是最顶层函数,则该值为零。
在保存了堆栈帧到堆栈空间后,会把该堆栈帧的地址放到当前的FP(堆栈帧寄存器)里。在函数的出口,编译器同样会添加一段做相反工作的汇编代码,称之为编译尾声,在这段代码里,会恢复保存在堆栈帧里的FP值到FP寄存器里,会恢复保存在堆栈帧里的SP值到SP寄存器里,最后跳转到堆栈帧里保存的返回地址去继续执行。因此,在用户进程发生异常的时候,就可以利用堆栈帧寄存器的值和堆栈帧的内容来回溯出堆栈帧序列。
动态链接函数符号查找的方法是:根据上文所述的堆栈回溯方法,可以在堆栈帧中找到当前函数的返回地址,以这个返回地址为基础向有效程序空间的低地址方向搜索,就可以找到调用该函数的调用指令,分析出该指令的相对偏移地址,再加上该指令的地址,就可以得到一个跳转地址,在这里有两种情况,
1、如果该函数和调用它的函数是在同一个执行文件里(直接链接),则该跳转地址就是被调用函数地址;
2、如果该函数和调用它的函数不是在同一个文件中(动态间接链接),得到的地址就只是一个动态链接的进程链接表表项地址,需要再从进程链接表中取得被调函数的实际跳转地址。
对于直接链接的函数地址,在本执行文件的符号表(在发布版中,符号表可能会被去掉)中查找对应地址的函数名字;对于动态间接链接的地址,则须由该函数所在文件的动态符号表中查找对应的函数名字。
由于本本发明使用了动态链接函数符号查找方法,所以使得本方案不仅可用于开发阶段的程序调试,也可以用于在程序发布后的测试和产品改进。参照附图1,本发明包括如下步骤:
步骤A,当进程发生异常时,获取发生异常的用户进程的寄存器值和相关信息;
步骤B,根据所述寄存器值,使用堆栈回溯的方法找到用户进程发生异常时函数的地址,以及调用该函数的函数序列;
步骤C,使用动态链接函数符号查找方法,根据步骤B得到的函数地址,在相应文件的符号表查找出函数的符号;
步骤D,将步骤A、B、C得到的结果保存到异常信息文件中,同时给所述异常信息文件命名;命名方式有:1、保存时间-进程名字-进程编号、2、保存时间-进程编号-进程名字、3、保存时间-进程编号。
下面结合附图对本发明作详细说明:
第一步:当进程发生异常时,获取发生异常的用户进程的寄存器值,主要有:PC(程序计数寄存器)值,FP(堆栈帧寄存器)值,SP(堆栈寄存器)值,PSR(程序状态寄存器)值;
第二步:获取发生异常进程的相关信息,主要有:进程的任务名字,进程标识编号、进程的堆栈空间范围、进程的代码空间范围、进程全局变量的空间范围,进程动态分配的地址空间范围;
第三步:根据第二步取得的合法地址空间范围来判断发生异常的PC值、FP值、SP值是否合法,如是合法值,则继续处理,否则,跳转到第九个步骤;
第四步:根据保存的FP值找到堆栈帧,从堆栈帧找到本函数的返回地址,首先判断该地址是否是在本进程内存执行空间内的地址,如果不是,则跳转到第九个步骤,否则继续处理。
参照附图2有效地址判断的具体步骤为:
1、输入的函数地址到操作系统内核提供的系统调用中;
2、判断该地址是否在当前进程的一个虚拟地址空间区域内?
3、如果是,再判断该地址所属于的虚拟地址空间区域的属性是否是可执行的?
4、如果是,就说明该函数地址是有效的程序地址,反之,不是;最后返回判断结果。
第五步:以上一步取得的地址为起点,向有效程序空间的低端搜索,以上文所述的动态链接函数符号查找的方法搜索调用本函数的调用指令及其地址;如果成功搜索到结果,继续下一步处理,否则,跳转到第九个步骤。
参照附图3,搜索的具体步骤为:
1、利用FP值得到当前函数的返回地址;
2、设定最大循环搜寻次数,以返回地址为起始搜索地址,开始循环查找;
3、每一次循环开始时,将搜索地址减去一个指令长度;
4、判断新的指令地址是否是有效的可执行的地址(使用图1详细描述的方法);
5、如果不是,退出处理,返回失败,反之,取出新地址处的指令;
6、判断该指令是否是改变了PC(程序计数器)值的指令(这一步与具体的处理器相关,不同的处理器比较的方法不同)?
7、如果是,则跳出循环,退出处理,返回搜索成功和搜索结果;
8、否则,将搜索次数加1,跳到循环开始继续搜索,如果到达最大搜索次数也没有搜索到改变PC值的指令,则退出函数,返回搜索失败。
第六步:使用上一步执行结果,
1、根据调用指令中的偏移信息,加上调用指令本身的地址,得到在调用本函数时的跳转地址;
2、判断该跳转地址是直接跳转还是间接动态跳转,如果是直接跳转,就直接在本执行文件中搜索函数的符号,否则使用附图4描述的方法查找对应于该间接跳转地址的实际跳转地址;
3、如果搜索到函数名字,将函数地址、文件名字和函数名字一起保存,否则就只保存函数地址和文件名字;同时保存其他一些函数的相关信息,如函数的调用地址,变量个数等等,
参照附图4,使用跳转指令得到的跳转地址找到真正程序跳转地址的方法具体包括如下步骤:
1、输入要搜索的地址;
2、使用该地址和操作系统提供的系统调用,找到地址所属的可执行文件,以及该文件在操作系统进程中的虚拟地址区域;
3、从虚拟地址区域得到该文件在进程内存空间中的映射偏移地址;
4、使用映射偏移和可执行文件得到该文件在进程内存空间中进程链接表的入口地址;
5、利用入口地址判断输入地址是否在进程链接表中?
6、如果不是,则输入地址为直接跳转的实际跳转地址,直接返回该地址;
7如果是,说明输入地址是间接跳转的,是进程链接表表项的地址;
8、利用输入地址和进程链接表表项的结构,得到由动态链接器放置在进程链接表表项中的实际跳转地址,返回该实际跳转地址,完成本方法的处理。
参照附图5,根据跳转指令取得函数名字的方法具体包括如下步骤:
1、使用跳转指令和该指令的地址得到该指令执行后的程序跳转地址;
2、利用图1描述的方法判断该地址是否是有效的可执行地址;如果不是,退出处理,返回失败;
3,如果是,利用图3描述的方法得到执行跳转指令后,根据调用指令中的偏移信息,加上调用指令本身的地址,得到在调用本函数时的跳转地址,也即被调用函数的入口地址;
4,判断该跳转地址是否是动态链接地址?
5、如果实际跳转地址是直接跳转的静态链接地址;执行步骤5-1;
5-1、判断当前文件符号表是否存在?
5-2,如果存在,则在当前可执行文件的符号表中搜索对应地址的函数名字;
5-3,返回搜索到的函数名字和函数地址,并保存。
5-4,在符号表不存在的情况下,则直接返回地址和为零的函数名字;
6、接步骤4的判断,如果实际跳转地址是间接跳转的动态链接地址,则找到实际跳转地址所在的可执行文件,
7、在该可执行文件的动态符号表中,查找对应该跳转地址的函数名字;
8、与步骤5-3相同,返回搜索到的函数地址,函数名字,并保存。
第七步:根据保存的FP值找到堆栈帧,从堆栈帧得到上层函数的堆栈帧地址,更新保存的FP值。
第八步:使用保存的FP值,判断该FP值是否在进程的堆栈空间范围内,同时判断搜索深度是否超过了最大限制,如果FP值有效,搜索深度也没有越界,则跳转到第四步继续运行,否则,跳转到第九个步骤。
第九步:将保存下来有效的搜索结果(函数地址,文件名字和函数名字等)按调用顺序保存到异常文件中,同时,将得到的进程信息(任务名字,堆栈空间等),处理器的寄存器信息(PC值,SP值),应用程序的信息(版本号,内核版本号)等等也保存到异常文件中去。
本发明根据发生异常时进程的内存信息,提取出发生异常的程序地址,处理器各寄存器内容,发生异常的可执行文件名字,并且智能回溯出异常发生的函数调用顺序,调用函数的名字和所属文件,并将这些信息保存到文件,通过保存的文件,可以清楚的看到导致进程异常的函数,函数的名字,进程指针等内容,从而定位发生异常的代码位置。同时,保存的文件去掉了不必要的冗余信息,所以保存文件的体积很小,特别适用于智能手机,PDA(个人数字助理)等高端嵌入式系统中应用。
本发明可以在开发阶段使用,也可以在产品的稳定测试、发布版本中使用,因为本发明保存的异常文件小,不会影响产品功能的使用,同时,本发明生成的异常文件包含了足够多的调试信息,可以直接帮助定位引起异常的错误原因,能够大大提高对产品性能改进的速度,方便产品的错误修改。

Claims (10)

1、一种嵌入式系统中进程异常跟踪定位的方法,其特征在于包括如下步骤:
步骤A,当进程发生异常时,获取发生异常的用户进程的寄存器值和相关信息;
步骤B,根据所述寄存器值,使用堆栈回溯的方法找到用户进程发生异常时函数的地址,以及调用该函数的函数序列;
步骤C,使用动态链接函数符号查找方法,根据步骤B得到的函数地址,在相应文件的符号表查找出函数的符号;
步骤D,将步骤A、B、C得到的结果保存到异常信息文件中。
2、根据权利要求1所述的嵌入式系统中进程异常跟踪定位的方法,其特征在于步骤A具体为:
步骤A1,获取发生异常的用户进程的寄存器值,主要有:程序计数寄存器值,堆栈帧寄存器值,堆栈寄存器值,程序状态寄存器值;
步骤A2,获取发生异常进程的相关信息,主要有:进程的任务名字,进程标识编号、进程的堆栈空间范围、进程的代码空间范围、进程全局变量的空间范围,进程动态分配的地址空间范围。
3、根据权利要求2所述的嵌入式系统中进程异常跟踪定位的方法,其特征在于步骤B具体为:
步骤B1,根据步骤A1获取的堆栈帧寄存器值找到堆栈帧,从堆栈帧找到本函数的返回地址;
步骤B2,判断该返回地址是否是在本进程内存执行空间内的有效的可执行地址;
步骤B3,如果是,以该返回地址为起点,向有效程序空间的低端搜索,搜索调用本函数的调用指令及其地址。
4、根据权利要求3所述的嵌入式系统中进程异常跟踪定位的方法,其特征在于步骤C具体为:
步骤C1,根据调用指令中的偏移地址,加上调用指令本身的地址,得到在调用本函数时的跳转地址;
步骤C2,判断该跳转地址是直接跳转还是间接动态跳转;
步骤C3,如果是直接跳转,就直接在本执行文件中搜索函数的符号;
步骤C4,如果是间接动态跳转,则查找对应于该间接跳转地址的实际跳转地址;
步骤C5,查找对应该实际跳转地址的函数名字;
步骤C6、将搜索到函数名字、函数地址、文件名字一起保存。
步骤C7,根据保存的堆栈帧寄存器值找到堆栈帧,从堆栈帧得到上层函数的堆栈帧地址,更新保存的堆栈帧寄存器值;
步骤C8,使用保存的堆栈帧寄存器值,判断该堆栈帧寄存器值是否在进程的堆栈空间范围内,同时判断搜索深度是否超过了最大限制,如果堆栈帧寄存器值有效,搜索深度也没有越界,则跳转到步骤B继续运行,否则,跳到步骤D。
5、根据权利要求4所述的嵌入式系统中进程异常跟踪定位的方法,其特征在于步骤C4具体为:
步骤C41,使用该间接动态跳转地址和操作系统提供的系统调用,找到该地址所属的可执行文件,以及该文件在操作系统进程中的虚拟地址区域,从虚拟地址区域得到该文件在进程内存空间中的映射偏移地址;
步骤C42,使用映射偏移地址和可执行文件,得到该文件在进程内存空间中进程链接表的入口地址;
步骤C43,利用入口地址判断输入地址是否在进程链接表中?如果不是,则输入地址为直接跳转的实际跳转地址,直接返回该地址,如果是,说明输入地址是间接跳转的;
步骤C44,利用输入地址和进程链接表表项的结构就可以得到由动态链接器放置在进程链接表表项中的实际跳转地址,返回该实际跳转地址。
6、根据权利要求4所述的嵌入式系统中进程异常跟踪定位的方法,其特征在于步骤C5具体为:
步骤C51,使用跳转指令和该指令的地址,得到该指令执行后的程序跳转地址;
步骤C52,判断该地址是否是有效的可执行地址,如果不是,退出处理,返回失败;
步骤C53,如果是,以该地址为起点,向有效程序空间的低端搜索,搜索调用本函数的跳转指令及实际跳转地址,即被调用函数的入口地址;
步骤C54,如果实际跳转地址是直接跳转的静态链接地址,则在当前可执行文件的符号表中搜索对应地址的函数名字,在符号表不存在的情况下,则直接返回地址和为零的函数名字,否则返回函数地址和在符号表中搜索到的函数名字;
步骤C55,如果实际跳转地址是间接跳转的动态链接地址,则找到实际跳转地址所在的可执行文件,然后在该可执行文件的动态符号表中查找与跳转地址对应的函数名字;
步骤C56,返回搜索到的函数地址,函数名字。
7、根据权利要求3所述的嵌入式系统中进程异常跟踪定位的方法,其特征在于步骤B3具体为:
步骤1,设定最大循环搜寻次数,以返回地址为起始搜索地址,开始循环查找;
步骤2,将搜索地址减去一个指令长度,判断新的指令地址是否是有效的可执行的地址;
步骤3,如果是,取出新地址处的指令,判断该指令是否是改变了程序计数器值的指令。
步骤4,如果是,则跳出循环,退出处理,返回搜索成功和搜索结果;
步骤5,如果不是,将搜索次数加1,跳到步骤2开始继续搜索。
8、根据权利要求6所述的嵌入式系统中进程异常跟踪定位的方法,其特征在于步骤C53具体为:
步骤1,设定最大循环搜寻次数,以返回地址为起始搜索地址,开始循环查找;
步骤2,将搜索地址减去一个指令长度,判断新的指令地址是否是有效的可执行的地址;
步骤3,如果是,取出新地址处的指令,判断该指令是否是改变了程序计数器值的指令。
步骤4,如果是,则跳出循环,退出处理,返回搜索成功和搜索结果;
步骤5,如果不是,将搜索次数加1,跳到步骤2开始继续搜索。
9、根据权利要求3或6所述的嵌入式系统中进程异常跟踪定位的方法,其特征在于在步骤B2中判断地址是否是有效的可执行地址的步骤为:
步骤1,输入函数的地址到操作系统内核提供的系统调用中,得出该地址是否在当前进程的一个虚拟地址空间区域内;
步骤2,如果是,判断该地址所属于的虚拟地址空间区域的属性是否是可执行的?如果是,就说明该函数的地址是有效的程序地址。
10、根据权利要求1所述的嵌入式系统中进程异常跟踪定位的方法,其特征在于步骤D还包括:给所述异常信息文件命名;命名方式有:1、保存时间-进程名字-进程编号、2、保存时间-进程编号-进程名字、3、保存时间-进程编号。
CNB2006101673682A 2006-12-29 2006-12-29 嵌入式系统中进程异常跟踪定位的方法 Expired - Fee Related CN100535870C (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CNB2006101673682A CN100535870C (zh) 2006-12-29 2006-12-29 嵌入式系统中进程异常跟踪定位的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CNB2006101673682A CN100535870C (zh) 2006-12-29 2006-12-29 嵌入式系统中进程异常跟踪定位的方法

Publications (2)

Publication Number Publication Date
CN101211309A CN101211309A (zh) 2008-07-02
CN100535870C true CN100535870C (zh) 2009-09-02

Family

ID=39611350

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB2006101673682A Expired - Fee Related CN100535870C (zh) 2006-12-29 2006-12-29 嵌入式系统中进程异常跟踪定位的方法

Country Status (1)

Country Link
CN (1) CN100535870C (zh)

Families Citing this family (43)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101539883B (zh) * 2009-05-05 2011-11-16 北京和利时系统工程有限公司 嵌入式系统的错误追踪方法和装置
CN101645033A (zh) * 2009-05-15 2010-02-10 上海闻泰电子科技有限公司 一种手机软件异常时的调试方法
CN101587521B (zh) * 2009-06-17 2011-12-28 北京东方微点信息技术有限责任公司 获取远程计算机信息的方法及装置
CN101615136B (zh) * 2009-06-26 2012-07-18 中兴通讯股份有限公司 linux环境下快速转换调用堆栈地址的系统及方法
CN101714119B (zh) * 2009-12-09 2011-11-02 北京邮电大学 基于二进制程序的测试数据生成器和方法
CN101763293B (zh) * 2009-12-30 2011-12-14 北京数码大方科技有限公司 错误信息的处理方法及装置
CN101895529B (zh) * 2010-05-31 2014-05-21 上海网宿科技股份有限公司 一种在驱动层判断tcp/ip包所属进程的方法
CN102004692B (zh) * 2010-11-25 2015-08-12 中兴通讯股份有限公司 进程调试方法及装置
CN102438016B (zh) * 2011-12-13 2015-07-22 北京星网锐捷网络技术有限公司 获知报文所属进程的方法、访问控制方法、装置及设备
CN102880538B (zh) * 2012-09-27 2015-12-16 邦讯技术股份有限公司 一种Linux软件在ARM芯片上的死机信息侦测方法及系统
CN103106132B (zh) * 2013-03-05 2016-03-16 中标软件有限公司 Linux系统崩溃时内核函数调用栈分析调试方法
CN103544090B (zh) * 2013-10-16 2016-04-06 北京航空航天大学 虚拟机进程监控方法和装置
CN108345492A (zh) 2014-04-08 2018-07-31 华为技术有限公司 一种虚拟化环境中的数据通信的方法、装置及处理器
CN105224346B (zh) * 2014-05-28 2019-11-29 腾讯科技(深圳)有限公司 目标函数定位方法及装置
CN105786688B (zh) * 2014-12-23 2018-10-12 华润半导体(深圳)有限公司 微控制器应用软件的调试方法
CN104679660A (zh) * 2015-03-26 2015-06-03 成都彬鸿科技有限公司 基于符号表的嵌入式系统调试方法和装置
CN106708542B (zh) * 2015-07-17 2020-10-13 中兴通讯股份有限公司 一种嵌入式操作系统代码加载的方法及装置
CN105426755B (zh) * 2015-11-24 2018-04-10 无锡江南计算技术研究所 一种基于哈希算法的库函数安全增强方法
CN105630659B (zh) * 2015-12-23 2018-03-20 北京奇虎科技有限公司 应用崩溃日志的获取方法及装置
CN105678168A (zh) * 2015-12-29 2016-06-15 北京神州绿盟信息安全科技股份有限公司 一种基于栈异常的shellcode检测方法及装置
CN105824749B (zh) * 2016-03-09 2019-06-25 上海博达数据通信有限公司 一种linux系统下用户态进程异常的分析方法
CN107451045A (zh) * 2016-05-31 2017-12-08 北京信威通信技术股份有限公司 一种异常信息定位的方法及装置
CN107515769B (zh) * 2016-06-16 2022-07-05 中兴通讯股份有限公司 一种变量信息提取方法及装置
CN107608809B (zh) * 2016-07-11 2023-09-29 中兴通讯股份有限公司 异常处理方法及装置
CN106354575A (zh) * 2016-08-12 2017-01-25 中国航空工业集团公司西安飞行自动控制研究所 一种基于堆栈追溯的故障排查装置和方法
CN106293629B (zh) * 2016-08-16 2019-08-06 北京小米移动软件有限公司 堆栈获取方法及装置
CN107122216B (zh) * 2017-05-19 2020-06-16 北京计算机技术及应用研究所 一种嵌入式实时操作系统动态加载方法
CN108984328B (zh) * 2017-05-31 2021-08-17 中兴通讯股份有限公司 一种堆栈回溯的方法及装置
CN107329894B (zh) * 2017-06-21 2020-05-12 广州华多网络科技有限公司 应用程序系统测试方法、装置及电子设备
CN107861729B (zh) * 2017-11-08 2021-08-24 中国信息安全测评中心 一种固件装载基址的定位方法、装置及电子设备
CN109840177B (zh) * 2017-11-24 2021-08-24 腾讯科技(深圳)有限公司 一种卡顿的处理方法及相关设备
CN110275791A (zh) * 2018-03-14 2019-09-24 普天信息技术有限公司 一种应用程序异常处理方法及装置
CN108628744B (zh) * 2018-04-28 2022-03-15 深圳市风云实业有限公司 故障诊断方法、装置及电子设备
CN109376030B (zh) * 2018-11-09 2022-05-20 中国航空无线电电子研究所 用于捕获嵌入式操作系统异常的系统
CN112181695A (zh) * 2019-07-01 2021-01-05 顺丰科技有限公司 异常应用处理方法、装置、服务器及存储介质
CN110413432B (zh) * 2019-07-02 2023-09-01 Oppo广东移动通信有限公司 一种信息处理方法、电子设备及存储介质
CN110502357B (zh) * 2019-07-09 2023-01-17 北京字节跳动网络技术有限公司 一种栈回溯方法、装置、介质和设备
CN110489165B (zh) * 2019-08-02 2021-10-15 北京字节跳动网络技术有限公司 获取调用栈栈帧指令偏移的方法、装置、介质和设备
CN112965892A (zh) * 2019-12-12 2021-06-15 大唐移动通信设备有限公司 软件系统的异常信息获取方法、装置、电子设备及介质
CN112527546A (zh) * 2020-12-14 2021-03-19 携程旅游网络技术(上海)有限公司 应用异常快速定位方法、系统、设备及存储介质
CN113342563A (zh) * 2021-04-27 2021-09-03 武汉深之度科技有限公司 程序运行错误时定位源代码的方法、装置及计算设备
CN113626244A (zh) * 2021-08-26 2021-11-09 广州市百果园网络科技有限公司 Anr异常数据的收集方法、显示方法、装置及设备
US11853151B1 (en) * 2022-11-16 2023-12-26 Realtek Semiconductor Corporation Task abnormality detection system and embedded device detection method

Also Published As

Publication number Publication date
CN101211309A (zh) 2008-07-02

Similar Documents

Publication Publication Date Title
CN100535870C (zh) 嵌入式系统中进程异常跟踪定位的方法
US5956479A (en) Demand based generation of symbolic information
CA2292123C (en) Method and system for modifying executable code to add additional functionality
US7316005B2 (en) Data race detection using sequential program analysis
US7865872B2 (en) Producer graph oriented programming framework with undo, redo, and abort execution support
US6003095A (en) Apparatus and method for demand loading a dynamic link library
CN106227671B (zh) 程序运行性能分析方法及装置
US6748396B2 (en) Independent class loader for dynamic class loading
US7127707B1 (en) Intellisense in project upgrade
CN106406960B (zh) 一种linux环境中快速部署软件的方法
US8510727B2 (en) Link-time redundant code elimination using functional equivalence
JPH05505692A (ja) 変換コードを実行するための効果的エラー報告
CN101192193A (zh) 用于实现观察点的方法和系统
CN101984409A (zh) 一种用于Linux系统测试代码注入的方法
CN100349131C (zh) 一种应用程序故障的定位方法
CN102364433B (zh) 在ARM处理器上实现Wine构建工具移植的方法
CN104536870A (zh) 一种进程监控方法和装置
CN100478914C (zh) 一种交叉集成开发环境中的符号调试方法及系统
US20110113409A1 (en) Symbol capabilities support within elf
JP5504960B2 (ja) シミュレーション装置及びシミュレーション方法
US7603666B2 (en) Class loader
Vasilakis et al. Ignis: Scaling distribution-oblivious systems with light-touch distribution
JP4763743B2 (ja) プログラム動作比較装置及び方法及びプログラム
CN111767033B (zh) 用于机械臂程序开发的编程系统及功能扩展方法
Dantas et al. Towards aspect-oriented programming for context-aware systems: A comparative study

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20090902

Termination date: 20151229

EXPY Termination of patent right or utility model