书签 分享 收藏 举报 版权申诉 / 19

基于VXWORKS操作系统的函数调用栈分析方法及装置.pdf

  • 上传人:00062****4422
  • 文档编号:6188445
  • 上传时间:2019-05-18
  • 格式:PDF
  • 页数:19
  • 大小:1.59MB
  • 摘要
    申请专利号:

    CN201310506592.X

    申请日:

    2013.10.24

    公开号:

    CN103559123A

    公开日:

    2014.02.05

    当前法律状态:

    授权

    有效性:

    有权

    法律详情:

    授权|||实质审查的生效IPC(主分类):G06F 11/36申请日:20131024|||公开

    IPC分类号:

    G06F11/36; G06F11/34

    主分类号:

    G06F11/36

    申请人:

    烽火通信科技股份有限公司

    发明人:

    曾颜

    地址:

    430074 湖北省武汉市东湖开发区关东科技园东信路5号

    优先权:

    专利代理机构:

    北京捷诚信通专利事务所(普通合伙) 11221

    代理人:

    魏殿绅;庞炳良

    PDF完整版下载: PDF下载
    内容摘要

    本发明公开了一种基于VxWorks操作系统的函数调用栈分析方法及装置,涉及函数调用栈分析领域,该方法包括以下步骤:主机向目标机请求任务t1的TCB信息,目标机返回任务t1的TCB信息;主机从返回的TCB信息中获取到SP值、PC值、RA值,主机依据SP值以及栈底信息向目标机请求栈空间的信息,目标机返回相应的栈信息;主机根据目标机的TCB信息、栈空间的信息以及反汇编文件,进行函数调用栈分析。本发明能解析出局部函数的函数名,方便的查找到PC值所属函数的第一条指令,在没有特征指令的场景下,也能进行函数调用栈的分析,同时还能不受目标机资源的限制,提供完整的函数调用栈,有利于定位故障和异常。

    权利要求书

    权利要求书
    1.  一种基于VxWorks操作系统的函数调用栈分析方法,其特征在于,包括以下步骤:
    S1、在主机上输入目标机当前运行的VxWorks映像的可执行链接格式ELF文件,同时在主机上生成映像文件的符号表文件;
    S2、假定需要进行函数调用栈分析的任务为t1,主机向目标机下发请求命令:暂停任务t1,目标机执行该命令;
    S3、主机向目标机请求任务t1的任务控制块TCB信息,目标机返回任务t1的TCB信息,包括通用寄存器信息、栈底以及栈大小;
    S4、主机从返回的TCB信息中获取到栈指针SP值、程序计数器PC值、返回地址RA值,无内部互锁流水级的微处理器MIPS栈空间采用的是向下增长的方式,栈底在高地址,运行时SP值就是当前函数的栈指针,它指向的是栈顶的位置,每个栈帧中所存放的内容和存放顺序由目标体系架构的调用约定来定义;当前SP值是程序运行到当前状态的SP值,函数入口点的SP值则是进入该函数还未执行函数第一条指令时的SP值;
    S5、主机依据SP值以及栈底信息向目标机请求栈空间的信息,所请求的栈信息为SP值所指向的栈顶至栈底之间的内存空间信息,目标机返回相应的栈信息;
    S6、主机根据目标机的TCB信息,栈空间的信息以及反汇编文件,进行函数调用栈分析;
    S7、主机向目标机下发请求命令:恢复需要进行函数调用栈分析的任务t1,目标机执行该命令。

    2.  如权利要求1所述的基于VxWorks操作系统的函数调用栈分析方法,其特征在于:步骤S6中的函数调用栈分析是一个递归的过 程,进行顶层函数调用栈分析时,PC值和SP值分别为目标机返回的TCB信息中的PC值和SP值,后续递归过程中每一层的分析则依赖于上一层所生成的新的PC值和SP值,直至SP值到达栈底。

    3.  如权利要求2所述的基于VxWorks操作系统的函数调用栈分析方法,其特征在于:步骤S6中的函数调用栈分析过程如下:
    步骤601、判断SP值是否到达栈底,如果是,则转到步骤602;如果否,则转到步骤603;
    步骤602、串接每一层PC值所属的函数func形成函数调用链,结束;
    步骤603、根据PC值查找所属的函数地址以及函数名称,具体查找过程为:在符号表文件中查找地址不超过并且最接近PC值函数地址以及函数名称,将该函数记为func;转到步骤604;
    步骤604、利用现有工具获取函数func的汇编指令,转到步骤605;
    步骤605、获取函数func入口点的SP值以及函数func的返回地址,并计算新的PC值和SP值,其中新的PC值为函数func的返回地址RA值经过计算后的值,函数func的返回地址即函数func的调用者地址,新的SP值为函数func入口点的SP值;返回步骤601。

    4.  如权利要求3所述的基于VxWorks操作系统的函数调用栈分析方法,其特征在于:步骤605具体包括以下步骤:
    步骤6051、从函数的第一条指令开始,逐条扫描每条指令;
    步骤6052、判断所扫描的当前指令是否满足下面四种情形之一:
    (a)SP入栈调整指令;
    (b)RA在栈上的保存指令;
    (c)RA在栈上的恢复指令或者寄存器跳转指令;
    (d)SP出栈调整指令;
    如果满足,则转到步骤6053;如果都不满足,即为其它指令,转到步骤6055;
    步骤6053、依据上述四种情形以及当前所扫描的当前指令的地址与PC值的大小关系,分别计算函数入口点的SP值或者获取函数RA值:
    (a)SP入栈调整指令:
    计算函数栈帧的大小,比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数入口点的SP值=当前SP值+函数栈帧的大小;否则,函数入口点的SP值=当前SP值;
    (b)RA在栈上的保存指令:
    比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数RA值=栈上的RA值,即将当前SP值加上指令中相对SP值的偏移地址作为RA的保存地址,从而获取RA值;否则,函数RA值=当前TCB信息中的RA值;
    (c)RA在栈上的恢复指令或者寄存器跳转指令:
    比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数RA值=当前TCB信息中的RA值;否则,函数RA值=栈上的RA值,即将当前SP值加上指令中相对SP值的偏移地址作为RA的保存地址,从而获取RA值;
    (d)SP出栈调整指令:
    计算函数栈帧的大小,同时比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数入口点的SP值=当前SP值;否则,函数入口点的SP值=当前SP值+函数栈帧的大小;
    步骤6054、判断是否已经获取到函数入口点的SP值以及函数RA值,若满足,则转到步骤6056,否则,转至步骤6055;
    步骤6055、继续对下一条指令进行扫描直至函数func的指令扫描结束。
    步骤6056、将函数的返回地址即RA值经过计算后作为新的PC值,在MIPS系统中,将RA值减去8后作为新的PC值,将函数func入口的SP值作为新的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寄存器中;
    形如jr$ra的指令为寄存器跳转指令,函数返回通过该指令完成。

    6.  一种基于VxWorks操作系统的函数调用栈分析装置,包括主机和目标机,主机向目标机发出操作指令,分析数据并且显示结果数据;目标机执行主机的操作指令和返回实际的运行状态,其特征在于:
    在主机上输入目标机当前运行的VxWorks映像的可执行链接格式ELF文件,同时在主机上生成映像文件的符号表文件;
    假定需要进行函数调用栈分析的任务为t1,主机向目标机下发请求命令:暂停任务t1,目标机执行该命令;
    主机向目标机请求任务t1的任务控制块TCB信息,目标机返回 任务t1的TCB信息,包括通用寄存器信息、栈底以及栈大小;
    主机从返回的TCB信息中获取到栈指针SP值、程序计数器PC值、返回地址RA值,无内部互锁流水级的微处理器MIPS栈空间采用的是向下增长的方式,栈底在高地址,运行时SP值就是当前函数的栈指针,它指向的是栈顶的位置,每个栈帧中所存放的内容和存放顺序由目标体系架构的调用约定来定义;当前SP值是程序运行到当前状态的SP值,函数入口点的SP值则是进入该函数还未执行函数第一条指令时的SP值;
    主机依据SP值以及栈底信息向目标机请求栈空间的信息,所请求的栈信息为SP值所指向的栈顶至栈底之间的内存空间信息,目标机返回相应的栈信息;
    主机根据目标机的TCB信息,栈空间的信息以及反汇编文件,进行函数调用栈分析;
    主机向目标机下发请求命令:恢复需要进行函数调用栈分析的任务t1,目标机执行该命令。

    7.  如权利要求6所述的基于VxWorks操作系统的函数调用栈分析装置,其特征在于:所述函数调用栈分析是一个递归的过程,进行顶层函数调用栈分析时,PC值和SP值分别为目标机返回的TCB信息中的PC值和SP值,后续递归过程中每一层的分析则依赖于上一层所生成的新的PC值和SP值,直至SP值到达栈底。

    8.  如权利要求7所述的基于VxWorks操作系统的函数调用栈分析装置,其特征在于:所述函数调用栈分析过程如下:
    步骤601、判断SP值是否到达栈底,如果是,则转到步骤602;如果否,则转到步骤603;
    步骤602、串接每一层PC值所属的函数func形成函数调用链, 结束;
    步骤603、根据PC值查找所属的函数地址以及函数名称,具体查找过程为:在符号表文件中查找地址不超过并且最接近PC值函数地址以及函数名称,将该函数记为func;转到步骤604;
    步骤604、利用现有工具获取函数func的汇编指令,转到步骤605;
    步骤605、获取函数func入口点的SP值以及函数func的返回地址,并计算新的PC值和SP值,其中新的PC值为函数func的返回地址RA值经过计算后的值,函数func的返回地址即函数func的调用者地址,新的SP值为函数func入口点的SP值;返回步骤601。

    9.  如权利要求8所述的基于VxWorks操作系统的函数调用栈分析装置,其特征在于:步骤605具体包括以下步骤:
    步骤6051、从函数的第一条指令开始,逐条扫描每条指令;
    步骤6052、判断所扫描的当前指令是否满足下面四种情形之一:
    (a)SP入栈调整指令;
    (b)RA在栈上的保存指令;
    (c)RA在栈上的恢复指令或者寄存器跳转指令;
    (d)SP出栈调整指令;
    如果满足,则转到步骤6053;如果都不满足,即为其它指令,转到步骤6055;
    步骤6053、依据上述四种情形以及当前所扫描的当前指令的地址与PC值的大小关系,分别计算函数入口点的SP值或者获取函数RA值:
    (a)SP入栈调整指令:
    计算函数栈帧的大小,比较所扫描的当前指令的地址与PC值, 如果所扫描的当前指令的地址小于PC值,则:函数入口点的SP值=当前SP值+函数栈帧的大小;否则,函数入口点的SP值=当前SP值;
    (b)RA在栈上的保存指令:
    比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数RA值=栈上的RA值,即将当前SP值加上指令中相对SP值的偏移地址作为RA的保存地址,从而获取RA值;否则,函数RA值=当前TCB信息中的RA值;
    (c)RA在栈上的恢复指令或者寄存器跳转指令:
    比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数RA值=当前TCB信息中的RA值;否则,函数RA值=栈上的RA值,即将当前SP值加上指令中相对SP值的偏移地址作为RA的保存地址,从而获取RA值;
    (d)SP出栈调整指令:
    计算函数栈帧的大小,同时比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数入口点的SP值=当前SP值;否则,函数入口点的SP值=当前SP值+函数栈帧的大小;
    步骤6054、判断是否已经获取到函数入口点的SP值以及函数RA值,若满足,则转到步骤6056,否则,转至步骤6055;
    步骤6055、继续对下一条指令进行扫描直至函数func的指令扫描结束。
    步骤6056、将函数的返回地址即RA值经过计算后作为新的PC值,在MIPS系统中,将RA值减去8后作为新的PC值,将函数func入口的SP值作为新的SP值。

    10.  如权利要求9所述的基于VxWorks操作系统的函数调用栈 分析装置,其特征在于:步骤6052中部分特征指令的含义如下:
    形如addiu$sp,$sp,x的指令为SP值调整指令,x的值进行符号扩展后就是函数栈帧的大小,x为负值时,该指令表示SP入栈调整指令,x为正值时,该指令表示SP出栈调整指令;
    形如sw$ra,x($sp)的指令为RA在栈上的保存指令,用于将RA寄存器的内容保存到栈上;
    形如lw$ra,x($sp)的指令为RA在栈上的恢复指令,用于将栈上保存的内容恢复到RA寄存器中;
    形如jr$ra的指令为寄存器跳转指令,函数返回通过该指令完成。

    说明书

    说明书基于VxWorks操作系统的函数调用栈分析方法及装置
    技术领域
    本发明涉及函数调用栈分析领域,特别是涉及一种基于VxWorks操作系统的函数调用栈分析方法及装置。
    背景技术
    在计算机科学中,栈被定义为一个特殊的容器,其遵守的规则是先入栈的数据后出栈。用户可以将数据压入栈中,即入栈,也可以将已经压入栈中的数据弹出,即出栈。栈在程序运行中具有举足轻重的地位,最重要的,栈保存了一个函数调用所需要的维护信息,这常常被称为栈帧,一个函数的栈帧占用一个连续的区域,每个栈帧对应于一个未完成运行的函数。在函数开始时,对应的栈帧已经完整地建立了;在函数退出时,该函数栈帧将被销毁。由于函数调用通常是嵌套的,因此在同一时刻,栈中会有多个函数的栈帧信息,调用栈就是由多个嵌套调用函数所使用的栈帧组成。
    调用栈体现了函数调用关系,也即一个函数调用链。例如,函数f1调用函数f2,函数f2调用函数f3,则f1→f2→f3就是一个调用栈。其中对于函数f1调用函数f2而言,f1为调用者,f2为被调用者。在实际的软件运行中,一个函数到另一个函数之间的调用关系可能存在多种调用情况,这个调用栈不可能在预先确定,因此当程序出现异常、检测到错误或者被断点中断时,需要查看当前函数的调用栈,以便确定异常发生的场景。这也是软件调试的一个常用方法。
    下面以32位的MIPS(Microprocessor without interlocked piped  stages,无内部互锁流水级的微处理器)系统为例,说明现有技术函数调用栈分析的基本原理,其它系统的函数调用栈分析方法也类似。MIPS具有32个通用寄存器,其中SP(Stack Pointer,栈指针)寄存器、RA(Return Address,返回地址)寄存器以及PC(Program Counter,程序计数器)寄存器扮演着重要的角色。为了叙述方便,SP寄存器、RA寄存器、PC寄存器中的内容在本发明中分别称为SP值、RA值、PC值。由于MIPS通常只在函数进入和退出的时刻才调整SP值,因此MIPS下函数调用栈分析的基本原理是:分析目标机上的代码指令,获取当前任务的SP值、PC值和RA值,从PC值开始的指令地址向前扫描指令,直到搜索到函数入口的特征指令,确定函数的栈帧大小,由此计算出调用者的栈指针。同时搜索RA值以及RA在栈上的存取指令,分析被调用者的返回地址,从而获取调用者的地址。以此类推获取当前任务完整的函数调用链。对于每个函数地址,查找内核中的符号表,从而得到函数的名称。
    一般调试器都能提供查看函数调用栈的工具。例如在VxWorks系统下,可以通过一个命令:display a stack trace of a task(显示一个任务的栈轨迹),下文简称tt命令,来查看任务的函数调用栈,该命令可以直接运行在目标机上,其它系统也有类似的调试命令。
    但是,这些调试命令可能存在以下问题:
    (1)VxWorks的符号表是动态存在系统中的,通常VxWorks映像文件加载的是全局符号,局部符号不加载。调用栈分析时,解析出的函数名是全局函数名,不能解析出局部函数名,其局部函数名是通过全局函数名加上地址偏移来标识的,因此,在VxWorks目标机上利用tt命令运行函数调用栈分析的程序时,无法准确的提供局部函数的函数名。
    (2)现有技术中,在目标机上通过PC值搜索到PC所属函数的第一条指令的方法比较繁琐,同时还是不可靠的,因为其假设前提是该函数前面还有函数。
    (3)调用栈分析依赖于特征指令,例如:MIPS系统下内嵌的汇编子程序可能没有显式的入栈指令,则无法进行调用栈的分析或者分析的内容不正确。
    (4)调用栈分析的命令大都运行在目标机上,在嵌入式系统中,由于目标机的资源有限,对所能跟踪的单个函数的大小以及所能跟踪的函数调用深度均有限制,因此当函数大小超过了系统预设的所跟踪的指令长度时,或者当函数调用的深度超过了系统预设的深度时,则获取的函数调用栈信息不完整。
    发明内容
    本发明的目的是为了克服上述背景技术的不足,提供一种基于VxWorks操作系统的函数调用栈分析方法及装置,能够解析出局部函数的函数名,方便的查找到PC值所属函数的第一条指令,在没有特征指令例如显式的入栈指令的场景下,也能进行函数调用栈的分析,同时还能不受目标机资源的限制,提供完整的函数调用栈,有利于定位故障和异常。
    本发明提供一种基于VxWorks操作系统的函数调用栈分析方法,包括以下步骤:
    S1、在主机上输入目标机当前运行的VxWorks映像的可执行链接格式ELF文件,同时在主机上生成映像文件的符号表文件;
    S2、假定需要进行函数调用栈分析的任务为t1,主机向目标机下发请求命令:暂停任务t1,目标机执行该命令;
    S3、主机向目标机请求任务t1的任务控制块TCB信息,目标机 返回任务t1的TCB信息,包括通用寄存器信息、栈底以及栈大小;
    S4、主机从返回的TCB信息中获取到栈指针SP值、程序计数器PC值、返回地址RA值,无内部互锁流水级的微处理器MIPS栈空间采用的是向下增长的方式,栈底在高地址,运行时SP值就是当前函数的栈指针,它指向的是栈顶的位置,每个栈帧中所存放的内容和存放顺序由目标体系架构的调用约定来定义;当前SP值是程序运行到当前状态的SP值,函数入口点的SP值则是进入该函数还未执行函数第一条指令时的SP值;
    S5、主机依据SP值以及栈底信息向目标机请求栈空间的信息,所请求的栈信息为SP值所指向的栈顶至栈底之间的内存空间信息,目标机返回相应的栈信息;
    S6、主机根据目标机的TCB信息,栈空间的信息以及反汇编文件,进行函数调用栈分析;
    S7、主机向目标机下发请求命令:恢复需要进行函数调用栈分析的任务t1,目标机执行该命令。
    在上述技术方案的基础上,步骤S6中的函数调用栈分析是一个递归的过程,进行顶层函数调用栈分析时,PC值和SP值分别为目标机返回的TCB信息中的PC值和SP值,后续递归过程中每一层的分析则依赖于上一层所生成的新的PC值和SP值,直至SP值到达栈底。
    在上述技术方案的基础上,步骤S6中的函数调用栈分析过程如下:
    步骤601、判断SP值是否到达栈底,如果是,则转到步骤602;如果否,则转到步骤603;
    步骤602、串接每一层PC值所属的函数func形成函数调用链,结束;
    步骤603、根据PC值查找所属的函数地址以及函数名称,具体查找过程为:在符号表文件中查找地址不超过并且最接近PC值函数地址以及函数名称,将该函数记为func;转到步骤604;
    步骤604、利用现有工具获取函数func的汇编指令,转到步骤605;
    步骤605、获取函数func入口点的SP值以及函数func的返回地址,并计算新的PC值和SP值,其中新的PC值为函数func的返回地址RA值经过计算后的值,函数func的返回地址即函数func的调用者地址,新的SP值为函数func入口点的SP值;返回步骤601。
    在上述技术方案的基础上,步骤605具体包括以下步骤:
    步骤6051、从函数的第一条指令开始,逐条扫描每条指令;
    步骤6052、判断所扫描的当前指令是否满足下面四种情形之一:
    (a)SP入栈调整指令;
    (b)RA在栈上的保存指令;
    (c)RA在栈上的恢复指令或者寄存器跳转指令;
    (d)SP出栈调整指令;
    如果满足,则转到步骤6053;如果都不满足,即为其它指令,转到步骤6055;
    步骤6053、依据上述四种情形以及当前所扫描的当前指令的地址与PC值的大小关系,分别计算函数入口点的SP值或者获取函数RA值:
    (a)SP入栈调整指令:
    计算函数栈帧的大小,比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数入口点的SP值=当前SP值+函数栈帧的大小;否则,函数入口点的SP值=当前SP值;
    (b)RA在栈上的保存指令:
    比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数RA值=栈上的RA值,即将当前SP值加上指令中相对SP值的偏移地址作为RA的保存地址,从而获取RA值;否则,函数RA值=当前TCB信息中的RA值;
    (c)RA在栈上的恢复指令或者寄存器跳转指令:
    比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数RA值=当前TCB信息中的RA值;否则,函数RA值=栈上的RA值,即将当前SP值加上指令中相对SP值的偏移地址作为RA的保存地址,从而获取RA值;
    (d)SP出栈调整指令:
    计算函数栈帧的大小,同时比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数入口点的SP值=当前SP值;否则,函数入口点的SP值=当前SP值+函数栈帧的大小;
    步骤6054、判断是否已经获取到函数入口点的SP值以及函数RA值,若满足,则转到步骤6056,否则,转至步骤6055;
    步骤6055、继续对下一条指令进行扫描直至函数func的指令扫描结束。
    步骤6056、将函数的返回地址即RA值经过计算后作为新的PC值,在MIPS系统中,将RA值减去8后作为新的PC值,将函数func入口的SP值作为新的SP值。
    在上述技术方案的基础上,步骤6052中部分特征指令的含义如下:
    形如addiu$sp,$sp,x的指令为SP值调整指令,x的值进行符号扩 展后就是函数栈帧的大小,x为负值时,该指令表示SP入栈调整指令,x为正值时,该指令表示SP出栈调整指令;
    形如sw$ra,x($sp)的指令为RA在栈上的保存指令,用于将RA寄存器的内容保存到栈上;
    形如lw$ra,x($sp)的指令为RA在栈上的恢复指令,用于将栈上保存的内容恢复到RA寄存器中;
    形如jr$ra的指令为寄存器跳转指令,函数返回通过该指令完成。
    本发明还提供一种基于VxWorks操作系统的函数调用栈分析装置,包括主机和目标机,主机向目标机发出操作指令,分析数据并且显示结果数据;目标机执行主机的操作指令和返回实际的运行状态;
    在主机上输入目标机当前运行的VxWorks映像的可执行链接格式ELF文件,同时在主机上生成映像文件的符号表文件;
    假定需要进行函数调用栈分析的任务为t1,主机向目标机下发请求命令:暂停任务t1,目标机执行该命令;
    主机向目标机请求任务t1的任务控制块TCB信息,目标机返回任务t1的TCB信息,包括通用寄存器信息、栈底以及栈大小;
    主机从返回的TCB信息中获取到栈指针SP值、程序计数器PC值、返回地址RA值,无内部互锁流水级的微处理器MIPS栈空间采用的是向下增长的方式,栈底在高地址,运行时SP值就是当前函数的栈指针,它指向的是栈顶的位置,每个栈帧中所存放的内容和存放顺序由目标体系架构的调用约定来定义;当前SP值是程序运行到当前状态的SP值,函数入口点的SP值则是进入该函数还未执行函数第一条指令时的SP值;
    主机依据SP值以及栈底信息向目标机请求栈空间的信息,所请求的栈信息为SP值所指向的栈顶至栈底之间的内存空间信息,目标 机返回相应的栈信息;
    主机根据目标机的TCB信息,栈空间的信息以及反汇编文件,进行函数调用栈分析;
    主机向目标机下发请求命令:恢复需要进行函数调用栈分析的任务t1,目标机执行该命令。
    在上述技术方案的基础上,所述函数调用栈分析是一个递归的过程,进行顶层函数调用栈分析时,PC值和SP值分别为目标机返回的TCB信息中的PC值和SP值,后续递归过程中每一层的分析则依赖于上一层所生成的新的PC值和SP值,直至SP值到达栈底。
    在上述技术方案的基础上,所述函数调用栈分析过程如下:
    步骤601、判断SP值是否到达栈底,如果是,则转到步骤602;如果否,则转到步骤603;
    步骤602、串接每一层PC值所属的函数func形成函数调用链,结束;
    步骤603、根据PC值查找所属的函数地址以及函数名称,具体查找过程为:在符号表文件中查找地址不超过并且最接近PC值函数地址以及函数名称,将该函数记为func;转到步骤604;
    步骤604、利用现有工具获取函数func的汇编指令,转到步骤605;
    步骤605、获取函数func入口点的SP值以及函数func的返回地址,并计算新的PC值和SP值,其中新的PC值为函数func的返回地址RA值经过计算后的值,函数func的返回地址即函数func的调用者地址,新的SP值为函数func入口点的SP值;返回步骤601。
    在上述技术方案的基础上,步骤605具体包括以下步骤:
    步骤6051、从函数的第一条指令开始,逐条扫描每条指令;
    步骤6052、判断所扫描的当前指令是否满足下面四种情形之一:
    (a)SP入栈调整指令;
    (b)RA在栈上的保存指令;
    (c)RA在栈上的恢复指令或者寄存器跳转指令;
    (d)SP出栈调整指令;
    如果满足,则转到步骤6053;如果都不满足,即为其它指令,转到步骤6055;
    步骤6053、依据上述四种情形以及当前所扫描的当前指令的地址与PC值的大小关系,分别计算函数入口点的SP值或者获取函数RA值:
    (a)SP入栈调整指令:
    计算函数栈帧的大小,比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数入口点的SP值=当前SP值+函数栈帧的大小;否则,函数入口点的SP值=当前SP值;
    (b)RA在栈上的保存指令:
    比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数RA值=栈上的RA值,即将当前SP值加上指令中相对SP值的偏移地址作为RA的保存地址,从而获取RA值;否则,函数RA值=当前TCB信息中的RA值;
    (c)RA在栈上的恢复指令或者寄存器跳转指令:
    比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数RA值=当前TCB信息中的RA值;否则,函数RA值=栈上的RA值,即将当前SP值加上指令中相对SP值的偏移地址作为RA的保存地址,从而获取RA值;
    (d)SP出栈调整指令:
    计算函数栈帧的大小,同时比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数入口点的SP值=当前SP值;否则,函数入口点的SP值=当前SP值+函数栈帧的大小;
    步骤6054、判断是否已经获取到函数入口点的SP值以及函数RA值,若满足,则转到步骤6056,否则,转至步骤6055;
    步骤6055、继续对下一条指令进行扫描直至函数func的指令扫描结束。
    步骤6056、将函数的返回地址即RA值经过计算后作为新的PC值,在MIPS系统中,将RA值减去8后作为新的PC值,将函数func入口的SP值作为新的SP值。
    在上述技术方案的基础上,步骤6052中部分特征指令的含义如下:
    形如addiu$sp,$sp,x的指令为SP值调整指令,x的值进行符号扩展后就是函数栈帧的大小,x为负值时,该指令表示SP入栈调整指令,x为正值时,该指令表示SP出栈调整指令;
    形如sw$ra,x($sp)的指令为RA在栈上的保存指令,用于将RA寄存器的内容保存到栈上;
    形如lw$ra,x($sp)的指令为RA在栈上的恢复指令,用于将栈上保存的内容恢复到RA寄存器中;
    形如jr$ra的指令为寄存器跳转指令,函数返回通过该指令完成。
    与现有技术相比,本发明的优点如下:
    (1)本发明利用编译的映像文件解析出局部函数的函数名,准确查找全局符号和局部符号,即全局函数名和局部函数名。
    (2)本发明对应给定的PC值,在符号表文件中查找地址不超 过并且最接近PC值的函数地址,获取到PC寄存器所属函数的第一条指令地址。由于主机可以借助工具查看ELF(Executable and Linkable Format,可执行链接格式)文件的符号表,因此能够更加准确的获取函数地址。
    (3)本发明在进行函数调用栈分析时的指令扫描时,不论该指令与PC值比较是否被执行均向下扫描搜索到对应的特征指令,从而获取函数的栈帧大小,由此计算函数入口点的SP值,在没有特征指令例如显式的入栈指令的场景下,也能进行函数调用栈的分析。
    (4)本发明在主机上进行函数调用栈的分析,相比目标机,其资源是无限制的,包括所能跟踪的单个函数的大小以及所能跟踪的函数调用深度,因此能不受目标机资源的限制,提供完整的函数调用栈,有利于定位故障和异常。
    附图说明
    图1是本发明实施例中主机与目标机之间的交互示意图。
    图2是MIPS系统下函数的栈帧的结构示意图。
    图3是本发明实施例中函数调用栈分析的递归过程流程图。
    图4是本发明实施例中函数调用栈分析的递归过程中每一层次计算新的PC值和SP值的流程图。
    具体实施方式
    下面结合附图及具体实施例对本发明作进一步的详细描述。
    本发明实施例提供一种基于VxWorks操作系统的函数调用栈分析装置,包括主机和目标机,主机一般是PC机,主要用来向目标机发出操作指令,分析数据并且显示结果数据;目标机则主要用来执行主机的操作指令和返回实际的运行状态。
    参见图1所示,本发明实施例提供一种基于VxWorks操作系统的函数调用栈分析方法,包括以下步骤:
    S1、在主机上输入目标机当前运行的VxWorks映像的ELF文件,同时利用现有工具在主机上生成映像文件的符号表文件。
    S2、假定需要进行函数调用栈分析的任务为t1,主机向目标机下发请求命令:暂停任务t1,目标机执行该命令。
    S3、主机向目标机请求任务t1的TCB(Task Control Block,任务控制块)信息,目标机返回任务t1的TCB信息,包括通用寄存器信息、栈底以及栈大小等信息。
    S4、主机从返回的TCB信息中获取到SP值、PC值、RA值等通用寄存器的值。图2示出了典型的MIPS栈帧组织方式,MIPS栈空间采用的是向下增长的方式,栈底在高地址,运行时SP值就是当前函数(被调用者)的栈指针,它指向的是栈顶的位置。每个栈帧中所存放的内容和存放顺序由目标体系架构的调用约定来定义。图2中当前函数的栈帧表示该函数自身所用的栈空间,其上方的区域属于调用者。栈帧中的区域都是可选的。通用寄存器一般根据需要保存RA、GP(Global Pointer,全局指针)、FP(Frame Pointer,帧指针)等调用者的寄存器信息。通常情况下,MIPS系统只在函数进入和退出的时刻才调整SP值。当前SP值是程序运行到当前状态的SP值,函数入口点的SP值则是进入该函数还未执行函数第一条指令时的SP值。
    S5、主机依据SP值以及栈底信息向目标机请求栈空间的信息,所请求的栈信息为SP值所指向的栈顶至栈底之间的内存空间信息,目标机返回相应的栈信息。
    S6、主机根据目标机的TCB信息,栈空间的信息以及反汇编文件,按照图3所示的方法进行函数调用栈分析。
    S7、主机向目标机下发请求命令:恢复需要进行函数调用栈分析的任务t1,目标机执行该命令。
    步骤S6中的函数调用栈分析是一个递归的过程,进行顶层函数调用栈分析时,PC值和SP值分别为目标机返回的TCB信息中的PC值和SP值,后续递归过程中每一层的分析则依赖于上一层所生成的新的PC值和SP值,直至SP值到达栈底。
    参见图3所示,步骤S6中的函数调用栈分析过程如下:
    步骤601、判断SP值是否到达栈底,如果是,则转到步骤602;如果否,则转到步骤603;
    步骤602、串接每一层PC值所属的函数func形成函数调用链,结束;
    步骤603、根据PC值查找所属的函数地址以及函数名称,具体查找过程为:在符号表文件中查找地址不超过并且最接近PC值函数地址以及函数名称,将该函数记为func;转到步骤604;
    步骤604、利用现有工具获取函数func的汇编指令,转到步骤605;
    步骤605、获取函数func入口点的SP值以及函数func的返回地址,并计算新的PC值和SP值,其中新的PC值为函数func的返回地址(即RA值)经过计算后的值,函数func的返回地址即函数func的调用者地址,新的SP值为函数func入口点的SP值;返回步骤601;
    参见图4所示,步骤605具体包括以下步骤:
    步骤6051、从函数的第一条指令开始,逐条扫描每条指令;
    步骤6052、判断所扫描的当前指令是否满足下面四种情形之一:
    (a)SP入栈调整指令;
    (b)RA在栈上的保存指令;
    (c)RA在栈上的恢复指令或者寄存器跳转指令;
    (d)SP出栈调整指令;
    如果满足,则转到步骤6053;如果都不满足,即为其它指令,转到步骤6055;
    步骤6053、依据上述四种情形以及当前所扫描的当前指令的地址与PC值的大小关系,分别计算函数入口点的SP值或者获取函数RA值:
    (a)SP入栈调整指令:
    计算函数栈帧的大小,比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数入口点的SP值=当前SP值+函数栈帧的大小;否则,函数入口点的SP值=当前SP值;
    (b)RA在栈上的保存指令:
    比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数RA值=栈上的RA值,即将当前SP值加上指令中相对SP值的偏移地址作为RA的保存地址,从而获取RA值;否则,函数RA值=当前TCB信息中的RA值;
    (c)RA在栈上的恢复指令或者寄存器跳转指令:
    比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数RA值=当前TCB信息中的RA值;否则,函数RA值=栈上的RA值,即将当前SP值加上指令中相对SP值的偏移地址作为RA的保存地址,从而获取RA值;
    (d)SP出栈调整指令:
    计算函数栈帧的大小,同时比较所扫描的当前指令的地址与PC值,如果所扫描的当前指令的地址小于PC值,则:函数入口点的SP值=当前SP值;否则,函数入口点的SP值=当前SP值+函数栈帧的 大小;
    步骤6054、判断是否已经获取到函数入口点的SP值以及函数RA值,若满足,则转到步骤6056,否则,转至步骤6055;
    步骤6055、继续对下一条指令进行扫描直至函数func的指令扫描结束。
    步骤6056、将函数的返回地址即RA值经过计算后作为新的PC值,在MIPS系统中,需要将RA值减去8后作为新的PC值,将函数func入口的SP值作为新的SP值;
    为了更加详细地说明步骤6052,补充说明部分特征指令的含义:
    形如addiu $sp,$sp,x的指令为SP值调整指令,通常x的值进行符号扩展后就是函数栈帧的大小,x为负值时,该指令通常表示SP入栈调整指令,x为正值时,该指令通常表示SP出栈调整指令;
    形如sw $ra,x($sp)的指令为RA在栈上的保存指令,用于将RA寄存器的内容保存到栈上;
    形如lw $ra,x($sp)这样的指令为RA在栈上的恢复指令,用于将栈上保存的内容恢复到RA寄存器中;
    形如jr $ra的指令为寄存器跳转指令,通常函数返回通过该指令完成。
    本发明实施例将函数的汇编指令分为下面四种场景进行说明,各个场景中每条汇编指令从左至右排列依次为指令地址,指令二进制代码,伪指令。
    (1)在函数的入口和出口都具有显式的SP调整指令和RA在栈上的存取指令,汇编指令如下所示:
    80a79a64: 27bdffb8  addiu $sp,$sp,-72
    ……
    80a79a7c: afbf0030  sw $ra,48($sp)
    ……
    80a79cd0: 8fbf0030  lw $ra,48($sp)
    ……
    80a79ce8: 03e00008  jr $ra
    80a79cec: 27bd0048  addiu $sp,$sp,72
    (2)仅在函数的出口具有显式的SP调整指令,例如在MIPS系统下内嵌的汇编子程序,汇编指令如下所示:
    8099c094: 40886000  mtc0 $t0,$12
    8099c098: 000000c0  sll $zero,$zero,0x3
    ……
    8099c0d0: 8fbf0018  lw $ra,24($sp)
    8099c0d4: 03e00008  jr $ra
    8099c0d8: 27bd0020  addiu $sp,$sp,32
    (3)仅在函数的入口具有显式的SP调整指令。例如当函数体为无限循环时,汇编指令如下所示:
    8086c534: 27bdffc8  addiu $sp,$sp,-56
    8086c538: afbf0034  sw $ra,52($sp)
    ……
    8086c550: 27c20018  addiu $v0,$s8,24
    ……
    8086c844: 0821b154  j 8086c550
    8086c848: 00000000  nop
    (4)在函数的入口和出口都没有显式的SP调整指令。例如:
    ……
    80101770: 03e00008  jr $ra
    ……
    本发明实施例的原理详细阐述如下:
    本发明实施例引入了主机的使用,将原来在目标机上运行的调用栈分析程序移至主机上运行,主机通过静态分析ELF文件以及动态获取目标机上当前运行的TCB信息和栈信息来完成函数调用栈的分析。该方法适用于VxWorks操作系统下通过静态链接方式生成的可执行文件,由于可执行文件在装载时实际上是被映射的虚拟空间,所以这个可执行的ELF文件实际上就是VxWorks映像文件。在VxWorks系统中,大部分静态链接的程序在装载时程序的虚拟地址和物理地址是相同的。在现有技术中,目标机的调用栈分析都是以当前PC值向前搜索指令,直到找到该函数的第一条指令,显然对于场景2,是很难确定函数的第一条指令的,从而造成调用栈分析的失败。而在本发明中,能够根据主机的工具获取函数的第一条指令,并且从函数的第一条指令开始扫描,不论该指令与PC值比较是否被执行均依次向下扫描函数的每一条指令,直至搜索到对应的特征指令,从而获取函数的栈帧大小,由此计算函数入口点的SP值,这样即使函数没有显式的入栈指令,也能进行调用栈分析。同时根据特征指令获取函数的返回地址,函数的返回地址可能存储在RA寄存器中,也可能存储在栈上,依据不同的特征指令以及该指令是否被执行而定。
    本领域的技术人员可以对本发明实施例进行各种修改和变型,倘若这些修改和变型在本发明权利要求及其等同技术的范围之内,则这些修改和变型也在本发明的保护范围之内。
    说明书中未详细描述的内容为本领域技术人员公知的现有技术。

    关 键  词:
    基于 VXWORKS 操作系统 函数 调用 分析 方法 装置
      专利查询网所有文档均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    0条评论

    还可以输入200字符

    暂无评论,赶快抢占沙发吧。

    关于本文
    本文标题:基于VXWORKS操作系统的函数调用栈分析方法及装置.pdf
    链接地址:https://www.zhuanlichaxun.net/p-6188445.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
    经营许可证编号:粤ICP备2021068784号-1