《基于VXWORKS操作系统的函数调用栈分析方法及装置.pdf》由会员分享,可在线阅读,更多相关《基于VXWORKS操作系统的函数调用栈分析方法及装置.pdf(19页完整版)》请在专利查询网上搜索。
1、(10)申请公布号 CN 103559123 A (43)申请公布日 2014.02.05 CN 103559123 A (21)申请号 201310506592.X (22)申请日 2013.10.24 G06F 11/36(2006.01) G06F 11/34(2006.01) (71)申请人 烽火通信科技股份有限公司 地址 430074 湖北省武汉市东湖开发区关东 科技园东信路 5 号 (72)发明人 曾颜 (74)专利代理机构 北京捷诚信通专利事务所 ( 普通合伙 ) 11221 代理人 魏殿绅 庞炳良 (54) 发明名称 基于 VxWorks 操作系统的函数调用栈分析方 法及装置 。
2、(57) 摘要 本发明公开了一种基于 VxWorks 操作系统的 函数调用栈分析方法及装置, 涉及函数调用栈分 析领域, 该方法包括以下步骤 : 主机向目标机请 求任务 t1 的 TCB 信息, 目标机返回任务 t1 的 TCB 信息 ; 主机从返回的 TCB 信息中获取到 SP 值、 PC 值、 RA 值, 主机依据 SP 值以及栈底信息向目标机 请求栈空间的信息, 目标机返回相应的栈信息 ; 主机根据目标机的 TCB 信息、 栈空间的信息以及 反汇编文件, 进行函数调用栈分析。 本发明能解析 出局部函数的函数名, 方便的查找到 PC 值所属函 数的第一条指令, 在没有特征指令的场景下, 也。
3、能 进行函数调用栈的分析, 同时还能不受目标机资 源的限制, 提供完整的函数调用栈, 有利于定位故 障和异常。 (51)Int.Cl. 权利要求书 4 页 说明书 10 页 附图 4 页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书4页 说明书10页 附图4页 (10)申请公布号 CN 103559123 A CN 103559123 A 1/4 页 2 1. 一种基于 VxWorks 操作系统的函数调用栈分析方法, 其特征在于, 包括以下步骤 : S1、 在主机上输入目标机当前运行的VxWorks映像的可执行链接格式ELF文件, 同时在 主机上生成映像文件的符号表文。
4、件 ; S2、 假定需要进行函数调用栈分析的任务为 t1, 主机向目标机下发请求命令 : 暂停任 务 t1, 目标机执行该命令 ; S3、 主机向目标机请求任务t1的任务控制块TCB信息, 目标机返回任务t1的TCB信息, 包括通用寄存器信息、 栈底以及栈大小 ; S4、 主机从返回的 TCB 信息中获取到栈指针 SP 值、 程序计数器 PC 值、 返回地址 RA 值, 无内部互锁流水级的微处理器 MIPS 栈空间采用的是向下增长的方式, 栈底在高地址, 运行 时 SP 值就是当前函数的栈指针, 它指向的是栈顶的位置, 每个栈帧中所存放的内容和存放 顺序由目标体系架构的调用约定来定义 ; 当前。
5、SP值是程序运行到当前状态的SP值, 函数入 口点的 SP 值则是进入该函数还未执行函数第一条指令时的 SP 值 ; S5、 主机依据SP值以及栈底信息向目标机请求栈空间的信息, 所请求的栈信息为SP值 所指向的栈顶至栈底之间的内存空间信息, 目标机返回相应的栈信息 ; S6、 主机根据目标机的 TCB 信息, 栈空间的信息以及反汇编文件, 进行函数调用栈分 析 ; S7、 主机向目标机下发请求命令 : 恢复需要进行函数调用栈分析的任务 t1, 目标机执 行该命令。 2. 如权利要求 1 所述的基于 VxWorks 操作系统的函数调用栈分析方法, 其特征在于 : 步骤S6中的函数调用栈分析是一。
6、个递归的过程, 进行顶层函数调用栈分析时, PC值和SP值 分别为目标机返回的 TCB 信息中的 PC 值和 SP 值, 后续递归过程中每一层的分析则依赖于 上一层所生成的新的 PC 值和 SP 值, 直至 SP 值到达栈底。 3. 如权利要求 2 所述的基于 VxWorks 操作系统的函数调用栈分析方法, 其特征在于 : 步骤 S6 中的函数调用栈分析过程如下 : 步骤 601、 判断 SP 值是否到达栈底, 如果是, 则转到步骤 602 ; 如果否, 则转到步骤 603 ; 步骤 602、 串接每一层 PC 值所属的函数 func 形成函数调用链, 结束 ; 步骤 603、 根据 PC 值。
7、查找所属的函数地址以及函数名称, 具体查找过程为 : 在符号表文 件中查找地址不超过并且最接近 PC 值函数地址以及函数名称, 将该函数记为 func ; 转到步 骤 604 ; 步骤 604、 利用现有工具获取函数 func 的汇编指令, 转到步骤 605 ; 步骤 605、 获取函数 func 入口点的 SP 值以及函数 func 的返回地址, 并计算新的 PC 值 和 SP 值, 其中新的 PC 值为函数 func 的返回地址 RA 值经过计算后的值, 函数 func 的返回 地址即函数 func 的调用者地址, 新的 SP 值为函数 func 入口点的 SP 值 ; 返回步骤 601。。
8、 4. 如权利要求 3 所述的基于 VxWorks 操作系统的函数调用栈分析方法, 其特征在于 : 步骤 605 具体包括以下步骤 : 步骤 6051、 从函数的第一条指令开始, 逐条扫描每条指令 ; 步骤 6052、 判断所扫描的当前指令是否满足下面四种情形之一 : (a) SP 入栈调整指令 ; (b) RA 在栈上的保存指令 ; 权 利 要 求 书 CN 103559123 A 2 2/4 页 3 (c) RA 在栈上的恢复指令或者寄存器跳转指令 ; (d) SP 出栈调整指令 ; 如果满足, 则转到步骤 6053 ; 如果都不满足, 即为其它指令, 转到步骤 6055 ; 步骤 605。
9、3、 依据上述四种情形以及当前所扫描的当前指令的地址与 PC 值的大小关系, 分别计算函数入口点的 SP 值或者获取函数 RA 值 : (a) SP 入栈调整指令 : 计算函数栈帧的大小, 比较所扫描的当前指令的地址与 PC 值, 如果所扫描的当前指令 的地址小于 PC 值, 则 : 函数入口点的 SP 值 = 当前 SP 值 + 函数栈帧的大小 ; 否则, 函数入口 点的 SP 值 = 当前 SP 值 ; (b) RA 在栈上的保存指令 : 比较所扫描的当前指令的地址与 PC 值, 如果所扫描的当前指令的地址小于 PC 值, 则 : 函数 RA 值 = 栈上的 RA 值, 即将当前 SP 值。
10、加上指令中相对 SP 值的偏移地址作为 RA 的保存 地址, 从而获取 RA 值 ; 否则, 函数 RA 值 = 当前 TCB 信息中的 RA 值 ; (c) RA 在栈上的恢复指令或者寄存器跳转指令 : 比较所扫描的当前指令的地址与 PC 值, 如果所扫描的当前指令的地址小于 PC 值, 则 : 函数 RA 值 = 当前 TCB 信息中的 RA 值 ; 否则, 函数 RA 值 = 栈上的 RA 值, 即将当前 SP 值加上 指令中相对 SP 值的偏移地址作为 RA 的保存地址, 从而获取 RA 值 ; (d) SP 出栈调整指令 : 计算函数栈帧的大小, 同时比较所扫描的当前指令的地址与 P。
11、C 值, 如果所扫描的当前 指令的地址小于 PC 值, 则 : 函数入口点的 SP 值 = 当前 SP 值 ; 否则, 函数入口点的 SP 值 = 当 前 SP 值 + 函数栈帧的大小 ; 步骤 6054、 判断是否已经获取到函数入口点的 SP 值以及函数 RA 值, 若满足, 则转到步 骤 6056, 否则, 转至步骤 6055 ; 步骤 6055、 继续对下一条指令进行扫描直至函数 func 的指令扫描结束。 步骤 6056、 将函数的返回地址即 RA 值经过计算后作为新的 PC 值, 在 MIPS 系统中, 将 RA 值减去 8 后作为新的 PC 值, 将函数 func 入口的 SP 值。
12、作为新的 SP 值。 5. 如权利要求 4 所述的基于 VxWorks 操作系统的函数调用栈分析方法, 其特征在于 : 步骤 6052 中部分特征指令的含义如下 : 形如 addiu$sp,$sp,x 的指令为 SP 值调整指令, x 的值进行符号扩展后就是函数栈帧 的大小, x 为负值时, 该指令表示 SP 入栈调整指令, x 为正值时, 该指令表示 SP 出栈调整指 令 ; 形如 sw$ra,x($sp) 的指令为 RA 在栈上的保存指令, 用于将 RA 寄存器的内容保存到栈 上 ; 形如 lw$ra,x($sp) 的指令为 RA 在栈上的恢复指令, 用于将栈上保存的内容恢复到 RA 寄存。
13、器中 ; 形如 jr$ra 的指令为寄存器跳转指令, 函数返回通过该指令完成。 6. 一种基于 VxWorks 操作系统的函数调用栈分析装置, 包括主机和目标机, 主机向目 标机发出操作指令, 分析数据并且显示结果数据 ; 目标机执行主机的操作指令和返回实际 的运行状态, 其特征在于 : 权 利 要 求 书 CN 103559123 A 3 3/4 页 4 在主机上输入目标机当前运行的 VxWorks 映像的可执行链接格式 ELF 文件, 同时在主 机上生成映像文件的符号表文件 ; 假定需要进行函数调用栈分析的任务为 t1, 主机向目标机下发请求命令 : 暂停任务 t1, 目标机执行该命令 ;。
14、 主机向目标机请求任务 t1 的任务控制块 TCB 信息, 目标机返回任务 t1 的 TCB 信息, 包 括通用寄存器信息、 栈底以及栈大小 ; 主机从返回的 TCB 信息中获取到栈指针 SP 值、 程序计数器 PC 值、 返回地址 RA 值, 无内 部互锁流水级的微处理器 MIPS 栈空间采用的是向下增长的方式, 栈底在高地址, 运行时 SP 值就是当前函数的栈指针, 它指向的是栈顶的位置, 每个栈帧中所存放的内容和存放顺序 由目标体系架构的调用约定来定义 ; 当前SP值是程序运行到当前状态的SP值, 函数入口点 的 SP 值则是进入该函数还未执行函数第一条指令时的 SP 值 ; 主机依据 。
15、SP 值以及栈底信息向目标机请求栈空间的信息, 所请求的栈信息为 SP 值所 指向的栈顶至栈底之间的内存空间信息, 目标机返回相应的栈信息 ; 主机根据目标机的 TCB 信息, 栈空间的信息以及反汇编文件, 进行函数调用栈分析 ; 主机向目标机下发请求命令 : 恢复需要进行函数调用栈分析的任务 t1, 目标机执行该 命令。 7. 如权利要求 6 所述的基于 VxWorks 操作系统的函数调用栈分析装置, 其特征在于 : 所述函数调用栈分析是一个递归的过程, 进行顶层函数调用栈分析时, PC 值和 SP 值分别为 目标机返回的 TCB 信息中的 PC 值和 SP 值, 后续递归过程中每一层的分析。
16、则依赖于上一层 所生成的新的 PC 值和 SP 值, 直至 SP 值到达栈底。 8. 如权利要求 7 所述的基于 VxWorks 操作系统的函数调用栈分析装置, 其特征在于 : 所述函数调用栈分析过程如下 : 步骤 601、 判断 SP 值是否到达栈底, 如果是, 则转到步骤 602 ; 如果否, 则转到步骤 603 ; 步骤 602、 串接每一层 PC 值所属的函数 func 形成函数调用链, 结束 ; 步骤 603、 根据 PC 值查找所属的函数地址以及函数名称, 具体查找过程为 : 在符号表文 件中查找地址不超过并且最接近 PC 值函数地址以及函数名称, 将该函数记为 func ; 转到。
17、步 骤 604 ; 步骤 604、 利用现有工具获取函数 func 的汇编指令, 转到步骤 605 ; 步骤 605、 获取函数 func 入口点的 SP 值以及函数 func 的返回地址, 并计算新的 PC 值 和 SP 值, 其中新的 PC 值为函数 func 的返回地址 RA 值经过计算后的值, 函数 func 的返回 地址即函数 func 的调用者地址, 新的 SP 值为函数 func 入口点的 SP 值 ; 返回步骤 601。 9. 如权利要求 8 所述的基于 VxWorks 操作系统的函数调用栈分析装置, 其特征在于 : 步骤 605 具体包括以下步骤 : 步骤 6051、 从函数。
18、的第一条指令开始, 逐条扫描每条指令 ; 步骤 6052、 判断所扫描的当前指令是否满足下面四种情形之一 : (a) SP 入栈调整指令 ; (b) RA 在栈上的保存指令 ; (c) RA 在栈上的恢复指令或者寄存器跳转指令 ; (d) SP 出栈调整指令 ; 权 利 要 求 书 CN 103559123 A 4 4/4 页 5 如果满足, 则转到步骤 6053 ; 如果都不满足, 即为其它指令, 转到步骤 6055 ; 步骤 6053、 依据上述四种情形以及当前所扫描的当前指令的地址与 PC 值的大小关系, 分别计算函数入口点的 SP 值或者获取函数 RA 值 : (a) SP 入栈调整指。
19、令 : 计算函数栈帧的大小, 比较所扫描的当前指令的地址与 PC 值, 如果所扫描的当前指令 的地址小于 PC 值, 则 : 函数入口点的 SP 值 = 当前 SP 值 + 函数栈帧的大小 ; 否则, 函数入口 点的 SP 值 = 当前 SP 值 ; (b) RA 在栈上的保存指令 : 比较所扫描的当前指令的地址与 PC 值, 如果所扫描的当前指令的地址小于 PC 值, 则 : 函数 RA 值 = 栈上的 RA 值, 即将当前 SP 值加上指令中相对 SP 值的偏移地址作为 RA 的保存 地址, 从而获取 RA 值 ; 否则, 函数 RA 值 = 当前 TCB 信息中的 RA 值 ; (c) 。
20、RA 在栈上的恢复指令或者寄存器跳转指令 : 比较所扫描的当前指令的地址与 PC 值, 如果所扫描的当前指令的地址小于 PC 值, 则 : 函数 RA 值 = 当前 TCB 信息中的 RA 值 ; 否则, 函数 RA 值 = 栈上的 RA 值, 即将当前 SP 值加上 指令中相对 SP 值的偏移地址作为 RA 的保存地址, 从而获取 RA 值 ; (d) SP 出栈调整指令 : 计算函数栈帧的大小, 同时比较所扫描的当前指令的地址与 PC 值, 如果所扫描的当前 指令的地址小于 PC 值, 则 : 函数入口点的 SP 值 = 当前 SP 值 ; 否则, 函数入口点的 SP 值 = 当 前 SP。
21、 值 + 函数栈帧的大小 ; 步骤 6054、 判断是否已经获取到函数入口点的 SP 值以及函数 RA 值, 若满足, 则转到步 骤 6056, 否则, 转至步骤 6055 ; 步骤 6055、 继续对下一条指令进行扫描直至函数 func 的指令扫描结束。 步骤 6056、 将函数的返回地址即 RA 值经过计算后作为新的 PC 值, 在 MIPS 系统中, 将 RA 值减去 8 后作为新的 PC 值, 将函数 func 入口的 SP 值作为新的 SP 值。 10. 如权利要求 9 所述的基于 VxWorks 操作系统的函数调用栈分析装置, 其特征在于 : 步骤 6052 中部分特征指令的含义如。
22、下 : 形如 addiu$sp,$sp,x 的指令为 SP 值调整指令, x 的值进行符号扩展后就是函数栈帧 的大小, x 为负值时, 该指令表示 SP 入栈调整指令, x 为正值时, 该指令表示 SP 出栈调整指 令 ; 形如 sw$ra,x($sp) 的指令为 RA 在栈上的保存指令, 用于将 RA 寄存器的内容保存到栈 上 ; 形如 lw$ra,x($sp) 的指令为 RA 在栈上的恢复指令, 用于将栈上保存的内容恢复到 RA 寄存器中 ; 形如 jr$ra 的指令为寄存器跳转指令, 函数返回通过该指令完成。 权 利 要 求 书 CN 103559123 A 5 1/10 页 6 基于 。
23、VxWorks 操作系统的函数调用栈分析方法及装置 技术领域 0001 本发明涉及函数调用栈分析领域, 特别是涉及一种基于 VxWorks 操作系统的函数 调用栈分析方法及装置。 背景技术 0002 在计算机科学中, 栈被定义为一个特殊的容器, 其遵守的规则是先入栈的数据后 出栈。用户可以将数据压入栈中, 即入栈, 也可以将已经压入栈中的数据弹出, 即出栈。栈 在程序运行中具有举足轻重的地位, 最重要的, 栈保存了一个函数调用所需要的维护信息, 这常常被称为栈帧, 一个函数的栈帧占用一个连续的区域, 每个栈帧对应于一个未完成运 行的函数。在函数开始时, 对应的栈帧已经完整地建立了 ; 在函数退。
24、出时, 该函数栈帧将被 销毁。由于函数调用通常是嵌套的, 因此在同一时刻, 栈中会有多个函数的栈帧信息, 调用 栈就是由多个嵌套调用函数所使用的栈帧组成。 0003 调用栈体现了函数调用关系, 也即一个函数调用链。例如, 函数 f1调用函数 f2, 函 数 f2调用函数 f3, 则 f1 f2 f3就是一个调用栈。其中对于函数 f1调用函数 f2而言, f1 为调用者, f2为被调用者。 在实际的软件运行中, 一个函数到另一个函数之间的调用关系可 能存在多种调用情况, 这个调用栈不可能在预先确定, 因此当程序出现异常、 检测到错误或 者被断点中断时, 需要查看当前函数的调用栈, 以便确定异常发。
25、生的场景。 这也是软件调试 的一个常用方法。 0004 下面以 32 位的 MIPS(Microprocessor without interlocked piped stages, 无 内部互锁流水级的微处理器) 系统为例, 说明现有技术函数调用栈分析的基本原理, 其它系 统的函数调用栈分析方法也类似。MIPS 具有 32 个通用寄存器, 其中 SP(Stack Pointer, 栈指针) 寄存器、 RA(Return Address, 返回地址) 寄存器以及 PC(Program Counter, 程序 计数器) 寄存器扮演着重要的角色。为了叙述方便, SP 寄存器、 RA 寄存器、 PC。
26、 寄存器中的内 容在本发明中分别称为 SP 值、 RA 值、 PC 值。由于 MIPS 通常只在函数进入和退出的时刻才 调整 SP 值, 因此 MIPS 下函数调用栈分析的基本原理是 : 分析目标机上的代码指令, 获取当 前任务的 SP 值、 PC 值和 RA 值, 从 PC 值开始的指令地址向前扫描指令, 直到搜索到函数入 口的特征指令, 确定函数的栈帧大小, 由此计算出调用者的栈指针。同时搜索 RA 值以及 RA 在栈上的存取指令, 分析被调用者的返回地址, 从而获取调用者的地址。 以此类推获取当前 任务完整的函数调用链。对于每个函数地址, 查找内核中的符号表, 从而得到函数的名称。 00。
27、05 一般调试器都能提供查看函数调用栈的工具。例如在 VxWorks 系统下, 可以通过 一个命令 : display a stack trace of a task(显示一个任务的栈轨迹) , 下文简称 tt 命 令, 来查看任务的函数调用栈, 该命令可以直接运行在目标机上, 其它系统也有类似的调试 命令。 0006 但是, 这些调试命令可能存在以下问题 : 0007 (1) VxWorks 的符号表是动态存在系统中的, 通常 VxWorks 映像文件加载的是全局 符号, 局部符号不加载。调用栈分析时, 解析出的函数名是全局函数名, 不能解析出局部函 说 明 书 CN 103559123 A。
28、 6 2/10 页 7 数名, 其局部函数名是通过全局函数名加上地址偏移来标识的, 因此, 在 VxWorks 目标机上 利用 tt 命令运行函数调用栈分析的程序时, 无法准确的提供局部函数的函数名。 0008 (2) 现有技术中, 在目标机上通过PC值搜索到PC所属函数的第一条指令的方法比 较繁琐, 同时还是不可靠的, 因为其假设前提是该函数前面还有函数。 0009 (3) 调用栈分析依赖于特征指令, 例如 : MIPS 系统下内嵌的汇编子程序可能没有 显式的入栈指令, 则无法进行调用栈的分析或者分析的内容不正确。 0010 (4) 调用栈分析的命令大都运行在目标机上, 在嵌入式系统中, 由。
29、于目标机的资源 有限, 对所能跟踪的单个函数的大小以及所能跟踪的函数调用深度均有限制, 因此当函数 大小超过了系统预设的所跟踪的指令长度时, 或者当函数调用的深度超过了系统预设的深 度时, 则获取的函数调用栈信息不完整。 发明内容 0011 本发明的目的是为了克服上述背景技术的不足, 提供一种基于 VxWorks 操作系统 的函数调用栈分析方法及装置, 能够解析出局部函数的函数名, 方便的查找到 PC 值所属函 数的第一条指令, 在没有特征指令例如显式的入栈指令的场景下, 也能进行函数调用栈的 分析, 同时还能不受目标机资源的限制, 提供完整的函数调用栈, 有利于定位故障和异常。 0012 本。
30、发明提供一种基于 VxWorks 操作系统的函数调用栈分析方法, 包括以下步骤 : 0013 S1、 在主机上输入目标机当前运行的VxWorks映像的可执行链接格式ELF文件, 同 时在主机上生成映像文件的符号表文件 ; 0014 S2、 假定需要进行函数调用栈分析的任务为 t1, 主机向目标机下发请求命令 : 暂 停任务 t1, 目标机执行该命令 ; 0015 S3、 主机向目标机请求任务 t1 的任务控制块 TCB 信息, 目标机返回任务 t1 的 TCB 信息, 包括通用寄存器信息、 栈底以及栈大小 ; 0016 S4、 主机从返回的 TCB 信息中获取到栈指针 SP 值、 程序计数器 。
31、PC 值、 返回地址 RA 值, 无内部互锁流水级的微处理器 MIPS 栈空间采用的是向下增长的方式, 栈底在高地址, 运行时 SP 值就是当前函数的栈指针, 它指向的是栈顶的位置, 每个栈帧中所存放的内容和 存放顺序由目标体系架构的调用约定来定义 ; 当前SP值是程序运行到当前状态的SP值, 函 数入口点的 SP 值则是进入该函数还未执行函数第一条指令时的 SP 值 ; 0017 S5、 主机依据 SP 值以及栈底信息向目标机请求栈空间的信息, 所请求的栈信息为 SP 值所指向的栈顶至栈底之间的内存空间信息, 目标机返回相应的栈信息 ; 0018 S6、 主机根据目标机的 TCB 信息, 栈。
32、空间的信息以及反汇编文件, 进行函数调用栈 分析 ; 0019 S7、 主机向目标机下发请求命令 : 恢复需要进行函数调用栈分析的任务 t1, 目标 机执行该命令。 0020 在上述技术方案的基础上, 步骤 S6 中的函数调用栈分析是一个递归的过程, 进行 顶层函数调用栈分析时, PC 值和 SP 值分别为目标机返回的 TCB 信息中的 PC 值和 SP 值, 后 续递归过程中每一层的分析则依赖于上一层所生成的新的 PC 值和 SP 值, 直至 SP 值到达栈 底。 0021 在上述技术方案的基础上, 步骤 S6 中的函数调用栈分析过程如下 : 说 明 书 CN 103559123 A 7 3。
33、/10 页 8 0022 步骤 601、 判断 SP 值是否到达栈底, 如果是, 则转到步骤 602 ; 如果否, 则转到步骤 603 ; 0023 步骤 602、 串接每一层 PC 值所属的函数 func 形成函数调用链, 结束 ; 0024 步骤 603、 根据 PC 值查找所属的函数地址以及函数名称, 具体查找过程为 : 在符号 表文件中查找地址不超过并且最接近 PC 值函数地址以及函数名称, 将该函数记为 func ; 转 到步骤 604 ; 0025 步骤 604、 利用现有工具获取函数 func 的汇编指令, 转到步骤 605 ; 0026 步骤605、 获取函数func入口点的S。
34、P值以及函数func的返回地址, 并计算新的PC 值和 SP 值, 其中新的 PC 值为函数 func 的返回地址 RA 值经过计算后的值, 函数 func 的返 回地址即函数 func 的调用者地址, 新的 SP 值为函数 func 入口点的 SP 值 ; 返回步骤 601。 0027 在上述技术方案的基础上, 步骤 605 具体包括以下步骤 : 0028 步骤 6051、 从函数的第一条指令开始, 逐条扫描每条指令 ; 0029 步骤 6052、 判断所扫描的当前指令是否满足下面四种情形之一 : 0030 (a) SP 入栈调整指令 ; 0031 (b) RA 在栈上的保存指令 ; 003。
35、2 (c) RA 在栈上的恢复指令或者寄存器跳转指令 ; 0033 (d) SP 出栈调整指令 ; 0034 如果满足, 则转到步骤 6053 ; 如果都不满足, 即为其它指令, 转到步骤 6055 ; 0035 步骤 6053、 依据上述四种情形以及当前所扫描的当前指令的地址与 PC 值的大小 关系, 分别计算函数入口点的 SP 值或者获取函数 RA 值 : 0036 (a) SP 入栈调整指令 : 0037 计算函数栈帧的大小, 比较所扫描的当前指令的地址与 PC 值, 如果所扫描的当前 指令的地址小于 PC 值, 则 : 函数入口点的 SP 值 = 当前 SP 值 + 函数栈帧的大小 ;。
36、 否则, 函数 入口点的 SP 值 = 当前 SP 值 ; 0038 (b) RA 在栈上的保存指令 : 0039 比较所扫描的当前指令的地址与PC值, 如果所扫描的当前指令的地址小于PC值, 则 : 函数 RA 值 = 栈上的 RA 值, 即将当前 SP 值加上指令中相对 SP 值的偏移地址作为 RA 的 保存地址, 从而获取 RA 值 ; 否则, 函数 RA 值 = 当前 TCB 信息中的 RA 值 ; 0040 (c) RA 在栈上的恢复指令或者寄存器跳转指令 : 0041 比较所扫描的当前指令的地址与PC值, 如果所扫描的当前指令的地址小于PC值, 则 : 函数 RA 值 = 当前 T。
37、CB 信息中的 RA 值 ; 否则, 函数 RA 值 = 栈上的 RA 值, 即将当前 SP 值 加上指令中相对 SP 值的偏移地址作为 RA 的保存地址, 从而获取 RA 值 ; 0042 (d) SP 出栈调整指令 : 0043 计算函数栈帧的大小, 同时比较所扫描的当前指令的地址与 PC 值, 如果所扫描的 当前指令的地址小于PC值, 则 : 函数入口点的SP值=当前SP值 ; 否则, 函数入口点的SP值 = 当前 SP 值 + 函数栈帧的大小 ; 0044 步骤 6054、 判断是否已经获取到函数入口点的 SP 值以及函数 RA 值, 若满足, 则转 到步骤 6056, 否则, 转至步。
38、骤 6055 ; 0045 步骤 6055、 继续对下一条指令进行扫描直至函数 func 的指令扫描结束。 说 明 书 CN 103559123 A 8 4/10 页 9 0046 步骤6056、 将函数的返回地址即RA值经过计算后作为新的PC值, 在MIPS系统中, 将 RA 值减去 8 后作为新的 PC 值, 将函数 func 入口的 SP 值作为新的 SP 值。 0047 在上述技术方案的基础上, 步骤 6052 中部分特征指令的含义如下 : 0048 形如 addiu$sp,$sp,x 的指令为 SP 值调整指令, x 的值进行符号扩展后就是函数 栈帧的大小, x 为负值时, 该指令表。
39、示 SP 入栈调整指令, x 为正值时, 该指令表示 SP 出栈调 整指令 ; 0049 形如 sw$ra,x($sp) 的指令为 RA 在栈上的保存指令, 用于将 RA 寄存器的内容保存 到栈上 ; 0050 形如 lw$ra,x($sp) 的指令为 RA 在栈上的恢复指令, 用于将栈上保存的内容恢复 到 RA 寄存器中 ; 0051 形如 jr$ra 的指令为寄存器跳转指令, 函数返回通过该指令完成。 0052 本发明还提供一种基于 VxWorks 操作系统的函数调用栈分析装置, 包括主机和目 标机, 主机向目标机发出操作指令, 分析数据并且显示结果数据 ; 目标机执行主机的操作指 令和返。
40、回实际的运行状态 ; 0053 在主机上输入目标机当前运行的 VxWorks 映像的可执行链接格式 ELF 文件, 同时 在主机上生成映像文件的符号表文件 ; 0054 假定需要进行函数调用栈分析的任务为 t1, 主机向目标机下发请求命令 : 暂停任 务 t1, 目标机执行该命令 ; 0055 主机向目标机请求任务 t1 的任务控制块 TCB 信息, 目标机返回任务 t1 的 TCB 信 息, 包括通用寄存器信息、 栈底以及栈大小 ; 0056 主机从返回的 TCB 信息中获取到栈指针 SP 值、 程序计数器 PC 值、 返回地址 RA 值, 无内部互锁流水级的微处理器 MIPS 栈空间采用的。
41、是向下增长的方式, 栈底在高地址, 运行 时 SP 值就是当前函数的栈指针, 它指向的是栈顶的位置, 每个栈帧中所存放的内容和存放 顺序由目标体系架构的调用约定来定义 ; 当前SP值是程序运行到当前状态的SP值, 函数入 口点的 SP 值则是进入该函数还未执行函数第一条指令时的 SP 值 ; 0057 主机依据 SP 值以及栈底信息向目标机请求栈空间的信息, 所请求的栈信息为 SP 值所指向的栈顶至栈底之间的内存空间信息, 目标机返回相应的栈信息 ; 0058 主机根据目标机的 TCB 信息, 栈空间的信息以及反汇编文件, 进行函数调用栈分 析 ; 0059 主机向目标机下发请求命令 : 恢复。
42、需要进行函数调用栈分析的任务 t1, 目标机执 行该命令。 0060 在上述技术方案的基础上, 所述函数调用栈分析是一个递归的过程, 进行顶层函 数调用栈分析时, PC 值和 SP 值分别为目标机返回的 TCB 信息中的 PC 值和 SP 值, 后续递归 过程中每一层的分析则依赖于上一层所生成的新的 PC 值和 SP 值, 直至 SP 值到达栈底。 0061 在上述技术方案的基础上, 所述函数调用栈分析过程如下 : 0062 步骤 601、 判断 SP 值是否到达栈底, 如果是, 则转到步骤 602 ; 如果否, 则转到步骤 603 ; 0063 步骤 602、 串接每一层 PC 值所属的函数。
43、 func 形成函数调用链, 结束 ; 0064 步骤 603、 根据 PC 值查找所属的函数地址以及函数名称, 具体查找过程为 : 在符号 说 明 书 CN 103559123 A 9 5/10 页 10 表文件中查找地址不超过并且最接近 PC 值函数地址以及函数名称, 将该函数记为 func ; 转 到步骤 604 ; 0065 步骤 604、 利用现有工具获取函数 func 的汇编指令, 转到步骤 605 ; 0066 步骤605、 获取函数func入口点的SP值以及函数func的返回地址, 并计算新的PC 值和 SP 值, 其中新的 PC 值为函数 func 的返回地址 RA 值经过计。
44、算后的值, 函数 func 的返 回地址即函数 func 的调用者地址, 新的 SP 值为函数 func 入口点的 SP 值 ; 返回步骤 601。 0067 在上述技术方案的基础上, 步骤 605 具体包括以下步骤 : 0068 步骤 6051、 从函数的第一条指令开始, 逐条扫描每条指令 ; 0069 步骤 6052、 判断所扫描的当前指令是否满足下面四种情形之一 : 0070 (a) SP 入栈调整指令 ; 0071 (b) RA 在栈上的保存指令 ; 0072 (c) RA 在栈上的恢复指令或者寄存器跳转指令 ; 0073 (d) SP 出栈调整指令 ; 0074 如果满足, 则转到步。
45、骤 6053 ; 如果都不满足, 即为其它指令, 转到步骤 6055 ; 0075 步骤 6053、 依据上述四种情形以及当前所扫描的当前指令的地址与 PC 值的大小 关系, 分别计算函数入口点的 SP 值或者获取函数 RA 值 : 0076 (a) SP 入栈调整指令 : 0077 计算函数栈帧的大小, 比较所扫描的当前指令的地址与 PC 值, 如果所扫描的当前 指令的地址小于 PC 值, 则 : 函数入口点的 SP 值 = 当前 SP 值 + 函数栈帧的大小 ; 否则, 函数 入口点的 SP 值 = 当前 SP 值 ; 0078 (b) RA 在栈上的保存指令 : 0079 比较所扫描的当。
46、前指令的地址与PC值, 如果所扫描的当前指令的地址小于PC值, 则 : 函数 RA 值 = 栈上的 RA 值, 即将当前 SP 值加上指令中相对 SP 值的偏移地址作为 RA 的 保存地址, 从而获取 RA 值 ; 否则, 函数 RA 值 = 当前 TCB 信息中的 RA 值 ; 0080 (c) RA 在栈上的恢复指令或者寄存器跳转指令 : 0081 比较所扫描的当前指令的地址与PC值, 如果所扫描的当前指令的地址小于PC值, 则 : 函数 RA 值 = 当前 TCB 信息中的 RA 值 ; 否则, 函数 RA 值 = 栈上的 RA 值, 即将当前 SP 值 加上指令中相对 SP 值的偏移地。
47、址作为 RA 的保存地址, 从而获取 RA 值 ; 0082 (d) SP 出栈调整指令 : 0083 计算函数栈帧的大小, 同时比较所扫描的当前指令的地址与 PC 值, 如果所扫描的 当前指令的地址小于PC值, 则 : 函数入口点的SP值=当前SP值 ; 否则, 函数入口点的SP值 = 当前 SP 值 + 函数栈帧的大小 ; 0084 步骤 6054、 判断是否已经获取到函数入口点的 SP 值以及函数 RA 值, 若满足, 则转 到步骤 6056, 否则, 转至步骤 6055 ; 0085 步骤 6055、 继续对下一条指令进行扫描直至函数 func 的指令扫描结束。 0086 步骤6056。
48、、 将函数的返回地址即RA值经过计算后作为新的PC值, 在MIPS系统中, 将 RA 值减去 8 后作为新的 PC 值, 将函数 func 入口的 SP 值作为新的 SP 值。 0087 在上述技术方案的基础上, 步骤 6052 中部分特征指令的含义如下 : 0088 形如 addiu$sp,$sp,x 的指令为 SP 值调整指令, x 的值进行符号扩展后就是函数 说 明 书 CN 103559123 A 10 6/10 页 11 栈帧的大小, x 为负值时, 该指令表示 SP 入栈调整指令, x 为正值时, 该指令表示 SP 出栈调 整指令 ; 0089 形如 sw$ra,x($sp) 的指。
49、令为 RA 在栈上的保存指令, 用于将 RA 寄存器的内容保存 到栈上 ; 0090 形如 lw$ra,x($sp) 的指令为 RA 在栈上的恢复指令, 用于将栈上保存的内容恢复 到 RA 寄存器中 ; 0091 形如 jr$ra 的指令为寄存器跳转指令, 函数返回通过该指令完成。 0092 与现有技术相比, 本发明的优点如下 : 0093 (1) 本发明利用编译的映像文件解析出局部函数的函数名, 准确查找全局符号和 局部符号, 即全局函数名和局部函数名。 0094 (2) 本发明对应给定的PC值, 在符号表文件中查找地址不超过并且最接近PC值的 函数地址, 获取到 PC 寄存器所属函数的第一条指令地址。由于主机可以借助工具查看 ELF (Executable and Linkable Format, 可执行链接格式) 文件的符号表, 因此能够更加准确的 获取函数地址。 0095 (3) 本发明在进行函数。