一种跟踪嵌入式系统函数调用轨迹的方法技术方案

技术编号:14361338 阅读:56 留言:0更新日期:2017-01-09 04:33
本发明专利技术涉及一种开发人员追踪和定位系统异常的方法,尤其涉及一种跟踪嵌入式系统函数调用轨迹的方法。包括以下步骤:1)编译器分析程序代码,并向每个非内联的函数插入调用跟踪函数的代码;2)当函数被执行时调用跟踪函数,跟踪函数用于获取和保存当前函数的返回地址;3)直接输出各函数返回地址,或者通过调试工具将各函数返回地址解析转化为函数名字并输出。本发明专利技术的跟踪嵌入式系统函数调用轨迹的方法,回溯的实现方法较为简单且操控性较高、方便开发人员诊断。

【技术实现步骤摘要】

本专利技术涉及一种开发人员追踪和定位系统异常的方法,尤其涉及一种跟踪嵌入式系统函数调用轨迹的方法
技术介绍
当嵌入式系统出现某些不可恢复或者致命的错误时,系统会崩溃,常称异常或者Trap,而此时的输出也称为Trap输出,通常包括异常类型、处理器当前运行环境(CPU各寄存器)、当前任务的栈内容、函数调用轨迹等,如Linux操作系统发生Oops时的输出。Trap输出是开发人员用于追踪和定位异常发生原因的必不可少的信息,尤其是函数调用轨迹用得最多,它能形象的反映出系统发生Trap时的函数执行顺序,甚至精确到触发Trap的函数名字,同时它相对其他输出也更易理解。获取函数调用轨迹的方法,通常是通过扫描格式化的当前任务的栈帧,并从中提取出包含函数返回地址,以及上一个栈帧的地址等信息,然后逐层回溯直到结束。此方法比较通用,适用于大多数体系结构,但是其缺点也是明显的,主要在于当栈受到破坏时,是无法从中提取出函数调用轨迹的。比如软件实现是严重依赖处理器体系结构的,包括其各寄存器用途,指令集(ISA,InstructionSetArchitecture)用法,函数调用的压栈、出栈方式,栈帧格式等,因此回溯的实现方法难度便大大增加了,也不容易维护、升级。
技术实现思路
为解决上述技术问题,本专利技术的目的是提供一种回溯的实现方法较为简单且操控性较高、方便开发人员诊断的跟踪嵌入式系统函数调用轨迹的方法。本专利技术的一种跟踪嵌入式系统函数调用轨迹的方法,包括以下步骤:1)编译器分析程序代码,并向每个非内联的函数插入调用跟踪函数的代码;2)当函数被执行时调用跟踪函数,跟踪函数用于获取和保存当前函数的返回地址;3)直接输出各函数返回地址,或者通过调试工具将各函数返回地址解析转化为函数名字并输出。进一步的,步骤1)中调用跟踪函数的代码被插入在函数的函数体中语句部分之前。进一步的,编译器内设置有编译选项,所述编译选项用于选择是否开启向每个非内联的函数插入调用跟踪函数的代码这一功能。进一步的,步骤2)中跟踪函数将当前函数的返回地址保存为数组、链表或队列。具体的,跟踪函数将当前函数的返回地址保存为数组。具体的,跟踪函数保存当前函数的返回地址时,按顺序逐条由数组的头部至尾部循环记录在数组中。具体的,连续相同的函数被执行时,跟踪函数仅保存一次该函数的返回地址。借由上述方案,本专利技术至少具有以下优点:当发生异常时,可以提供开发人员详细明了的函数调用轨迹,回溯的实现方法较为简单且操控性较高,方便开发人员诊断。上述说明仅是本专利技术技术方案的概述,为了能够更清楚了解本专利技术的技术手段,并可依照说明书的内容予以实施,以下以本专利技术的较佳实施例并配合附图详细说明如后。附图说明图1是本专利技术跟踪嵌入式系统函数调用轨迹的方法的流程图;图2是本专利技术实施例中增加编译选项前的输出结果图;图3是本专利技术实施例中增加编译选项后的输出结果图;图4是本专利技术中解析函数返回地址并转化为函数名的输出结果图。具体实施方式下面结合附图和实施例,对本专利技术的具体实施方式作进一步详细描述。以下实施例用于说明本专利技术,但不用来限制本专利技术的范围。实施例一参见图1,本专利技术一较佳实施例所述的一种跟踪嵌入式系统函数调用轨迹的方法,包括以下步骤:1)编译器分析程序代码,并向每个非内联的函数插入调用跟踪函数的代码;由于插入了代码,使用该功能后,函数的代码和占用的空间都变大了,同时多了一个函数调用的开销,甚至函数的运行时间也变长了,为了方便软件开发人员的使用,编译器内设置有编译选项,编译选项用于选择是否开启向每个非内联的函数插入调用跟踪函数的代码这一功能,换言之,这一功能可以选择性的打开和关闭,比如可以在Debug版本打开,在Release版本关闭;在调试Trap时打开,在调试完后关闭。本步骤需要对编译器进行开发以提供支持,以提供一个编译选项,比如当开启时,向编译器增加选项-DEBUG:stack_check=4,此时编译器会向每个非内联的函数中插入一条指令,该指令会调用并跳转到一个跟踪函数,如__stackcheck。应当说明的是,选项-DEBUG:stack_check=4只是编译选项的一种,本专利技术仅以选项-DEBUG:stack_check=4为例进行说明,凡是能够实现步骤1)中选择是否开启向每个非内联的函数插入调用跟踪函数的代码这一功能的编译选项,均应落入本专利技术的保护范围。例如下面的Test_Func函数,在打开该选项后,其函数体多了调用__stackcheck的指令(如图2和图3所示),当然也多了为了调用函数__stackcheck而压栈、出栈等动作。应当说明的是,__stackcheck只是跟踪函数的一种,本专利技术仅以__stackcheck为例进行说明,凡是能够实现步骤2)中跟踪函数功能的函数,均应落入本专利技术的保护范围。2)当函数被执行时调用跟踪函数,跟踪函数用于获取和保存当前函数的返回地址(ReturnAddress,RA);步骤1)中调用跟踪函数的代码被插入在函数的函数体中语句部分之前。2.1在跟踪函数中获取函数返回地址相对于现有技术中常见获取函数调用轨迹的方法,其过分依赖CPU体系结构,本方法只有在跟踪函数__stackcheck中去获取函数返回地址时,才依赖CPU体系结构。例如在本专利技术的验证体系结构中,使用以下的内联汇编来获得RA寄存器值。RA寄存器中存放的是跟踪函数__stackcheck退出后,返回到的地址,通常是调用跟踪函数__stackcheck指令的下一条指令地址,例如在图3中,是0x60011194地址,当__stackcheck运行结束,将RA值赋值给程序计数器PC,则函数__stackcheck返回。2.2在跟踪函数中保存函数返回地址获得函数返回地址后,需要将其保存到一块预先开辟的空间,如数组、链表、或者队列,本专利技术中,仅以数组为例详细说明,链表和队列的方式,本专利技术不再赘述。全局变量:其中,func_trace_disable:表示是否停止跟踪函数调用轨迹,默认为0;系统运行过程中可随时将其置1,停止跟踪,此时不会去获得和存储函数返回地址;重新置0表示继续跟踪。header_idx:表示数组中最新记录应该存储到的位置下标。FUNCTRACE_ITEMS_MAX:表示函数返回地址记录的最大条数。func_trace_entry:表示函数返回地址记录的数组,能存储的最大条数为FUNCTRACE_ITEMS_MAX。函数返回地址会按顺序逐条记录到数组中,越晚的记录代表越新的函数调用。由于数组的存储空间有限,而函数返回地址则是随着系统的运行,不断产生的;所以当记录条数大于FUNCTRACE_ITEMS_MAX时,会从数组头开始继续记录,换言之,先前记录在数组头的函数返回地址会被覆盖。同时,为了节约有限的存储空间,连续相同的函数调用记录,只被存储一次。保存的过程如下:3)直接输出各函数返回地址,或者通过调试工具将各函数返回地址解析转化为函数名字并输出。换言之,对于跟踪函数调用轨迹的应用,可以存在以下方式:a)系统出现异常时,直接将各函数返回地址打印出来用于辅助调试;b)系统出现异常时,通过调试工具将各函数返回地址解析转化为函数名字,得到函数调本文档来自技高网...
一种跟踪嵌入式系统函数调用轨迹的方法

【技术保护点】
一种跟踪嵌入式系统函数调用轨迹的方法,其特征在于:包括以下步骤:1)编译器分析程序代码,并向每个非内联的函数插入调用跟踪函数的代码;2)当函数被执行时调用跟踪函数,跟踪函数用于获取和保存当前函数的返回地址;3)直接输出各函数返回地址,或者通过调试工具将各函数返回地址解析转化为函数名字并输出。

【技术特征摘要】
1.一种跟踪嵌入式系统函数调用轨迹的方法,其特征在于:包括以下步骤:1)编译器分析程序代码,并向每个非内联的函数插入调用跟踪函数的代码;2)当函数被执行时调用跟踪函数,跟踪函数用于获取和保存当前函数的返回地址;3)直接输出各函数返回地址,或者通过调试工具将各函数返回地址解析转化为函数名字并输出。2.根据权利要求1所述的跟踪嵌入式系统函数调用轨迹的方法,其特征在于:步骤1)中调用跟踪函数的代码被插入在函数的函数体中语句部分之前。3.根据权利要求1所述的跟踪嵌入式系统函数调用轨迹的方法,其特征在于:编译器内设置有编译选项,所述编译选项用于选择是否开启向每个非内...

【专利技术属性】
技术研发人员:潘玉峰
申请(专利权)人:苏州简约纳电子有限公司
类型:发明
国别省市:江苏;32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1