一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种异构众核程序动态调用树分析装置及分析方法与流程

2022-03-22 20:19:27 来源:中国专利 TAG:


1.本发明涉及一种异构众核程序动态调用树分析装置及分析方法,属于代码逻辑分析领域。


背景技术:

2.目前阅读代码进行代码逻辑分析时,获取程序调用树的方法主要有两种:一种是使用面向所采用编程语言的词法和语法分析工具,属于静态分析方法,对程序程序运行时动态改变一些行为无法获取;另一种是由用户在程序中插入代码(往往是打印语句)来获取,属于动态分析方法。
3.程序执行过程中一些需动态确定的调用过程(如基于函数指针的调用等),是难以通过静态分析的方法获得的,而面对大型的应用程序,若是通过用户插桩代码来确定,显然极其费时费力。基于当前技术现状,在国产异构众核处理器上进行代码移植时,往往需要分两步走:先采用前一种获取程序的整体静态调用树,再结合后者对关键部分做深入分析。
4.随着国产异构众核处理器的不断发展,以及国内外局势的影响,越来越多的应用软件有着面向国产异构众核处理器移植或者在其上重新开发的需求,在此过程中对相关代码的研读是首要环节,然而,高级语言的抽象给这一环节带来了巨大的困难,比如c 语言中的模板、继承等特性,以及c语言中的函数指针等。现有的代码逻辑分析手段主要是依赖于静态分析,难以理解程序运行过程中的一些动态特性。


技术实现要素:

5.本发明的目的是提供一种异构众核程序动态调用树分析装置及分析方法,以解决现有的代码逻辑分析手段主要依赖于静态分析,难以理解程序运行过程中的一些动态特性的问题。
6.为达到上述目的,本发明采用的技术方案是:提供一种异构众核程序动态调用树分析装置,包括以下功能模块:插桩库,用于记录程序执行过程中的动态调用树信息;结果展示模块,用于展示程序的动态调用树信息,将所记录的数据按照存放顺序进行展示,基于记录中的l值实现多叉树的分层展示,即l 1作为l的子节点进行展示;所述插桩库包含initfunc函数、entryfunc函数、leavefunc函数、stackpc数据结构和da数据结构,所述stackpc是栈结构,所述da是一个顺序存储结构,且所述stackpc和da均支持动态扩容;所述initfunc函数在所有用户程序最开始的地方调用,用于stackpc和da数据结构的初始存储空间申请及l值初始化;所述entryfunc函数用于将函数入口pc值入栈至stackpc,并负责记录数据,其中每条数据条目由当前的栈层l、当前栈层l存储的pc值(即当前所记录用户函数入口的pc值)以及l-1栈层存储的pc(即当前函数的调用者的的pc)组成,记为d(l,pc,cpc),当l=0时,即
不存在当前函数的调用者,使cpc=0;所述leavefunc函数用于实现出栈操作,以及在栈为空时,输出da。
7.还提供一种异构众核程序动态调用树分析方法,基于上述的异构众核程序动态调用树分析装置,包括以下步骤:s1、修改编译器源码,增加一个编译选项,功能是在用户main函数之前插装initfunc函数,在每个用户函数的入口插装entryfunc函数,在每个用户函数的出口插装leavefunc函数;s2、使用s1中新增加的编译选项编译程序;s3、运行s2中生成的程序;s4、在s3中程序运行至initfunc时,initfunc进行空间申请,并将运算控制核和运算的l值均初始化为-1。
8.s5、当程序运行至enterfunc时,l值加1,检查d(l,pc,cpc)在stackpc中是否存在,若不存在,则在da中增加新的记录,若存在,则过滤掉该记录的记录,仅在da中保存一条(l,pcb,pca)记录;s6、当程序运行至leavefunc时,l值减1,若l值等于-1,则进行输出操作,此时,如果是在运算核中则通过dma将记录传输至运算控制核,如果是运算控制核则输出记录至文件,所述记录包括运算核和运算控制核;s7、在s6中所有记录输出至文件之后,调用结果展示模块进行展示。
9.上述技术方案中进一步改进的方案如下:1. 上述方案中,s7中,展示模块按照记录的顺序对运算控制核和每个运算核的数据分别进行输出。
10.2. 上述方案中,每一条记录的输出方法为:首先缩进l个空白字符,然后通过libbfd库将记录的pc值转换函数名进行输出,之后换行。
11.由于上述技术方案的运用,本发明与现有技术相比具有下列优点:本发明一种异构众核程序动态调用树分析装置及分析方法,面向国产异构众核处理器,基于编译器的自动插桩,以简单的算法和较低开销,用户通过一次运行即可获取程序的动态调用树,能有效弥补静态分析的不足,提升代码逻辑分析效率。
附图说明
12.附图1为本发明插桩模块核心原理示意图。
具体实施方式
13.实施例:本发明提供一种异构众核程序动态调用树分析装置,包括以下功能模块:插桩库,用于记录程序执行过程中的动态调用树信息;结果展示模块,用于展示程序的动态调用树信息,将所记录的数据按照存放顺序进行展示,基于记录中的l值实现多叉树的分层展示,即l 1作为l的子节点进行展示;所述插桩库包含initfunc函数、entryfunc函数、leavefunc函数、stackpc数据结构和da数据结构,所述stackpc是栈结构,所述da是一个顺序存储结构,且所述stackpc和da均支持动态扩容;
所述initfunc函数在所有用户程序最开始的地方调用,如c语言的main函数入口,用于stackpc和da数据结构的初始存储空间申请及l值初始化;所述entryfunc函数用于将函数入口pc值入栈至stackpc,并负责记录数据,其中每条数据条目由当前的栈层l、当前栈层l存储的pc值(即当前所记录用户函数入口的pc值)以及l-1栈层存储的pc(即当前函数的调用者的的pc)组成,记为d(l,pc,cpc),当l=0时,即不存在当前函数的调用者,使cpc=0;所述leavefunc函数用于实现出栈操作,以及在栈为空时(即用户所有函数结束时,这是由于enterfunc和leavefunc是成对出现的,结合栈结构的特点可知),输出da。
14.还提供一种异构众核程序动态调用树分析方法,基于上述的异构众核程序动态调用树分析装置,包括以下步骤:s1、修改编译器源码,增加一个编译选项,功能是在用户main函数之前插装initfunc函数,在每个用户函数的入口插装entryfunc函数,在每个用户函数的出口插装leavefunc函数;s2、使用s1中新增加的编译选项编译程序;s3、运行s2中生成的程序;s4、在s3中程序运行至initfunc时,initfunc进行空间申请,并将运算控制核和运算的l值均初始化为-1。
15.s5、当程序运行至enterfunc时,l值加1,检查d(l,pc,cpc)在stackpc中是否存在,若不存在,则在da中增加新的记录,若存在,则过滤掉该记录(用于过滤到掉程序中存在的循环调用记录,如a中循环调用了b,记a和b的入口pc分别为pca和pcb,记b中的栈层为l,则会连续存在多个(l,pcb,pca)的记录,仅在da中保存一条(l,pcb,pca)记录);s6、当程序运行至leavefunc时,l值减1,若l值等于-1(即stackpc栈为空,表明所有用户函数调用结束),则进行输出操作,此时,如果是在运算核中则通过dma将记录传输至运算控制核,如果是运算控制核则输出记录至文件,所述记录包括运算核和运算控制核的所有记录;s7、在s6中所有记录输出至文件之后,调用结果展示模块进行展示。
16.上述技术方案中进一步改进的方案如下:1. 上述方案中,s7中,展示模块按照记录的顺序对运算控制核和每个运算核的数据分别进行输出。
17.2. 上述方案中,每一条记录的输出方法为:首先缩进l个空白字符,然后通过libbfd库将记录的pc值转换函数名进行输出,之后换行。
18.对上述实施例的进一步解释如下:通过编译器插桩接口在用户函数的入口和出口分别插入处理函数,实现了自动化的处理函数插桩,与用户手动插桩相比显著地提高效率;处理函数通过一个栈结构和顺序存储结构保存程序的动态调用栈信息,待运行完成后生成调用栈数据,对动态执行到的函数调用达到了静态分析的效果;提供函数名结合多叉树的直观展示形式。
19.本发明所提出的装置,使用时分为三个步骤:(1)添加相关编译、链接选项,编译程序;(2)运行程序;(3)调用解析模块查看结果。
20.该装置主要包含两部分内容:插桩库和结果展示模块。其中,插桩库是核心部件,用于记录程序执行过程中的动态调用树信息,核心原理如图1所示;结果展示模块用于展示程序的动态调用树信息。
21.插桩库包含3个主要函数initfunc、entryfunc和leavefunc,涉及两个主要数据结构,其中stackpc是栈结构,da是一个顺序存储结构,两者均支持动态扩容。
22.initfunc在所有用户程序最开始的地方调用,如c语言的main函数入口,用于stackpc和da等重要数据结构的初始化相关工作。
23.enterfunc实现将函数入口pc值入栈至stackpc,并负责记录数据,其中每条数据条目由当前的栈层l、当前栈层l存储的pc值(即当前所记录用户函数入口的pc值)以及l-1栈层存储的pc(即当前函数的调用者的的pc)组成,记为d(l,pc,cpc)。
24.leavefunc负责实现出栈操作,以及在栈为空时(即用户所有函数结束时,这是由于enterfunc和leavefunc是成对出现的,结合栈结构的特点可知),输出da。
25.在异构众核程序中,运算控制核和运算核会分别有类似main函数的用户函数主入口,为此我们需要分别实现上述中的enterfunc和leavefunc函数,initfunc仅需在运算控制核的用户函数主入口处插桩即可,此外,考虑到运算核上的输出效率较低我们将运算核上的数据通过dma手段传输至主核后再统一输出。
26.考虑到在程序中经常会出现在一个循环中调用另一个函数的情况,我们通过在enterfunc中记录数据时加入一个过滤功能,即当已有的记录中存在一个与当前记录完全相同的数据项时,不再重复存储当前记录,这将大大减小da的开销。
27.结果展示模块实现将所记录的数据按照存放顺序进行展示,基于记录中的l值实现多叉树的分层展示,即l 1作为l的子节点进行展示。此外,基于libbfd库实现pc值转化为函数名的功能,展示给用户具有较好可读性的结果。
28.采用上述种异构众核程序动态调用树分析装置及分析方法时,其面向国产异构众核处理器,基于编译器的自动插桩,以简单的算法和较低开销,用户通过一次运行即可获取程序的动态调用树,能有效弥补静态分析的不足,提升代码逻辑分析效率。
29.为了便于更好的理解本发明,下面将对本文中使用的术语进行简要的解释:代码逻辑分析:对代码的内在逻辑进行分析。
30.异构众核程序:在异构众核处理器上编译运行的程序。
31.调用树:对程序中各个过程(函数)间调用关系的一种描述,通常以多叉树的形式表达。
32.动态调用树:指程序动态运行过程各函数调用关系构成的调用树。
33.pc值:program counter值,用于表示程序某一时刻所执行指令的位置。
34.用户函数主入口:指程序中由用户进行编码的函数的入口,如c程序中的main函数等。
35.libbfd:bfd(binary format descriptor),即二进制文件格式描述符,它是链接工具(ld)和二进制操作工具(bin-util)实现对二进制目标文件操作的标准接口,libbfd是实现bfd的接口的库,本发明中可以用来实现pc值转化为函数名。
36.上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明
精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献