CN103744678A - 基于寄存器传输语言确定静态函数调用关系的方法 - Google Patents
基于寄存器传输语言确定静态函数调用关系的方法 Download PDFInfo
- Publication number
- CN103744678A CN103744678A CN201410016117.9A CN201410016117A CN103744678A CN 103744678 A CN103744678 A CN 103744678A CN 201410016117 A CN201410016117 A CN 201410016117A CN 103744678 A CN103744678 A CN 103744678A
- Authority
- CN
- China
- Prior art keywords
- function
- file
- call
- program
- source files
- 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
Links
Images
Abstract
本发明公开一种基于寄存器传输语言确定静态函数调用关系的方法,主要为了提供一种能够清楚的描述软件系统中函数、文件、模块间的函数调用关系。本发明所述方法包括:将源代码编译过程中生成的编译中间结果,以寄存器传输文件的形式进行转存,基于所述编译中间结果得到函数调用关系文件;依据所述函数调用关系文件,以函数、文件或者模块为节点,以他们之间函数调用的次数为边,生成函数间、文件间或模块间的函数调用图来描述所述函数调用关系;和依据所述函数调用关系文件,生成函数调用关系列表来描述所述函数调用关系。
Description
技术领域
本发明涉及函数调用技术领域,具体设计一种基于寄存器传输语言确定静态函数调用关系的方法。
背景技术
随着源代码规模的扩大,单纯依靠手工阅读和分析源代码不仅效率低下,而且很难很快的了解整个源代码的结构和控制流程。因此,如何依靠软件工具和方法分析源代码变得越来越重要。
函数调用图是一种有向图,是对程序中函数调用关系的一种静态描述。在现有技术生成的函数调用图中,节点表示函数,有向边表示函数之间的调用与被调用关系。通过观察以函数为节点的函数调用关系图,人们可以方便地看出函数之间的调用关系;通过观察以文件或目录为节点的函数调用关系图,人们可以对大型程序或工程的体系结构有更加清晰的认识。
目前存在的函数调用图生成工具,要么只可以生成以函数为节点的函数调用图,不可以分析源代码程序模块间的关系;要么以源代码为基础生成函数调用关系图形,不能对.S文件进行分析;要么工具安装使用起来都比较复杂。在分析一些大型源代码工程,例如Linux内核源代码时,由于Linux源代码规模较大,而且更多的时候分析的是模块间的函数调用关系,和平台有关的.S文件,而且希望应用起来比较方便。这些要求对于现有的函数调用图生成工具都是达不到的。
发明内容
针对上述问题,本发明提供一种函数调用关系清晰,能够对多种文件的函数调用关系进行分析的基于寄存器传输语言确定静态函数调用关系的方法及装置。
为达到上述目的,本发明基于寄存器传输语言确定静态函数调用关系的方法,所述方法包括:
将源程序文件编译过程中产生的中间表示文件以寄存器传输语言的文件格式作为中间结果进行输出、转存;
对所述中间结果进行分析,得到各级目录的内部和外部调用函数关系文件;
基于所述各级目录的内部和外部调用函数关系文件,生成以函数、文件、模块为节点,以所述的函数、文件、模块之间的函数调用的次数为边的函数调用关系图来描述静态函数调用关系;
和/或基于所述各级目录的内部和外部调用函数关系文件,生成函数、文件、模块之间的函数调用关系列表来描述静态函数调用关系。
进一步地,所述方法还包括对生成的函数调用关系图和/或函数调用关系列表进行存储和显示的步骤。
具体地,所述函数调用图的生成方法具体包括步骤:
S1将第n级目录下的源程序文件W编译过程中得到中间表示文件以寄存器传输语言的文件格式作为中间结果进行输出、转存,其中所述中间结果包括所述源程序文件W的函数定义文件和函数调用信息文件;
S2对所述中间结果进行分析,将所述源程序文件W中所有定义的函数名写入同一文件,生成所述源程序文件W的定义函数名列表文件W1;
将所述函数调用信息文件中的被调用函数的函数名写入同一文件,形成所述源程序文件W的被调用函数名列表文件W2;
S3将所述定义函数名列表文件W1中的函数名和所述被调用函数名列表文件W2中的函数名进行匹配,
若函数名相匹配,则生成文件W的内部函数调用关系文件W3;
若函数名不匹配,则将所述被调用函数列表文件W2中的被调用函数的函数名和所述被调用函数对应的所述定义函数名列表文件W1中的调用函数的函数名写入同一文件,生成生成源程序文件W的外部函数调用关系文件W4,并将不匹配的被调用函数写入同一文件,生成源程序文件W的未定义函数列表文件W5;
S4对第n级目录下的每个源程序文件重复上述步骤S1至S3;
S5将第n级目录下所有的定义的函数名列表写入同一文件中,形成n级目录的定义函数名列表n1;
将n级目录下所有的未定义函数名列表文件中的函数名写入同一文件,形成第n级目录的未定义函数名列表文件n2;
S6将所述定义函数名列表文件n1中的函数名和所述未定义函数名列表文件n2中的函数名进行匹配,
若函数名相匹配,则生成第n级目录的内部函数调用关系文件n3;
若函数名不匹配,则将所述未定义函数名列表文件n2中的函数名和所述未定义函数名对应的所述定义函数名列表文件n1中的调用函数的函数名写入同一文件,生成生成第n级目录的的外部函数调用关系文件n4,并将不匹配的被调用函数写入同一文件,生成第n级目录的未定义函数列表文件n5;
重复上述步骤直至根目录,将根目录下的未定义函数名列表文件的函数名和根目录下的定义函数名列表文件中的函数名进行匹配,并生成根目录下的内部调用函数文件;
基于上述各级目录的内部函数调用和外部函数调用关系文件,生成以函数、文件、模块为节点,以他们之间的调用次数为边的函数调用图。
具体地,所述函数调用关系列表的生成包括步骤:
S1将第n级目录下的源程序文件编译过程中得到中间表示文件以寄存器传输语言的文件格式作为中间结果进行输出、转存,其中所述中间结果包括所述源程序文件的函数定义文件和函数调用信息文件;
S2对第n级目录下的源程序文件A的函数定义文件和函数调用文件进行分析,得到源程序文件A的内部函数调用列表文件,以及生成源程序文件A的未定义的被调用函数列表文件;
S3在第n级目录下,查找是否存在远程序文件B,所述源程序文件B的定义函数的定义路径和所述源程序文件A的未定义的被调用函数列表的定义路径a相同,
若存在,则生成源程序文件A对源程序文件B的调用列表,相应函数调用次数增加1,判断第n级目录下的函数调用信息文件中是否包含函数定义路径a,若已定义,则不作处理;若没有定义,则将被调用函数相关信息增加到第n级目录下的函数调用信息文件中;
若不存在,则在第n级目录的上层目录第n-1级目录下查找是否存源程序文件的定义路径与所述源程序A内未定义的被调用函数定义路径a相同,
若查找到,则生成相应的调用关系列表,相应的函数调用次数增加1;
若查找不到,则在第n-2级目录下查找,逐级向上层目录查找直至生成相应的函数调用关系列表文件。
本发明基于寄存器传输语言确定静态函数调用关系的方法,通过使用源程序在编译生成目标程序过程中产生的表示文件以寄存器传输语言的文件格式作为中间结果进行输出、转存,所述中间结果内包含了每个源程序文件的函数定义文件和函数调用信息文件,对中间结果进行分析可以得到每个源程序文件的内部调用函数关系和外部函数调用关系,对于外部函数调用关系,通过该源程序文件所在目录的上层目标进行分析,查找上层目录的内部函数调用关系和外部函数调用关系,解析出各级目录的内部和外部函数调用关系,以此得到函数、文件、目录之间的函数调用关系,生成以目录或者文件为节点的函数调用关系图或和调用关系列表,使用户能够清楚的了解模块间的函数调用关系,同时能够对中间汇编语言的函数调用清楚的描述。
相较于现有技术,仅仅只能描述出函数和函数之间的调用关系,本发明更加清楚的描述了整个源程序系统的函数调用关系。
附图说明
图1是本发明基于寄存器传输语言确定静态函数调用关系的方法的流程图。
具体实施方式
下面结合说明书附图对本发明做进一步的描述。
如图1所示,本发明涉及一种基于寄存器传送语言(Register TransferLanguage,RTL)的函数调用图生成方法,并根据该方法实现了一个生成各级目录间函数调用图的工具CG-RTL(call graph based on RTL,简称为CG-RTL),属于软件工程领域,也属于源代码分析领域。
首先为数据的预处理阶段,该阶段包括将源代码编译生成目标程序,将此过程中的编译中间结果进行分析处理生成关系文件,所述关系文件也即各级目录的内部调用函数关系文件和外部调用函数关系文件,基于所述函数预处理过程生成的关系文件,生成相应的函数调用图和函数调用关系列表,利用浏览器对生成的函数调用关系图和函数调用关系列表进行显示,并利用HTML缓存机制对函数调用关系图和函数调用关系列表进行存储。
本发明基于寄存器传输语言确定静态函数调用关系的方法,所述方法包括:
将源程序文件编译过程中产生的中间表示文件以寄存器传输语言的文件格式作为中间结果进行输出、转存;
对所述中间结果进行分析,得到各级目录的内部和外部调用函数关系文件;
基于所述各级目录的内部和外部调用函数关系文件,生成以函数、文件、模块为节点,以所述的函数、文件、模块之间的函数调用的次数为边的函数调用关系图来描述静态函数调用关系;
和/或基于所述各级目录的内部和外部调用函数关系文件,生成函数、文件、模块之间的函数调用关系列表来描述静态函数调用关系。
在具体实施中,源代码经编译器编译得到目标程序的过程中会产生中间表示文件,将中间表示文件以寄存器传输语言的文件格式进行输出、转存。例如,在源代码编译时由于编译时增加编译选项-fdump-rtl-sched2不能保证函数定义的准确性,在对应的编译命令行的适当位置增加了编译选项-aux-info,可以生成.c文件之间的函数调用关系,另外还可以通过增加编译选项-Wa,-adhlns,使得可以生成.S文件的函数调用关系。基于不同的编译选项可以得到不同类型文件的函数调用关系。同时在不同的操作系统中的编译选项各不相同,根据具体的操作系统选择合适的编译选项将源代码编译过程中的中间表示文件以寄存器传输语言的文件格式作为中间结果输出。
对于生成函数调用关系图的具体方法包括:
S1将第n级目录下的源程序文件W编译过程中得到中间表示文件以寄存器传输语言的文件格式作为中间结果进行输出、转存,其中所述中间结果包括所述源程序文件W的函数定义文件Z1和函数调用信息文件Z2;
S2对所述源程序文件W的函数定义文件Z1和函数调用信息文件Z2进行分析,将所述源程序文件W中带有指定标示的函数名写入同一文件,生成所述源程序文件W的定义函数名列表文件W1;
将所述函数调用信息文件Z2中的被调用函数的函数名写入同一文件,形成所述源程序文件W的被调用函数名列表文件W2;
S3将所述定义函数名列表文件W1中的函数名和所述被调用函数名列表文件W2中的函数名进行匹配,
若函数名相匹配,则生成文件W的内部函数调用关系文件W3;
若函数名不匹配,则将所述被调用函数列表文件W2中的函数名和所述函数名对应的所述定义函数名列表文件W1中的函数名写入同一文件,生成源程序文件W的外部函数调用关系文件W4,并将不匹配的被调用函数的函数名写入同一文件,生成源程序文件W的未定义函数名列表文件W5;
S4对第n级目录下的每个源程序文件重复上述步骤S1至S3,得到第n级目录下所有源程序文件的内部调用函数关系和外部函数调用关系;
S5将第n级目录下所有的定义的函数名列表写入同一文件中,形成n级目录的定义函数名列表n1;
将n级目录下所有的未定义函数名列表文件中的函数名写入同一文件,形成第n级目录的未定义函数名列表文件n2;
S6将所述定义函数名列表文件n1中的函数名和所述未定义函数名列表文件n2中的函数名进行匹配,
若函数名相匹配,则生成第n级目录的内部函数调用关系文件n3;
若函数名不匹配,则将所述未定义函数名列表文件n2中的函数名和所述未定义函数名对应的所述定义函数名列表文件n1中的调用函数的函数名写入同一文件,生成生成第n级目录的的外部函数调用关系文件n4,并将不匹配的被调用函数写入同一文件,生成第n级目录的未定义函数列表文件n5;此时生成的第n级目录的内部函数调用关系文件也即不同文件之间或者不同函数与不同文件之间的函数调用关系,这些文件还同属于一个目录下;
重复上述步骤直至根目录,将根目录下的未定义函数名列表文件的函数名和根目录下的定义函数名列表文件中的函数名进行匹配,并生成根目录下的内部调用函数文件;
基于上述各级目录的内部函数调用和外部函数调用关系文件,生成以函数、文件、各级目录为节点,以他们之间的调用次数为边的函数调用图。
上述步骤S2中所述的对单个源程序文件内部调用函数关系和外部调用函数关系加以区分,此时建立的源程序文件W的内部调用函数关系也即源程序文件W内的函数和函数之间的调用关系;对于源程序文件W的未定义函数也既源程序文件W的外部调用函数,该外部调用函数在源程序文件M中存在定义,若该源程序文件M和所述源程序文件同在第n级目录下,则进行步骤S6至S6时,源程序文件W对源程序文件M的调用为第n级目录的内部调用函数关系,此时可以得知函数和函数之间的调用关系,以及文件和文件间之间的调用关系;若该源程序文件M和所述源程序文件不再同一目录下,所述远程文件M在第n-1层目录下,在对第n-1级目录分析内部调用函数关系文件和外部调用函数关系文件时,可以得到,函数、文件、第n级目录和第n-1级目录,9种调用关系。
对于各级目录下的内部函数调用关系文件,对于两个函数的调用路径通过函数调用信息文件的得到。
对于每个源程序文件的中间结果包括的函数定义文件和函数调用信息采用字符串处理能力很强的Ruby语言来对其进行分析处理,以获取单个源程序文件内的函数定义和相互调用关系。接着,对单个源文件中对内和对外的函数调用加以区分,进而得出不同文件和各级目录间的函数调用关系。为了提取函数定义和调用信息,需要了解RTL语言的一些约定。在函数定义文件中,首先对函数定义进行声明,在定义声明之后的第一个insn或者insn/f指令内容为定义函数的具体信息说明,而call_insn指令的内容为调用函数信息的具体说明。生成源程序内部函数调用关系文件具体算法如下:
假设函数定义的节点数组为fun_node、函数调用的节点数组为call_line,其中每个fun_node节点都有对应的call_line节点。
首先,对于每个文件生成关系文件算法如下:
上述算法对每个函数定义文件进行逐行扫描,每一个block包含文件中一个函数的定义文件或调用函数信息文件。在取函数定义信息时,若函数在函数调用信息文件中存在定义则取函数调用信息文件中函数定义位置,否则不取。接着,对每个目录生成相对应的定义函数名列表文件、未定义函数名列表文件和外部调用函数关系文件、内部调用函数关系文件。
本实施例的函数调用图是带边权的有向图,其中边的起点和终点分别表示函数的调用者以及被调用函数定义所在的目录或文件,边权表示调用次数。生成函数调用图的过程主要包括两大部分:第一部分生成满足画图工具Graphviz格式要求的文本文件;第二部分调用Graphviz工具中的dot画出svg格式的函数调用。下面主要对第一部分做详细的描述。具体步骤如下:
生成满足Graphviz格式要求的文件
依据给定的目录确定内部和外部节点,并把它们分别存放在不同的数组中同时对每个节点编号;
给总的函数定义列表标注各个函数所在节点编号;
按节点N1读取对应外部函数调用关系文件,仅提取函数调用信息并在函数定义列表中查找该函数所以在节点N2;
若N1指向N2的有向边已经存在则相应的计数加1,否则创建了一条N1指向N2的一条有向边并计为1;
根据节点编号和边计数输出Graphviz要求的格式。
使用Graphviz工具和生成的数据,就可以画出需要的函数调用图,使用不同颜色的节点来标识目录内部节点和目录外部节点,从而达到了区别目录内节点间函数的调用关系和目录外的函数调用关系;用不同颜色的边来表示目录内节点间函数调用关系和对外目录的函数调用关系。其中,边的颜色可以分为以下两类:1)每个目录内部节点相互调用使用同种颜色,不同的目录颜色不同;2)内部节点和外部节点的调用分别使用两种颜色。
相较于函数调用图对于系统架构的直观显示,函数调用关系列表对于目录间的函数调用关系有着更加细致的描述。用户既可以点击CG-RTL所生成的函数调用图上的边来得到对应的函数调用关系列表,还能利用watch function生成函数调用关系列表。
S1将第n级目录下的源程序文件编译过程中得到中间表示文件以寄存器传输语言的文件格式作为中间结果进行输出、转存,其中所述中间结果包括所述源程序文件的函数定义文件和函数调用信息文件;
S2对第n级目录下的源程序文件A的函数定义文件和函数调用文件进行分析,得到源程序文件A的内部函数调用列表文件,以及生成源程序文件A的未定义的被调用函数列表文件;
S3在第n级目录下,查找是否存在远程序文件B,所述源程序文件B的定义函数的定义路径和所述源程序文件A的未定义的被调用函数列表的定义路径a相同,
具体地,所述函数调用关系列表的生成包括步骤:
S1将第n级目录下的源程序文件编译过程中得到中间表示文件以寄存器传输语言的文件格式作为中间结果进行输出、转存,其中所述中间结果包括所述源程序文件的函数定义文件和函数调用信息文件;
S2对第n级目录下的源程序文件A的函数定义文件和函数调用文件进行分析,得到源程序文件A的内部函数调用列表文件,以及生成源程序文件A的未定义的被调用函数列表文件;
S3在第n级目录下,查找是否存在远程序文件B,所述源程序文件B的定义函数的定义路径和所述源程序文件A的未定义的被调用函数列表的定义路径a相同,
若存在,则生成源程序文件A对源程序文件B的调用列表,相应函数调用次数增加1,判断第n级目录下的函数调用信息文件中是否包含函数定义路径a,若已定义,则不作处理;若没有定义,则将被调用函数相关信息增加到第n级目录下的函数调用信息文件中;
若不存在,则在第n级目录的上层目录第n-1级目录下查找是否存源程序文件的定义路径与所述源程序A内未定义的被调用函数定义路径a相同,
若查找到,则生成相应的调用关系列表,相应的函数调用次数增加1;
若查找不到,则在第n-2级目录下查找,逐级向上层目录查找直至生成相应的函数调用关系列表文件。
通过上述步骤分别生成函数、文件、各级目录之间的调用关系列表文件,函数、文件、第n级目录和第n-1级目录,9种调用关系列表文件。
下面对函数调用关系列表的生成算法进行详述:
若生成模块A对模块B的函数调用关系列表,则假设在模块A内未被定义的被调用函数定义路径为a,模块B定义路径为b,模块A调用模块B函数总的函数的数目为m,总的调用次数为n,key为被调用函数信息数组,
若被调用函数定义路径a与模块B定义路径b相同,则代表A模块调用B模块的函数,调用次数加1,并且在没有把a代表的被调用函数信息写入key数组的情况下写入key数组,被调用函数个数数量加1.重复上述步骤直到整个sched2文件读取完毕。
为了将函数调用图和源代码浏览结合成一个有机的整体,方便在源代码分析过程中灵活使用函数调用图生成工具,因此我们把生成函数调用图的功能加入到了LXR的Web服务中去。
首先,我们需要安装LXR的服务器,以及它所依赖的flex、glimpse和apache2等工具包,然后在LXR的基础框架上增加call graph和watch function等新功能选项.call graph功能是指用户通过Web页面输入要分析的一个或多个模块,CG-RTL会生成对应的函数调用图。watch function功能是指显示函数调用图中任何一条边所对应的两个模块间的具体函数调用信息。鉴于生成函数调用图的时间较长,CG-RTL从应用角度和服务角度来增强了用户的使用体验。从应用的角度出发,CG-RTL会自动存储已经生成过的函数调用图,之后再次用到同一张关系图时直接拿来用即可,无需再次生成;从服务的角度出发,CG-RTL使用了HTML5的离线缓存机制,使得用户在没有网络连接的情况下,仍然可以查看之前浏览过的关系图和页面。
所述方法具体运行过程如下:
1.安装lxr需要的支持环境:脚本语言支持ruby、perl以及画图工具graphviz
2.安装apache2服务器
3.安装glimplse
首先查看机器上是否安装flex,如果没有先进行:
#sudo apt-get install flex;
4.下载最新版本glimplse
#wget http://webglimpse.net/trial/glimpse-latest.tar.gz
5.接下来安装lxr
在usr/local/share/lxr/http下新建.htaccess文件(主要是让各个脚本起作用)
增加内容:
重新启动apache2
6.建立资源索引,并且修改可读属性
首先创建/usr/local/share/lxr/source/linux-3.5.4/code/linux目录
然后在/usr/local/share/lxr/source/linux-3.5.4/code目录下创建linux符号连接:
#ln-s/usr/src/linux-3.5.4/usr/local/share/lxr/source/linux-3.5.4/code/linux(把本地的内核源码连接到lxr目录下)
#cd/usr/local/share/lxr/source/linux-3.5.4/code
#sudo genxref linux //在当前目录生成fileidx和xref
7.创建web页面相关标签
创建/usr/local/share/lxr/source/versions文件,(这里记录所有要看的版本)内容是:linux-3.5.4
创建/usr/local/share/lxr/source/defversion文件,(这里记录缺省要看的版本)内容是:linux-3.5.4
8.修改lxr.conf
所有涉及的安装路径的地方均需要修改为当前机器所指(具体到这些文件所在的全路径)
9.增加callgraph(函数调用关系图),wacth function(函数调用关系列表)等功能
(1)在/usr/local/share/lxr/http下创建callgraph文件,内容为perl语言的脚本,具体内容见附件:callgraph(作用:构建web页面,并让函数调用图生成脚本运行)
(2)修改/usr/local/share/lxr/http/.htaccess下<Files~(search|source|ident|diff|find)>为<Files~(search|source|ident|diff|find|callgraph)>复制脚本callgraphweb.rb(作用:函数调用关系图生成脚本)到/usr/local/share/lxr/http下。
(3)用附件中的Common.pm(作用:web支持需要)直接替换原来/usr/local/share/lxr/http/lib/LXR/下的Common.pm文件。
至此callgraph基本框架就出来了,如图:
10.创建中间结果目录
对不同的平台使用的中间结果不同,下面以其中一种平台i386为例,其余可见附件。
10.1A.下载内核源码,并复制到/usr/local/share/lxr/source/linux-3.5.4/code/从github下载源码,提供了3.5.4内核源码,中间包含参与者对源码的注释。首次下载代码使用:
git init
git clone
https://twdong:twdong5609github.com/xyongcn/Kernel3.5.4Analysis.git
已经下载过,再次跟github同步:
git checkout
https://twdong:twdong5609github.com/xyongcn/Kernel3.5.4Analysis.git
B.也可用自己的源码,如第6步提到的在目录../code/linux
10.2编译前准备(注:脚本具体所在位置:附件——20130701-run)
复制需要的脚本call_graph.rb,auto_run.rb,little.rb,Makefile到你的内核源码所在目录中(找到脚本所在具体路径来复制)例如:
cp call_graph.rb/usr/local/share/lxr/source/linux-3.5.4/code/linux/call_graph.rb
10.3编译并生成调用图用中间结果
cd/usr/local/share/lxr/source/linux-3.5.4/code/linux/(进入源码所在目录)
删除原有的中间结果(如果之前未编译,可不用执行)
find/usr/local/share/lxr/source/linux-3.5.4/code/linux–name“*.sched2”|xargs rm
find/usr/local/share/lxr/source/linux-3.5.4/code/linux–name“*.exapnd”|xargsrm
find/usr/local/share/lxr/source/linux-3.5.4/code/linux–name“*.aux_info”|xargsrm
make mrproper (清除原有编译结果)
make clean
make i386_defconfig (编译需要的配置文件)
make>makeinfo.txt (编译选项全部内容)
./auto_run.rb makeinfo.txt re_compiler.sh (新建需要编译的选项的文件)
./re_compiler.sh>goldfish_s.txt (重新编译,并生成goldfish_s.txt文件)
chmod+x call_graph.rb (修改权限)
$source=/usr/local/share/lxr/source/linux-3.5.4/code(指定生成中间结果的路径)
$depath=/usr/local/share/lxr/source/temp/linux-3.5.4-i386
./call_graph.rb-1$source-w$depath(获取生成我们需要的中间结果,source,depath,替换成具体路径就可以了,先建好temp等文件夹。./call_graph.rb-1/usr/local/share/lxr/source/linux-3.5.4/code-w/usr/local/share/lxr/source/temp/linux-3.5.4-i386)
rm-rf/usr/local/share/lxr/source/linux-3.5.4/i386(删除原有的文件夹,如果没有可以不用执行)
mkdir/usr/local/share/lxr/source/linux-3.5.4/i386
cp-a/usr/local/share/lxr/source/temp/linux-3.5.4-i386/usr/local/share/lxr/source/linux-3.5.4/i386(复制中间结果到i386中)
chmod777-R/usr/local/share/lxr/source/linux-3.5.4/i386(修改权限)
cd/usr/local/share/lxr/source/linux-3.5.4/i386
genxref linux
glimpseindex-H/usr/local/share/lxr/source/linux-3.5.4/i386/usr/local/share/lxr/source/linux-3.5.4/i386/linux
chmod777-R/usr/local/share/lxr/source/linux-3.5.4/i386
至此服务应该可以正常工作了。
打开浏览器输入http://localhost/lxr/http/callgraph,在path0中输入*得到的图。
以上,仅为本发明的较佳实施例,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求所界定的保护范围为准。
Claims (4)
1.一种基于寄存器传输语言确定静态函数调用关系的方法,其特征在于,所述方法包括:
将源程序文件编译过程中产生的中间表示文件以寄存器传输语言的文件格式作为中间结果进行输出、转存;
对所述中间结果进行分析,得到各级目录的内部和外部调用函数关系文件;
基于所述各级目录的内部和外部调用函数关系文件,生成以函数、文件、模块为节点,以所述的函数、文件、各级目录之间的函数调用的次数为边的函数调用关系图来描述静态函数调用关系;
和/或基于所述各级目录的内部和外部调用函数关系文件,生成函数、文件、各级目录之间的函数调用关系列表来描述静态函数调用关系。
2.根据权利要求1所述的基于寄存器传输语言确定静态函数调用关系的方法,其特征在于:所述方法还包括对生成的函数调用关系图和/或函数调用关系列表进行存储和显示的步骤。
3.根据权利要求1所述的基于寄存器传输语言确定静态函数调用关系的方法,其特征在于:所述函数调用图的生成方法具体包括步骤:
S1将第n级目录下的源程序文件W编译过程中得到中间表示文件以寄存器传输语言的文件格式作为中间结果进行输出、转存,其中所述中间结果包括所述源程序文件W的函数定义文件Z1和函数调用信息文件Z2;
S2对所述源程序文件W的函数定义文件Z1和函数调用信息文件Z2进行分析,将所述源程序文件W中带有指定标示的函数名写入同一文件,生成所述源程序文件W的定义函数名列表文件W1;
将所述函数调用信息文件Z2中的被调用函数的函数名写入同一文件,形成所述源程序文件W的被调用函数名列表文件W2;
S3将所述定义函数名列表文件W1中的函数名和所述被调用函数名列表文件W2中的函数名进行匹配,
若函数名相匹配,则生成文件W的内部函数调用关系文件W3;
若函数名不匹配,则将所述被调用函数列表文件W2中的函数名和所述函数名对应的所述定义函数名列表文件W1中的函数名写入同一文件,生成源程序文件W的外部函数调用关系文件W4,并将不匹配的被调用函数的函数名写入同一文件,生成源程序文件W的未定义函数名列表文件W5;
S4对第n级目录下的每个源程序文件重复上述步骤S1至S3,得到每个源程序文件的定义函数名列表文件,未定义函数名列表文件、内部调用函数关系文件和外部函数关系调用文件;
S5将第n级目录下所有的定义函数名列表文件中的函数名写入同一文件中,形成n级目录的定义函数名列表文件n1;
将n级目录下所有的未定义函数名列表文件中的函数名写入同一文件,形成第n级目录的未定义函数名列表文件n2;
S6将所述定义函数名列表文件n1中的函数名和所述未定义函数名列表文件n2中的函数名进行匹配,
若函数名相匹配,则生成第n级目录的内部函数调用关系文件n3;
若函数名不匹配,则将所述未定义函数名列表文件n2中的函数名和所述未定义函数名列表文件n2中的函数名对应的所述定义函数名列表文件n1中的函数名写入同一文件,生成第n级目录的的外部函数调用关系文件n4,并将不匹配的被调用函数名写入同一文件,生成第n级目录的未定义函数名列表文件n5;
重复上述步骤直至根目录,将根目录下的未定义函数名列表文件的函数名和根目录下的定义函数名列表文件中的函数名进行匹配,并生成根目录下的内部调用函数文件;
基于上述各级目录的内部函数调用和外部函数调用关系文件,生成以函数、文件、各级目录为节点,以他们之间的调用次数为边的函数调用图。
4.根据权利要求1所述的基于寄存器传输语言确定静态函数调用关系的方法,其特征在于,所述函数调用关系列表的生成包括步骤:
S1将第n级目录下的源程序文件编译过程中得到中间表示文件以寄存器传输语言的文件格式作为中间结果进行输出、转存,其中所述中间结果包括所述源程序文件的函数定义文件和函数调用信息文件;
S2对第n级目录下的源程序文件A的函数定义文件和函数调用文件进行分析,得到源程序文件A的内部函数调用列表文件,以及生成源程序文件A的未定义的被调用函数列表文件;
S3在第n级目录下,查找是否存在源程序文件B,所述源程序文件B的定义函数的定义路径和所述源程序文件A的未定义的被调用函数列表的定义路径a相同,
若存在,则生成源程序文件A对源程序文件B的调用列表,相应函数调用次数增加1,判断第n级目录下的函数调用信息文件中是否包含函数定义路径a,若已定义,则不作处理;若没有定义,则将被调用函数相关信息增加到第n级目录下的函数调用信息文件中;
若不存在,则在第n级目录的上层目录第n-1级目录下查找是否存源程序文件的定义路径与所述源程序A内未定义的被调用函数定义路径a相同,
若查找到,则生成相应的调用关系列表,相应的函数调用次数增加1;
若查找不到,则在第n-2级目录下查找,逐级向上层目录查找直至生成相应的函数调用关系列表文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410016117.9A CN103744678B (zh) | 2014-01-14 | 2014-01-14 | 基于寄存器传输语言确定静态函数调用关系的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410016117.9A CN103744678B (zh) | 2014-01-14 | 2014-01-14 | 基于寄存器传输语言确定静态函数调用关系的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103744678A true CN103744678A (zh) | 2014-04-23 |
CN103744678B CN103744678B (zh) | 2017-05-03 |
Family
ID=50501698
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410016117.9A Expired - Fee Related CN103744678B (zh) | 2014-01-14 | 2014-01-14 | 基于寄存器传输语言确定静态函数调用关系的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103744678B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108228365A (zh) * | 2017-12-28 | 2018-06-29 | 杭州马猴烧韭科技有限公司 | 一种函数请求发送方法、函数请求调用方法及装置 |
CN109542942A (zh) * | 2018-11-28 | 2019-03-29 | 网易(杭州)网络有限公司 | 函数调用的查询方法及装置、电子设备 |
CN112596737A (zh) * | 2020-12-28 | 2021-04-02 | 上海品顺信息科技有限公司 | 一种函数调用关系的扫描方法、系统、设备及存储介质 |
TWI735511B (zh) * | 2017-01-19 | 2021-08-11 | 香港商斑馬智行網絡(香港)有限公司 | 代碼提交方法和設備 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7669193B1 (en) * | 2003-09-25 | 2010-02-23 | Lantronix, Inc. | Program transformation using flow-sensitive type constraint analysis |
CN102012833A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于编译过程中间结果的静态堆栈检测方法 |
-
2014
- 2014-01-14 CN CN201410016117.9A patent/CN103744678B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7669193B1 (en) * | 2003-09-25 | 2010-02-23 | Lantronix, Inc. | Program transformation using flow-sensitive type constraint analysis |
CN102012833A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于编译过程中间结果的静态堆栈检测方法 |
Non-Patent Citations (1)
Title |
---|
ANDREAS GUSTAFSSON: "egypt documentation", 《HTTP://WEB.ARCHIVE.ORG/WEB/20131016031011/HTTP://WWW.GSON.ORG/EGYPT/EGYPT.HTML#HOW_IT_WORKS》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TWI735511B (zh) * | 2017-01-19 | 2021-08-11 | 香港商斑馬智行網絡(香港)有限公司 | 代碼提交方法和設備 |
CN108228365A (zh) * | 2017-12-28 | 2018-06-29 | 杭州马猴烧韭科技有限公司 | 一种函数请求发送方法、函数请求调用方法及装置 |
CN108228365B (zh) * | 2017-12-28 | 2021-04-06 | 杭州马猴烧韭科技有限公司 | 一种函数请求发送方法、函数请求调用方法及装置 |
CN109542942A (zh) * | 2018-11-28 | 2019-03-29 | 网易(杭州)网络有限公司 | 函数调用的查询方法及装置、电子设备 |
CN109542942B (zh) * | 2018-11-28 | 2021-09-24 | 网易(杭州)网络有限公司 | 函数调用的查询方法及装置、电子设备 |
CN112596737A (zh) * | 2020-12-28 | 2021-04-02 | 上海品顺信息科技有限公司 | 一种函数调用关系的扫描方法、系统、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN103744678B (zh) | 2017-05-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
McKay et al. | Using the generic synteny browser (GBrowse_syn) | |
CN112364024B (zh) | 一种表数据批量自动比对的控制方法及装置 | |
CN103257852B (zh) | 一种分布式应用系统的开发环境搭建的方法和装置 | |
CN106649794A (zh) | 图片合成方法及装置 | |
CN103744678A (zh) | 基于寄存器传输语言确定静态函数调用关系的方法 | |
CN101866315A (zh) | 软件开发工具的测试方法及系统 | |
CN106843984A (zh) | 应用数据库的更新方法及装置 | |
Bondé et al. | Metamodels and MDA transformations for embedded systems | |
Bayer et al. | Design and development of a web-based EPANET model catalogue and execution environment | |
CN116107524B (zh) | 低代码应用日志处理方法、介质、装置和计算设备 | |
CN109725862A (zh) | 数据显示方法、装置、计算机设备及存储介质 | |
Howison et al. | BioLite, a Lightweight Bioinformatics Framework with Automated Tracking of Diagnostics and Provenance. | |
Le Zou et al. | On synchronizing with web service evolution | |
CN107577476A (zh) | 一种基于模块划分的安卓系统源码差异性分析方法、服务器及介质 | |
Zhang et al. | Research of web front-end engineering solution in public cultural service project | |
CN109086059A (zh) | 代码加载更新方法、装置及服务器 | |
CN106598839A (zh) | 一种面向目标代码的程序静态分析方法 | |
US9420052B2 (en) | Web navigation using web navigation pattern histories | |
JP3887550B2 (ja) | クロスリファレンス構築装置、クロスリファレンス構築方法及びクロスリファレンス構築用プログラム | |
CN108196853A (zh) | 用于部署安卓系统sdk的方法、存储介质、设备及系统 | |
Veisi et al. | AHL: model-driven engineering of android applications with BLE peripherals | |
Nam et al. | Automating the testing of object behaviour: a statechart-driven approach | |
Yong et al. | Data change analysis based on function call path | |
Thiede et al. | Augmenting Library Development by Mining Usage Data from Downstream Dependencies. | |
Lefebvre | WordPress Plugin Development Cookbook |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170503 Termination date: 20190114 |