CN101539883A - 嵌入式系统的错误追踪方法和装置 - Google Patents

嵌入式系统的错误追踪方法和装置 Download PDF

Info

Publication number
CN101539883A
CN101539883A CN200910083194A CN200910083194A CN101539883A CN 101539883 A CN101539883 A CN 101539883A CN 200910083194 A CN200910083194 A CN 200910083194A CN 200910083194 A CN200910083194 A CN 200910083194A CN 101539883 A CN101539883 A CN 101539883A
Authority
CN
China
Prior art keywords
function
stack frame
calls
frame
stack
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.)
Granted
Application number
CN200910083194A
Other languages
English (en)
Other versions
CN101539883B (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.)
Beijing Hollysys Co Ltd
Original Assignee
Beijing Hollysys Co Ltd
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 Beijing Hollysys Co Ltd filed Critical Beijing Hollysys Co Ltd
Priority to CN2009100831945A priority Critical patent/CN101539883B/zh
Publication of CN101539883A publication Critical patent/CN101539883A/zh
Application granted granted Critical
Publication of CN101539883B publication Critical patent/CN101539883B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Abstract

本发明公开了一种嵌入式系统的错误追踪方法和装置,在系统发生异常时,保存处理器运行环境,根据帧指针找到当前运行的函数的栈帧;反复进行下列步骤,直到回溯出系统发生异常时运行的整个函数调用关系链:从找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,和函数参数信息,及该函数代码的起始地址,以及进一步地获得函数的名称,并且得到调用该函数的函数的栈帧底;通过所述栈帧底找到该调用该函数的函数的栈帧。本发明的技术方案能在系统发生异常时,能快速定位与错误有关的指令和函数,无论软件系统是否有操作系统支持都可以适用,而且当存在多条函数调用分支时,可以快速查找出当前运行出错的函数的调用路径,提高追踪效率。

Description

嵌入式系统的错误追踪方法和装置
技术领域
本发明涉及嵌入式系统,尤其涉及一种嵌入式系统的错误追踪方法和装置。
背景技术
在工业控制领域,随着我国经济的快速发展,电力、化工、能源以及其它领域自动化应用的深入,除了对自动化控制系统的性能、功能的要求外,对嵌入式软件系统的可靠性提出了更加严格的要求,工业控制系统实施的现场或者在系统的研发阶段,应用程序运行过程中由于设计缺陷,会出现很多错误异常,导致系统死机和复位。
在目前已有的嵌入式软件系统中,当系统发生错误宕机时,能够保存现场信息,找到造成系统错误宕机的指令的地址,以供查询和恢复;但是,有些情况下,造成系统宕机的那一条指令本身并没有错误,其错误的根源在于与该指令相关的、之前执行的其它指令;而当指令代码较多,存在多层调用和多路分支时,要寻找错误根源将成为一项复杂且耗时颇多的工作,这样在系统宕机后,就不能有效和及时的对系统进行调试和恢复,这就对系统稳定性和造成了比较大的影响。
发明内容
本发明要解决的技术问题是提供一种嵌入式系统的错误追踪方法和装置,在系统发生异常时,能快速定位与错误有关的指令和函数。
为了解决上述问题,本发明提供了一种嵌入式系统的错误追踪方法,包括:
在系统发生异常时,保存处理器运行环境,根据帧指针找到当前运行的函数的栈帧;
反复进行下列步骤,直到回溯出系统发生异常时运行的整个函数调用关系链:
从找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,和函数参数信息,及该函数代码的起始地址,以及进一步地获得函数的名称,并且得到调用该函数的函数的栈帧底;通过所述栈帧底找到该调用该函数的函数的栈帧。
进一步地,所述的方法具体包括以下步骤:
A、在系统发生异常时,处理器根据不同的异常类型,跳转到相应的异常处理流程,保存导致发生异常的处理器运行环境,包括程序计数器、栈指针、帧指针和通用寄存器的内容;
B、当发生数据访问中止异常时,获取失效访问存储器的状态和类型,和引起存储访问失效的存储访问的地址;
发生其它异常时则获取指令出错的地址;
C、从发生异常时帧指针所指的内存位置找到当前运行函数的栈帧;
D、从所找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,取出该函数执行函数体代码之前保存的函数参数信息,及该函数代码的起始地址;从该函数的代码区中取得该函数的名称;
E、判断是否存在调用该函数的函数,如果存在,则从所找到的栈帧中得到该函数的返回地址,和该调用该函数的函数的栈帧的栈帧底,找到该调用该函数的函数的栈帧,返回步骤D;否则结束。
进一步地,所述步骤E中,判断是否存在调用该函数的函数是指:
如果所找到的栈帧中,用于保存该调用该函数的函数的栈帧底的位置保存的值为0,则表示不存在调用该函数的函数,否则表示存在。
进一步地,步骤E中:
从该函数的栈帧底的回溯结构信息中找到所述该函数的返回地址和该调用该函数的函数的栈帧底。
进一步地,步骤A前还包括步骤:
通过处理器的存储管理单元设置好各内存区间的读写访问属性,使得应用程序对不同的内存区域有不同的访问权限。
本发明还提供了一种嵌入式系统的错误追踪装置,包括:
异常处理单元,用于在系统发生异常时,获取并保存处理器运行环境;
栈帧回溯单元,用于根据系统发生异常时的帧指针找到当前运行的函数的栈帧;然后反复进行下列步骤,直到回溯出系统发生异常时运行的整个函数调用关系链:从找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,和函数参数信息,及该函数代码的起始地址,以及进一步地获得函数的名称,并且得到调用该函数的函数的栈帧底;通过所述栈帧底找到该调用该函数的函数的栈帧;
输出单元,用于将所述异常处理单元保存的处理器运行环境,和所述栈帧回溯单元回溯出的函数调用关系链。
进一步地,所述异常处理单元具体包括:
现场保存模块,用于在系统发生异常时,获取并保存导致发生异常的处理器运行环境,包括程序计数器、栈指针、帧指针和通用寄存器的内容;
错误参数获取模块,用于当发生数据访问中止异常时,获取并保存失效访问存储器的状态和类型,和引起存储访问失效的存储访问的地址;发生其它异常时则获取并保存指令出错的地址。
进一步地,所述栈帧回溯单元具体包括:
栈帧查找模块、栈帧信息读取模块、判断模块和调用信息读取模块;
所述栈帧查找模块用于根据系统发生异常时的帧指针所指的内存位置查找当前运行函数的栈帧;找到后指示栈帧信息读取模块读取所找到的栈帧;
所述函数信息读取模块用于接收到所述栈帧查找模块的指示后,从所找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,取出该函数执行函数体代码之前保存的函数参数信息,及该函数代码的起始地址,并从该函数的代码区中取得该函数的名称;读取完成指示判断模块进行判断;
所述判断模块用于判断是否存在调用该函数的函数,如果存在,则指示所述调用信息读取模块读取调用信息;否则指示所述输出模块输出所述函数信息读取模块读取的全部信息;
所述调用信息读取模块用于接收到所述判断模块的指示后,从所找到的栈帧中得到该栈帧所属函数的返回地址,和该调用该函数的函数的栈帧底,并将找到的栈帧底发送给所述栈帧查找模块;
所述栈帧查找模块还用于根据所述栈帧底查找相应的栈帧,找到后指示栈帧信息读取模块读取所找到的栈帧。
进一步地,所述判断模块判断是否存在调用该函数的函数是指:
如果所找到的栈帧中,用于保存该调用该函数的函数的栈帧底的位置保存的值为0,则表示不存在调用该函数的函数,否则表示存在。
进一步地,所述调用信息读取模块从该函数的栈帧底的回溯结构信息中找到所述该函数的返回地址和该调用该函数的函数的栈帧底。
本发明的技术方案无论软件系统是否有操作系统支持都可以适用,通过对函数调用栈的分析,都可以对出错指令所在函数的函数调用关系链进行回溯追踪,将运行时与出错指令所在函数有调用关系的各层函数筛选出来,当存在多条函数调用分支时,可以快速查找出当前运行出错的函数的调用路径;通过得到的函数调用关系链中各函数的函数名称、被调用时的回溯结构信息以及各自的栈帧信息,找到引起系统崩溃的错误代码真正引起系统宕机的“根源”,就可以快速地定位到嵌入式软件系统中导致系统宕机的软件缺陷,为后续的故障解决和软件完善提供了关键的辅助信息和保障。对嵌入式软件系统而言,即是为提高内核的稳定性和可靠性提供了比较大帮助和意义。本发明的优化方案还提出对内存区域进行权限定义,从而能够达到保护内存页面的效果。
附图说明
图1是实施例一中嵌入式系统的错误追踪方法的流程示意图;
图2是实施例二中嵌入式系统的错误追踪装置的示意框图;
图3是实施例三中系统上电后的运行流程示意图;
图4是实施例三中的内存栈布局示意图。
具体实施方式
下面将结合附图及实施例对本发明的技术方案进行更详细的说明。
本发明提出了以下基本思想,并在此基础上设计了一种嵌入式系统的错误追踪方法和装置:
当系统错误发生时,对于应用程序导致的错误可以予以监控,在应用程序发生除零、内存访问越界、缓冲区溢出等不可恢复的错误时,通过回溯出错指令所在函数的调用关系,从全部指令中筛选出当前运行的函数调用关系链上的各函数,从而快速定位错误根源。
其中,回溯出错指令所在函数的调用关系通过分析函数调用栈(callstack)实现;所述函数调用栈是指存放的正在运行的函数的信息的栈;函数调用栈被分成了连续的部分,叫做栈帧(stack frame),或者简称为帧;每一个栈帧对应着一个函数调用,或者说对应于一个未完成运行的函数。局部变量的分配和释放都是通过操纵所述函数调用栈来实现的。所述函数调用栈用来传递函数参数,存储返回值信息,保存寄存器以供恢复调用前处理机状态。每次调用一个函数,都要为该次调用的函数实例分配栈空间;这个栈帧中的内存空间被其所属的函数独占,正常情况下是不会和别的函数共享的;为单个函数分配的那部分栈空间就叫做栈帧,也就是说,栈帧这个说法主要是为了描述函数调用关系的。
函数栈帧的大小并不固定,一般与其对应函数的局部变量多少有关。函数运行过程中,其栈帧大小也是在不停变化的。栈帧包含着给这个函数传递的参数,函数的局部变量和调用函数的栈帧信息,以及函数的返回地址。栈是链接起来的“栈帧”的一个列表,通过调用函数时所保存的回溯结构信息就可以把一个一个的栈帧链接成栈;各栈帧的回溯结构信息存储在该栈帧的高端(栈帧底);当对一函数进行调用时,将母函数(即调用该函数的函数,也可称为父函数)调用该函数的相关信息保存为本帧的回溯结构信息,包括:母函数的栈帧的起始地址(母函数的栈帧底)、本函数的返回地址等信息。
系统里还包括两个指针,一是帧指针,指向把栈帧给链接起来的一个一个回溯结构信息所组成的列表中的最后一个栈帧的栈帧底,该位置保存了调用该最后一个栈帧所属函数的函数的栈帧底;二是栈指针,指向所述函数调用栈当前的栈顶,当有新的信息要入栈,或是为函数分配新的栈帧时,从栈指针指向的内存位置开始存储(即压栈)或是分配栈帧空间。
本发明提出通过对函数调用栈和栈帧的分析,利用所述帧指针来追溯函数的调用顺序,反向跟踪调用的函数,完成函数调用关系回溯,并以此类推直到第一个函数,这样在系统崩溃时就可以得到在崩溃前状态为运行中的函数都是哪些,并得到这些函数的函数名称、函数栈内容等工作,从而能够快速追踪到错误的根源。
实施例一,一种嵌入式系统的错误追踪方法,包括:
在系统发生异常时,保存处理器运行环境,根据帧指针找到当前运行的函数的栈帧;
反复进行下列步骤,直到回溯出系统发生异常时运行的整个函数调用关系链:
从找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,和函数参数信息,及该函数代码的起始地址,以及进一步地获得函数的名称,并且得到调用该函数的函数的栈帧底;通过所述栈帧底找到该调用该函数的函数的栈帧。
本实施例中,所述方法如图1所示,具体包括以下步骤:
A、在系统发生异常时,处理器根据不同的异常类型,跳转到相应的异常处理流程,保存导致发生异常的应用程序的上下文(处理器运行环境),包括程序计数器、栈指针、帧指针和通用寄存器的内容,为函数调用关系回溯设置环境;
B、当发生数据访问中止异常时,获取失效访问存储器的状态和类型,和引起存储访问失效的存储访问的地址;发生其它异常(比如预取异常,未定义指令异常)时则获取指令出错的地址;
C、从发生异常时帧指针所指的内存位置找到当前运行函数的栈帧;
D、从所找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,取出该函数执行函数体代码之前保存的函数参数信息,及该函数代码的起始地址;从该函数的代码区中取得该函数的名称;
E、判断是否存在调用该函数的函数,如果存在,则从所找到的栈帧中得到该函数的返回地址,和该调用该函数的函数的栈帧底,找到该调用该函数的函数的栈帧,返回步骤D;否则错误追踪结束。
这样,就可以得到异常发生时刻的处理器状态、指令的运行地点,得到在运行的函数调用关系链,和其中在运行的函数的相关信息,从而完成导致系统异常的错误的追踪。
本实施例中,失效访问类型包括地址非对齐访问,没有读写权限,基于页的地址变换失效等。根据对系统预先对内存区域设置的不同访问属性,应用程序就大概知道是什么操作引起了错误;当然,得到这些信息还不足以定位应用程序错误和得到函数调用关系,还要进行上述步骤C。
本实施例中,所述步骤E中,判断是否存在调用该函数的函数是指:如果所找到的栈帧中,用于保存该调用该函数的函数的栈帧底的位置保存的值为0,则表示不存在调用该函数的函数,否则表示存在。
本实施例中,所述步骤A中,可以但不限于将处理器运行环境保存到一全局变量数组中,处理器运行环境包括当前程序状态寄存器、程序计数器、指令计数器、链接寄存器、栈指针、和帧指针等。这样就可以获取到发生异常时,当前应用程序运行的处理器现场,以及可以据此得到应用程序函数调用栈的内容;这些也为分析应用程序出错现场提供了帮助。
本实施例中,所述步骤C中,因为每次应用程序执行函数调用的时候,就产生关于该调用的消息;这个消息包括调用函数传递的参数,函数的返回地址,和调用函数的栈帧信息,被调用函数的局部变量。这个消息被保存在“栈帧”中,这个栈帧分配在所述函数调用栈的内存区上;同时还保存被调用函数开始执行时的寄存器信息。通过对当前栈帧的分析,找到其上层函数(调用本函数的函数)在栈中的帧起始地址,再分析上层函数的栈帧,再找出再上层的帧地址,这样一直找到最顶层调用函数为止,这样就可以根据当前帧指针的值回溯出整个函数的调用栈(调用过程),完成对函数调用关系的回溯。
本实施例的一种实施方式中,步骤A前还包括步骤:
通过处理器的mmu(存储管理单元)设置好各内存区间的读写访问属性,使得应用程序对不同的内存区域有不同的访问权限;
这样,当应用程序触发了处理器的某个异常,如:违反了内存分区权限设置的读/写操作会引发处理器异常,越过了内存分区的读/写操作会引发处理器异常,操作未定义的内存区域会引发处理器异常,执行未对齐的内存操作会引发处理器异常,内存发生错误导致非法指令执行会引发处理器异常等;这些异常严重情况下会导致系统宕机。
加入该步骤后,不同的CPU模式对不同内存页面具有不同的访问权限,因此可以对内存区块进行更好的保护。
实施例二,一种嵌入式系统的错误追踪装置,如图2所示,包括:
异常处理单元,用于在系统发生异常时,获取并保存处理器运行环境;
栈帧回溯单元,用于根据系统发生异常时的帧指针找到当前运行的函数的栈帧;然后反复进行下列步骤,直到回溯出系统发生异常时运行的整个函数调用关系链:
从找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,和函数参数信息,及该函数代码的起始地址,以及进一步地获得函数的名称,并且得到调用该函数的函数的栈帧底;通过所述栈帧底找到该调用该函数的函数的栈帧;
输出单元,用于将所述异常处理单元保存的处理器运行环境,和所述栈帧回溯单元回溯出的函数调用关系链。
本实施例中,所述异常处理单元具体包括:
现场保存模块,用于在系统发生异常时,获取并保存导致发生异常的处理器运行环境,包括程序计数器、栈指针、帧指针和通用寄存器的内容;
错误参数获取模块,用于当发生数据访问中止异常时,获取并保存失效访问存储器的状态和类型,和引起存储访问失效的存储访问的地址;发生其它异常时则获取并保存指令出错的地址。
本实施例中,所述栈帧回溯单元具体包括:
栈帧查找模块、栈帧信息读取模块、判断模块和调用信息读取模块;
所述栈帧查找模块用于根据系统发生异常时的帧指针所指的内存位置查找当前运行函数的栈帧;找到后指示栈帧信息读取模块读取所找到的栈帧;
所述函数信息读取模块用于接收到所述栈帧查找模块的指示后,从所找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,取出该函数执行函数体代码之前保存的函数参数信息,及该函数代码的起始地址,并从该函数的代码区中取得该函数的名称;读取完成后指示判断模块进行判断;
所述判断模块用于判断是否存在调用该函数的函数,如果存在,则指示所述调用信息读取模块读取调用信息;否则指示所述输出模块输出所述函数信息读取模块读取的全部信息;
所述调用信息读取模块用于接收到所述判断模块的指示后,从所找到的栈帧中得到该栈帧所属函数的返回地址,和该调用该函数的函数的栈帧底,并将找到的栈帧底发送给所述栈帧查找模块;
所述栈帧查找模块还用于根据所述栈帧底查找相应的栈帧,找到后指示栈帧信息读取模块读取所找到的栈帧。
本实施例中,所述判断模块判断是否存在调用该函数的函数是指:
如果所找到的栈帧中,用于保存该调用该函数的函数的栈帧底的位置保存的值为0,则表示不存在调用该函数的函数,否则表示存在。
本实施例中,所述调用信息读取模块从该函数的栈帧底的回溯结构信息中找到所述该函数的返回地址和该调用该函数的函数的栈帧底。
实施例三,一个具体的错误追踪实例。
如图3所示,系统上电后,初始化硬件设备环境和软件资源,并通过mmu设置好各个内存区域的访问属性,如只读、可读写等。此后,应用程序就运行起来,若有操作系统支持,应用程序就以线程方式调度函数运行;若无,应用程序就以函数调用方式执行。
本例中,预先设置内存0x0所在的内存区域为只读属性,这样应用程序中的下列内容就将因为没有写权限而导致一个数据访问中止异常:
unsigned int x=0;//全局变量
int func1(unsigned int*c)
{
 int d=0;
*(unsigned int*)c=0x100;
d=*(unsigned int*)c;
return d;
 }
 int func2(unsigned int*a)
 {
        int d=0;
        d=func1(a);
        return d;
 }
 int func3(unsigned int a)
 {
        unsigned int*b=NULL;//指针b指向0x0地址
        a=func2(b);
        return a;
}
int func4(unsigned int a)
{
       unsigned int*b=(unsigned int*)&x;
       a=func2(b);
       return a;
}
void func_entry(void)
{
       ....
       unsigned int a=10,b=20;
       func4(a)
       func3(b);
       ....
}
此时在func1里出现了数据访问异常错误,因为内存0x0所在的内存区域为只读属性,这样就导致一个数据访问中止异常,而程序中存在2个函数调用关系,如下:
(1)func_entry调用func4,func4调用func2,func2调用func1;
(2)func_entry调用func3,func3调用func2,func2调用func1。
而本例中,对于程序出错的代码是因为数据访问中止异常,引起错误的函数调用关系是第(1)个,此时对于应用程序开发人员来说,想定位错误和回溯函数调用关系链也是第(1)个,因为这才是引起函数错误的“根源”,是由于函数func3中把参数b置NULL,导致了在函数func1中对0x0地址进行非法写操作,因此,引起函数func1错误的原因是在函数func3中造成的。
处理器执行main函数,此时调用函数func3,函数func3调用函数func2,函数func2调用函数func1,而在func1里有一个数据访问异常产生,这样导致系统进入到如图2所示的内核错误跟踪流程,已经定义了一个数据结构:
struct pt_regs{
         long uregs[N];
 };
struct pt_regs saved_reg;
其中,saved_reg.uregs[N]保存处理器的每个寄存器的值,不同的处理器保存的寄存器个数N和类别不相同,对于要进行函数回溯追踪,几个比较重要的寄存器是:帧指针寄存器、栈指针寄存器、指令指针寄存器、链接返回寄存器、程序计数器。把异常发生时刻处理器状态保存到上述的数据结构体中,这样后续就可以根据处理器状态信息进行错误追踪和函数调用关系链回溯;进一步地,从cpu处理器信息中得到指令出错的地址,或失效访问存储器的状态和类型,和引起存储访问失效的存储访问的地址;进一步地,如果在编译软件系统的时候,加上了mpoke-function-name编译选项,则可以在二进制程序包含函数名称的信息,方便回溯函数调用关系链时记录信息的可读性,可以得到函数的名字。
如上所示,要回溯的函数调用关系是:
func_entry调用func3,func3调用func2,func2调用func1。
根据上述func1函数出错时保存的处理器信息,开始对函数栈帧进行分析和进行函数调用关系回溯。
本例中,当应用程序开始时,函数调用栈中只有一个栈帧,就是func_entry函数的栈帧,它被称作初始帧,或者最外层帧。每当一个函数被调用时,如func_entry调用func3,或func3调用func2,系统栈会为被调用的函数开辟一个新的栈帧,并把它压入栈中。当函数返回时,系统栈会弹出该函数所对应的栈帧。每当一个函数返回时,保存返回值,弹出当前栈帧,恢复上一个栈帧,按照函数返回地址跳回母函数中继续执行,并且返回函数所对应的栈帧就被释放。如果一个函数是递归的,就会存在多个栈帧,现在正在运行的函数所对应的栈帧叫作最内层帧,是现在还存在的所有栈帧里面最后一个创建的。
如上所示:
本例的函数调用是func_entry调用func3,func3调用func2,func2调用func1,在func1里发生了数据访问中止异常,func1没有返回,此时func1至func_entry函数的栈帧都在函数调用栈中存在,并没有释放,所以此时可以分析内存中栈帧的内容。
此时函数func_entry运行时的栈布局见图4所示。
通过分析上图的内存布局,结合函数调用过程中的栈帧结构,这样就可以在函数调用链的末端开始一次函数调用关系回溯;进行函数调用关系回溯的过程包括:
(S1)获取处理器的寄存器信息;进行变量定义等初始化工作;
(S2)根据当前的帧指针找到当前运行函数的栈帧,也就是函数func1的栈帧;
(S3)从找到的栈帧中进而获取到该栈帧所属函数开始执行时保存的寄存器信息,及该函数代码的起始地址;从该函数的代码区中取得该函数的名称;从找到的栈帧里取出该栈帧所属函数执行函数体代码之前保存的函数参数信息;
(S4)判断是否存在调用该函数的函数,如果存在,则从栈帧的回溯结构信息中得到该函数的返回地址,和该调用该函数的函数的栈帧的栈帧底,找到该调用该函数的函数的栈帧,返回步骤(S3);
否则说明回溯已完成,已得到在运行的函数调用关系链,完成回溯过程,本函数就是整个函数调用的源头。
在上例中,第一次进行(S4)时,找到的“该调用该函数的函数的栈帧”为函数func2的栈帧;第二次找到的为函数func3的栈帧;第三次找到的为函数func_entry的栈帧;第四次会判断不存在调用该函数(即func_entry)的函数,因此回溯结束;由此,可以得到函数调用链上func1、func2、func3和func_entry的名称、代码起始地址和参数信息等。
至此,就可以得到发生异常错误导致系统宕机时,出错的指令地址和引发该错误的函数的起始地址、函数名字、和函数参数信息,并回溯出出错时运行的函数调用关系链,并得到函数调用关系链中的每个函数的函数名字、函数起始地址、函数参数信息等。这对于这样就找到引起系统崩溃的错误代码真正引起系统宕机的“根源”。是因为func3里指针赋值错误造成的,这样应用程序开发人员就可以依据回溯得到的信息去追踪该错误发生的根源,并进行修改,而对于另外一个函数调用链(2),开发人员不必要去追踪,因为回溯信息已经定位和确定了错误的根源;因此可以节省追踪时间,提高追踪效率。
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,如在异常发生时,在异常处理函数中,可以加入应用程序注册的异常通知函数,在系统宕机之前,通过执行这些函数,应用程序可以保存一些数据,和当前运行环境信息,以免系统宕机后,这些数据被破坏和不可挽回。但这些相应的改变和变形都应属于本发明的权利要求的保护范围。

Claims (10)

1、一种嵌入式系统的错误追踪方法,包括:
在系统发生异常时,保存处理器运行环境,根据帧指针找到当前运行的函数的栈帧;
反复进行下列步骤,直到回溯出系统发生异常时运行的整个函数调用关系链:
从找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,和函数参数信息,及该函数代码的起始地址,以及进一步地获得函数的名称,并且得到调用该函数的函数的栈帧底;通过所述栈帧底找到该调用该函数的函数的栈帧。
2、如权利要求1所述的方法,其特征在于,具体包括以下步骤:
A、在系统发生异常时,处理器根据不同的异常类型,跳转到相应的异常处理流程,保存导致发生异常的处理器运行环境,包括程序计数器、栈指针、帧指针和通用寄存器的内容;
B、当发生数据访问中止异常时,获取失效访问存储器的状态和类型,和引起存储访问失效的存储访问的地址;
发生其它异常时则获取指令出错的地址;
C、从发生异常时帧指针所指的内存位置找到当前运行函数的栈帧;
D、从所找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,取出该函数执行函数体代码之前保存的函数参数信息,及该函数代码的起始地址;从该函数的代码区中取得该函数的名称;
E、判断是否存在调用该函数的函数,如果存在,则从所找到的栈帧中得到该函数的返回地址,和该调用该函数的函数的栈帧的栈帧底,找到该调用该函数的函数的栈帧,返回步骤D;否则结束。
3、如权利要求2所述的方法,其特征在于,所述步骤E中,判断是否存在调用该函数的函数是指:
如果所找到的栈帧中,用于保存该调用该函数的函数的栈帧底的位置保存的值为0,则表示不存在调用该函数的函数,否则表示存在。
4、如权利要求2所述的方法,其特征在于,步骤E中:
从该函数的栈帧底的回溯结构信息中找到所述该函数的返回地址和该调用该函数的函数的栈帧底。
5、如权利要求1到3中任一项所述的方法,其特征在于,步骤A前还包括步骤:
通过处理器的存储管理单元设置好各内存区间的读写访问属性,使得应用程序对不同的内存区域有不同的访问权限。
6、一种嵌入式系统的错误追踪装置,其特征在于,包括:
异常处理单元,用于在系统发生异常时,获取并保存处理器运行环境;
栈帧回溯单元,用于根据系统发生异常时的帧指针找到当前运行的函数的栈帧;然后反复进行下列步骤,直到回溯出系统发生异常时运行的整个函数调用关系链:从找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,和函数参数信息,及该函数代码的起始地址,以及进一步地获得函数的名称,并且得到调用该函数的函数的栈帧底;通过所述栈帧底找到该调用该函数的函数的栈帧;
输出单元,用于将所述异常处理单元保存的处理器运行环境,和所述栈帧回溯单元回溯出的函数调用关系链。
7、如权利要求6所述的装置,其特征在于,所述异常处理单元具体包括:
现场保存模块,用于在系统发生异常时,获取并保存导致发生异常的处理器运行环境,包括程序计数器、栈指针、帧指针和通用寄存器的内容;
错误参数获取模块,用于当发生数据访问中止异常时,获取并保存失效访问存储器的状态和类型,和引起存储访问失效的存储访问的地址;发生其它异常时则获取并保存指令出错的地址。
8、如权利要求6或7所述的装置,其特征在于,所述栈帧回溯单元具体包括:
栈帧查找模块、栈帧信息读取模块、判断模块和调用信息读取模块;
所述栈帧查找模块用于根据系统发生异常时的帧指针所指的内存位置查找当前运行函数的栈帧;找到后指示栈帧信息读取模块读取所找到的栈帧;
所述函数信息读取模块用于接收到所述栈帧查找模块的指示后,从所找到的栈帧中获取该栈帧所属函数开始执行时保存的寄存器信息,取出该函数执行函数体代码之前保存的函数参数信息,及该函数代码的起始地址,并从该函数的代码区中取得该函数的名称;读取完成指示判断模块进行判断;
所述判断模块用于判断是否存在调用该函数的函数,如果存在,则指示所述调用信息读取模块读取调用信息;否则指示所述输出模块输出所述函数信息读取模块读取的全部信息;
所述调用信息读取模块用于接收到所述判断模块的指示后,从所找到的栈帧中得到该栈帧所属函数的返回地址,和该调用该函数的函数的栈帧底,并将找到的栈帧底发送给所述栈帧查找模块;
所述栈帧查找模块还用于根据所述栈帧底查找相应的栈帧,找到后指示栈帧信息读取模块读取所找到的栈帧。
9、如权利要求8所述的装置,其特征在于,所述判断模块判断是否存在调用该函数的函数是指:
如果所找到的栈帧中,用于保存该调用该函数的函数的栈帧底的位置保存的值为0,则表示不存在调用该函数的函数,否则表示存在。
10、如权利要求8所述的方法,其特征在于:
所述调用信息读取模块从该函数的栈帧底的回溯结构信息中找到所述该函数的返回地址和该调用该函数的函数的栈帧底。
CN2009100831945A 2009-05-05 2009-05-05 嵌入式系统的错误追踪方法和装置 Active CN101539883B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2009100831945A CN101539883B (zh) 2009-05-05 2009-05-05 嵌入式系统的错误追踪方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2009100831945A CN101539883B (zh) 2009-05-05 2009-05-05 嵌入式系统的错误追踪方法和装置

Publications (2)

Publication Number Publication Date
CN101539883A true CN101539883A (zh) 2009-09-23
CN101539883B CN101539883B (zh) 2011-11-16

Family

ID=41123082

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2009100831945A Active CN101539883B (zh) 2009-05-05 2009-05-05 嵌入式系统的错误追踪方法和装置

Country Status (1)

Country Link
CN (1) CN101539883B (zh)

Cited By (41)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102479116A (zh) * 2010-11-24 2012-05-30 中兴通讯股份有限公司 一种查看系统异常时代码信息的方法及装置
CN102789412A (zh) * 2011-05-16 2012-11-21 康佳集团股份有限公司 定位代码bug的方法及其实现系统
CN102799523A (zh) * 2012-07-03 2012-11-28 华为技术有限公司 动态探测程序执行路径的方法、装置和计算机系统
CN102880538A (zh) * 2012-09-27 2013-01-16 邦讯技术股份有限公司 一种Linux软件在ARM芯片上的死机信息侦测方法及系统
CN104360939A (zh) * 2014-10-29 2015-02-18 中国建设银行股份有限公司 定位故障的方法、设备及系统
CN105426755A (zh) * 2015-11-24 2016-03-23 无锡江南计算技术研究所 一种基于哈希算法的库函数安全增强方法
CN105678168A (zh) * 2015-12-29 2016-06-15 北京神州绿盟信息安全科技股份有限公司 一种基于栈异常的shellcode检测方法及装置
CN105824749A (zh) * 2016-03-09 2016-08-03 上海博达数据通信有限公司 一种linux系统下用户态进程异常的分析方法
WO2016131313A1 (zh) * 2015-07-17 2016-08-25 中兴通讯股份有限公司 一种嵌入式操作系统代码加载的方法及装置
CN102789412B (zh) * 2011-05-16 2016-12-14 康佳集团股份有限公司 定位代码bug的方法及其实现系统
CN106250260A (zh) * 2016-08-03 2016-12-21 北京小米移动软件有限公司 处理器溢出监控和调试方法及装置
CN106354575A (zh) * 2016-08-12 2017-01-25 中国航空工业集团公司西安飞行自动控制研究所 一种基于堆栈追溯的故障排查装置和方法
CN107172113A (zh) * 2016-03-08 2017-09-15 阿里巴巴集团控股有限公司 服务调用异常时的处理方法和装置
CN107301102A (zh) * 2017-06-22 2017-10-27 湖南国科微电子股份有限公司 一种处理器调试方法及系统
CN107451045A (zh) * 2016-05-31 2017-12-08 北京信威通信技术股份有限公司 一种异常信息定位的方法及装置
CN107967192A (zh) * 2017-12-20 2018-04-27 北京奇虎科技有限公司 一种智能终端的系统崩溃处理方法和装置
CN108415840A (zh) * 2018-03-14 2018-08-17 百度在线网络技术(北京)有限公司 修复函数缺陷的方法、装置及服务器
CN109753414A (zh) * 2017-11-01 2019-05-14 阿里巴巴集团控股有限公司 性能数据的采集方法、展示方法、电子设备和客户端
CN109933480A (zh) * 2019-03-15 2019-06-25 捷德(中国)信息科技有限公司 一种cos嵌入式开发盲调方法、系统、设备及存储介质
CN110007984A (zh) * 2019-04-02 2019-07-12 苏州思必驰信息科技有限公司 基于Xtensa DSP的函数调用关系回溯方法及系统
CN110046097A (zh) * 2019-04-01 2019-07-23 深圳震有科技股份有限公司 一种定位内存非法改写的方法、系统及存储介质
CN110275791A (zh) * 2018-03-14 2019-09-24 普天信息技术有限公司 一种应用程序异常处理方法及装置
CN110489179A (zh) * 2019-08-02 2019-11-22 北京字节跳动网络技术有限公司 获取调用栈栈帧函数签名的方法、装置、介质和设备
CN110737488A (zh) * 2019-09-24 2020-01-31 普联技术有限公司 基于MIPS平台打印嵌入式Linux应用程序backtrace的方法、装置及设备
CN111124900A (zh) * 2019-12-11 2020-05-08 深圳震有科技股份有限公司 程序运行异常时的数据获取方法、装置、终端及存储介质
CN111209164A (zh) * 2020-01-03 2020-05-29 杭州迪普科技股份有限公司 异常信息存储方法及装置、电子设备、存储介质
CN111523115A (zh) * 2019-02-02 2020-08-11 阿里巴巴集团控股有限公司 信息确定方法、函数调用方法及电子设备
CN111682991A (zh) * 2020-05-28 2020-09-18 杭州迪普科技股份有限公司 总线错误消息的处理方法及装置
CN111813641A (zh) * 2020-06-19 2020-10-23 北京字节跳动网络技术有限公司 崩溃信息收集的方法、装置、介质和设备
CN111884884A (zh) * 2020-07-31 2020-11-03 北京明朝万达科技股份有限公司 监控文件传输的方法、系统及装置
CN112099982A (zh) * 2020-09-08 2020-12-18 北京字节跳动网络技术有限公司 一种崩溃信息定位方法、装置、介质和电子设备
CN112380529A (zh) * 2020-10-26 2021-02-19 浙江大学 一种基于操作的嵌入式裸机系统安全隔离系统
CN112486712A (zh) * 2019-09-11 2021-03-12 北京简约纳电子有限公司 一种嵌入式系统中诊断设备无响应的方法
CN112732481A (zh) * 2020-12-31 2021-04-30 南方电网科学研究院有限责任公司 一种处理器的异常修复方法及装置
CN112860473A (zh) * 2021-04-27 2021-05-28 武汉深之度科技有限公司 程序运行错误时定位源代码的方法、装置及计算设备
CN112882695A (zh) * 2021-03-02 2021-06-01 百果园技术(新加坡)有限公司 传参方法、装置、计算机设备及存储介质
CN112925717A (zh) * 2021-03-22 2021-06-08 北京字节跳动网络技术有限公司 用于确定调用栈栈帧的对象的方法、装置、设备和介质
CN113704088A (zh) * 2021-07-21 2021-11-26 郑州云海信息技术有限公司 一种进程追溯方法、进程追溯系统及相关装置
WO2022199284A1 (zh) * 2021-03-22 2022-09-29 北京字节跳动网络技术有限公司 调用栈回溯方法、装置、设备和介质
WO2023016485A1 (zh) * 2021-08-12 2023-02-16 华为技术有限公司 用于获取函数调用信息的方法、装置、电子设备和介质
CN115794661A (zh) * 2023-01-19 2023-03-14 苏州浪潮智能科技有限公司 处理器的异常访问定位方法、装置、电子设备及存储介质

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1275155C (zh) * 2002-08-24 2006-09-13 中兴通讯股份有限公司 嵌入式操作系统中异常故障定位方法
US20070220234A1 (en) * 2006-03-16 2007-09-20 Chang Jung L Autonomous multi-microcontroller system and the control method thereof
CN100535870C (zh) * 2006-12-29 2009-09-02 中兴通讯股份有限公司 嵌入式系统中进程异常跟踪定位的方法

Cited By (57)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102479116A (zh) * 2010-11-24 2012-05-30 中兴通讯股份有限公司 一种查看系统异常时代码信息的方法及装置
CN102789412A (zh) * 2011-05-16 2012-11-21 康佳集团股份有限公司 定位代码bug的方法及其实现系统
CN102789412B (zh) * 2011-05-16 2016-12-14 康佳集团股份有限公司 定位代码bug的方法及其实现系统
CN102799523B (zh) * 2012-07-03 2015-06-17 华为技术有限公司 动态探测程序执行路径的方法、装置和计算机系统
CN102799523A (zh) * 2012-07-03 2012-11-28 华为技术有限公司 动态探测程序执行路径的方法、装置和计算机系统
CN102880538B (zh) * 2012-09-27 2015-12-16 邦讯技术股份有限公司 一种Linux软件在ARM芯片上的死机信息侦测方法及系统
CN102880538A (zh) * 2012-09-27 2013-01-16 邦讯技术股份有限公司 一种Linux软件在ARM芯片上的死机信息侦测方法及系统
CN104360939A (zh) * 2014-10-29 2015-02-18 中国建设银行股份有限公司 定位故障的方法、设备及系统
WO2016131313A1 (zh) * 2015-07-17 2016-08-25 中兴通讯股份有限公司 一种嵌入式操作系统代码加载的方法及装置
CN105426755A (zh) * 2015-11-24 2016-03-23 无锡江南计算技术研究所 一种基于哈希算法的库函数安全增强方法
CN105678168A (zh) * 2015-12-29 2016-06-15 北京神州绿盟信息安全科技股份有限公司 一种基于栈异常的shellcode检测方法及装置
CN107172113A (zh) * 2016-03-08 2017-09-15 阿里巴巴集团控股有限公司 服务调用异常时的处理方法和装置
CN105824749A (zh) * 2016-03-09 2016-08-03 上海博达数据通信有限公司 一种linux系统下用户态进程异常的分析方法
CN105824749B (zh) * 2016-03-09 2019-06-25 上海博达数据通信有限公司 一种linux系统下用户态进程异常的分析方法
CN107451045A (zh) * 2016-05-31 2017-12-08 北京信威通信技术股份有限公司 一种异常信息定位的方法及装置
CN106250260A (zh) * 2016-08-03 2016-12-21 北京小米移动软件有限公司 处理器溢出监控和调试方法及装置
CN106250260B (zh) * 2016-08-03 2019-07-23 北京小米移动软件有限公司 处理器溢出监控和调试方法及装置
CN106354575A (zh) * 2016-08-12 2017-01-25 中国航空工业集团公司西安飞行自动控制研究所 一种基于堆栈追溯的故障排查装置和方法
CN107301102A (zh) * 2017-06-22 2017-10-27 湖南国科微电子股份有限公司 一种处理器调试方法及系统
CN107301102B (zh) * 2017-06-22 2020-05-26 湖南国科微电子股份有限公司 一种处理器调试方法及系统
CN109753414A (zh) * 2017-11-01 2019-05-14 阿里巴巴集团控股有限公司 性能数据的采集方法、展示方法、电子设备和客户端
CN107967192B (zh) * 2017-12-20 2022-03-11 北京奇虎科技有限公司 一种智能终端的系统崩溃处理方法和装置
CN107967192A (zh) * 2017-12-20 2018-04-27 北京奇虎科技有限公司 一种智能终端的系统崩溃处理方法和装置
CN110275791A (zh) * 2018-03-14 2019-09-24 普天信息技术有限公司 一种应用程序异常处理方法及装置
CN108415840A (zh) * 2018-03-14 2018-08-17 百度在线网络技术(北京)有限公司 修复函数缺陷的方法、装置及服务器
CN111523115B (zh) * 2019-02-02 2023-05-26 斑马智行网络(香港)有限公司 信息确定方法、函数调用方法及电子设备
CN111523115A (zh) * 2019-02-02 2020-08-11 阿里巴巴集团控股有限公司 信息确定方法、函数调用方法及电子设备
CN109933480A (zh) * 2019-03-15 2019-06-25 捷德(中国)信息科技有限公司 一种cos嵌入式开发盲调方法、系统、设备及存储介质
CN109933480B (zh) * 2019-03-15 2023-04-21 捷德(中国)科技有限公司 一种cos嵌入式开发盲调方法、系统、设备及存储介质
CN110046097A (zh) * 2019-04-01 2019-07-23 深圳震有科技股份有限公司 一种定位内存非法改写的方法、系统及存储介质
CN110007984A (zh) * 2019-04-02 2019-07-12 苏州思必驰信息科技有限公司 基于Xtensa DSP的函数调用关系回溯方法及系统
CN110007984B (zh) * 2019-04-02 2022-07-15 思必驰科技股份有限公司 基于Xtensa DSP的函数调用关系回溯方法及系统
CN110489179A (zh) * 2019-08-02 2019-11-22 北京字节跳动网络技术有限公司 获取调用栈栈帧函数签名的方法、装置、介质和设备
CN112486712A (zh) * 2019-09-11 2021-03-12 北京简约纳电子有限公司 一种嵌入式系统中诊断设备无响应的方法
CN110737488A (zh) * 2019-09-24 2020-01-31 普联技术有限公司 基于MIPS平台打印嵌入式Linux应用程序backtrace的方法、装置及设备
CN111124900A (zh) * 2019-12-11 2020-05-08 深圳震有科技股份有限公司 程序运行异常时的数据获取方法、装置、终端及存储介质
CN111209164A (zh) * 2020-01-03 2020-05-29 杭州迪普科技股份有限公司 异常信息存储方法及装置、电子设备、存储介质
CN111209164B (zh) * 2020-01-03 2023-09-26 杭州迪普科技股份有限公司 异常信息存储方法及装置、电子设备、存储介质
CN111682991A (zh) * 2020-05-28 2020-09-18 杭州迪普科技股份有限公司 总线错误消息的处理方法及装置
CN111813641A (zh) * 2020-06-19 2020-10-23 北京字节跳动网络技术有限公司 崩溃信息收集的方法、装置、介质和设备
CN111813641B (zh) * 2020-06-19 2024-05-17 北京字节跳动网络技术有限公司 崩溃信息收集的方法、装置、介质和设备
CN111884884A (zh) * 2020-07-31 2020-11-03 北京明朝万达科技股份有限公司 监控文件传输的方法、系统及装置
CN111884884B (zh) * 2020-07-31 2022-05-31 北京明朝万达科技股份有限公司 监控文件传输的方法、系统及装置
CN112099982A (zh) * 2020-09-08 2020-12-18 北京字节跳动网络技术有限公司 一种崩溃信息定位方法、装置、介质和电子设备
CN112380529A (zh) * 2020-10-26 2021-02-19 浙江大学 一种基于操作的嵌入式裸机系统安全隔离系统
CN112732481B (zh) * 2020-12-31 2023-10-10 南方电网科学研究院有限责任公司 一种处理器的异常修复方法及装置
CN112732481A (zh) * 2020-12-31 2021-04-30 南方电网科学研究院有限责任公司 一种处理器的异常修复方法及装置
CN112882695B (zh) * 2021-03-02 2023-11-28 百果园技术(新加坡)有限公司 传参方法、装置、计算机设备及存储介质
CN112882695A (zh) * 2021-03-02 2021-06-01 百果园技术(新加坡)有限公司 传参方法、装置、计算机设备及存储介质
CN112925717A (zh) * 2021-03-22 2021-06-08 北京字节跳动网络技术有限公司 用于确定调用栈栈帧的对象的方法、装置、设备和介质
WO2022199284A1 (zh) * 2021-03-22 2022-09-29 北京字节跳动网络技术有限公司 调用栈回溯方法、装置、设备和介质
CN112925717B (zh) * 2021-03-22 2024-03-12 北京字节跳动网络技术有限公司 用于确定调用栈栈帧的对象的方法、装置、设备和介质
CN112860473A (zh) * 2021-04-27 2021-05-28 武汉深之度科技有限公司 程序运行错误时定位源代码的方法、装置及计算设备
CN113704088B (zh) * 2021-07-21 2023-09-12 郑州云海信息技术有限公司 一种进程追溯方法、进程追溯系统及相关装置
CN113704088A (zh) * 2021-07-21 2021-11-26 郑州云海信息技术有限公司 一种进程追溯方法、进程追溯系统及相关装置
WO2023016485A1 (zh) * 2021-08-12 2023-02-16 华为技术有限公司 用于获取函数调用信息的方法、装置、电子设备和介质
CN115794661A (zh) * 2023-01-19 2023-03-14 苏州浪潮智能科技有限公司 处理器的异常访问定位方法、装置、电子设备及存储介质

Also Published As

Publication number Publication date
CN101539883B (zh) 2011-11-16

Similar Documents

Publication Publication Date Title
CN101539883B (zh) 嵌入式系统的错误追踪方法和装置
US10474471B2 (en) Methods and systems for performing a replay execution
CN1834950B (zh) 具有活动和非活动执行核心的多核处理器
US9244883B2 (en) Reconfigurable processor and method of reconfiguring the same
CN102103488B (zh) 利用缓冲器进行高效加载处理的方法和设备
CN101719090A (zh) 对计算机软件系统崩溃原因进行自动分析的方法
CN101446918B (zh) 一种实现用户态调试器调试单个函数的方法及系统
US9286179B1 (en) Service testing framework
CN101976212A (zh) 一种基于少量代码重加载的dsp抗单粒子纠错方法
CN103064770B (zh) 双进程冗余瞬时故障容错方法
CN100349131C (zh) 一种应用程序故障的定位方法
WO2016026328A1 (zh) 一种信息处理方法、装置及计算机存储介质
US20080163331A1 (en) Reconfiguring a secure system
CN108351826A (zh) 监视处理器的操作
CN102681937A (zh) 一种缓存一致性协议正确性验证方法
CN101458725A (zh) 微控制器芯片及其调试方法
CN104156234A (zh) 启动多核处理器、bootloader大小端模式自适应的方法及装置
CN113360157A (zh) 一种程序编译方法、设备以及计算机可读介质
CN104781790A (zh) 用信号通知软件可恢复错误
US10956241B1 (en) Unified container for hardware and software binaries
US20070239972A1 (en) Processing internal timestamp counter instructions in reference to external counter
CN101650688B (zh) 一种访问vm_io地址空间的方法和用户态调试器
JP6123931B1 (ja) 情報処理装置、情報処理方法、およびプログラム
CN100458719C (zh) 基本输入输出系统信息的获取及编辑方法及系统
US20220229932A1 (en) Method for performing multi-system log access management, associated system on chip integrated circuit and non-transitory computer-readable medium

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
EE01 Entry into force of recordation of patent licensing contract

Assignee: Hollysys Automation Technologies, Ltd.

Assignor: Beijing HollySys System Engineering Co., Ltd.

Contract record no.: 2012610000044

Denomination of invention: Error tracking method of embedded system and device thereof

Granted publication date: 20111116

License type: Exclusive License

Open date: 20090923

Record date: 20120412