当前位置: 首页 > 专利查询>南京大学专利>正文

无痕可管理的源代码自动插桩方法技术

技术编号:6803713 阅读:355 留言:0更新日期:2012-04-11 18:40
一种无痕可管理的源代码自动插桩方法,步骤包括:40:开始,打开一个工程;41:定义一个文件过滤器,对所需插桩的工程进行匹配,保留匹配的工程;42:接着使用所述文件过滤器对被插桩的源文件进行过滤;43:选择自动插桩的具体应用类型,定义相应类型所需插桩的代码;44:用语法树结构匹配,根据自动插桩的具体应用类型进行相应插桩点的位置定位,并在相应位置插入代码,生成一个新源文件;45:所述新源文件进行编译产生新的可执行字节码文件,并保存;46:生成可执行文件,结束。本方法主要特点为插桩代码可视化、集中管理插入代码、插桩过程无痕化、插桩点自动化定位、自动插桩可扩展、自动插桩高效性。

【技术实现步骤摘要】

本专利技术涉及计算机程序动态分析,主要涉及一种无痕可管理的源代码插桩方法。 该方法包括插桩点可视化、插桩点管理、插桩点定位、自动插桩框架、自动插桩性能优化五个部分。
技术介绍
程序分析通常利用静态程序分析和动态程序分析对程序行为进行自动分析,进而提高软件质量。动态程序分析常借助于插桩方法来收集程序动态运行行为,某些与运行环境相关的程序行为只能通过插桩来收集,而静态程序分析无法进行分析。软件开发过程中, 代码审查者在代码编写阶段完成后使用源代码插桩方法对代码进行审查,通常审查者拥有阅读源代码权限但不便对代码进行修改。通过对程序运行行为的分析尽早发现代码中的错误,进而提高软件质量。源代码插桩能够充分地利用程序语义、可视化地显示插桩代码、并且不会提高代码逻辑复杂性。程序插桩技术,是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针,通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。由于程序插桩技术是在被测程序中插入探针,然后通过探针的执行来获得程序的控制流和数据流信息,以此来实现测试的目的。因此,根据探针插入的时间可以分为目标代码插桩和源代码插桩。现有插桩方法主要包括断言机制、字节码插桩、面向方面插桩等三类方法。断言机制直接在写源文件中添加插桩代码,将会降低代码阅读性。字节码插桩则直接对字节码文件进行修改,被插字节码的源代码无法可视化,且无法保证代码插入过程的正确性。面向方面插桩在程序纵向继承关系的基础上增加了横向方面关系,增加了程序的逻辑复杂性。目前插桩技术主要存在插桩点及其代码可视化、被插代码管理、插桩点自动定位、 自动插桩性能较低的问题。
技术实现思路
鉴于上述问题,本专利技术旨在提供一个源代码插桩方法,该方法不仅支持手动插桩, 并且支持批量自动插桩。其主要特点有插桩代码可视化、插入代码集中管理、插桩过程无痕化、插桩点自动化定位、自动插桩可扩展性和自动插桩高效性。本专利技术是通过以下技术方案实现的一种,步骤包括步骤40 开始,打开一个工程;步骤41 定义一个文件过滤器,对所需插桩的工程进行匹配,保留匹配的工程;步骤42 接着使用所述文件过滤器对被插桩的源文件进行过滤;步骤43 选择自动插桩的具体应用类型,定义相应类型所需插桩的代码;步骤44 用语法树结构匹配,根据自动插桩的具体应用类型进行相应插桩点的位置定位,并在相应位置插入代码,生成一个新源文件;步骤45 所述新源文件进行编译产生新的可执行字节码文件,并保存;步骤46 生成可执行文件,结束。本自动插桩方法提供了元插桩类型重用框架,包括元插桩操作组合器和元插桩类型池,其中,元插桩类型池包括多个元插桩类型,并且支持添加新的元插桩类型;元插桩操作组合器将多个元插桩类型组合到一起,通过遍历一次语法树完成在语法树上多种类型的插桩操作;所述元插桩类型支持对不同类型插桩进行插桩,且每一个元插桩类型只能针对某一类型元插桩进行插桩。所述步骤41中,对所需插桩的工程进行匹配,包括匹配工程中的包、文件、和方法。所述步骤42中,所述源文件过滤的步骤包括步骤60 开始源文件过滤是对某一工作空间所有源文件进行过滤;步骤61 先判断该工作空间是否包含其它工程,如没有则跳转到步骤64,若有则进入步骤62 ;步骤62 匹配工程名,如果匹配则进入步骤63,如果不匹配则返回步骤61继续查看是否有下一个工程;步骤63 如果工程名匹配,说明该工程需要进行插桩,将其添加到插桩工程集合中,然后跳回至步骤61 ;步骤64 进行包的过滤,先判断工程集合中的工程是否包含其它包(此处其它包的说明Java工程中包括多个package,逐个包进行过滤,看看还有没有其它包没有进行过滤。包是指java语言中package的概念),如没有则跳转到步骤67开始进行文件的过滤, 若有则进入步骤65 ;步骤65 匹配包名,若匹配则进入步骤66,若不匹配则回到步骤64继续查看是否有下一个包;步骤66 匹配包名,若相匹配,说明该包需要进行插桩,将其添加到插桩包集合中,然后跳回至步骤64;步骤67 判断包集合中的包是否包含其它源文件,如果没有则跳转到步骤6b,如果有则进入步骤68 ;步骤68 匹配源文件名,若匹配则进入步骤69对方法进行匹配,否则跳回至步骤 67 ;步骤69 匹配方法,若匹配则进入步骤6a,否则跳回至步骤67 ;步骤6a 将匹配的源文件添加到文件匹配集合;步骤6b 对工程中所有工程名、包名、文件名和方法名进行匹配后并完成对文件的过滤操作。所述步骤62中,匹配工程名,是将工程名与工程名正则表达式进行匹配;所述步骤65中,匹配包名,是将包名与包名正则表达式进行匹配;所述步骤66中,匹配包名,是将包名与包名正则表达式进行匹配;所述步骤68中,匹配源文件名,是将源文件名与源文件名正则表达式进行匹配;所述步骤69中,匹配方法,是将源文件中的方法的方法名与方法名正则表达式进行匹配。所述步骤44中,通过语法树匹配可实现插桩定位,该部分使用visitor模式进行匹配,语法树匹配并插入代码的步骤包括步骤70 开始对源文件进行插桩是逐个文件进行操作的,然后根据不同插桩类型进行插桩;插桩类型包括方法、IF分支、Switch分支、While分支、Do-while分支和For 分支类型;步骤71 查看是否还有下一个源文件,如果没有则进入步骤几,结束;如果有则进入步骤72 ;步骤72 先把源文件编译成语法树,再以Visitor模式访问各个节点,Visitor模型下几种插桩类型的操作步骤如下步骤73 首先判断语法树是否有下一个节点;步骤74 根据所选插桩类型判断是否包含方法类型,若包含并且该结点是方法体结点,则进入步骤75,否则跳转到步骤76 ;步骤75 将事先由分析人员所定义的方法类型插桩代码插入到抽象语法树中的相应节点;步骤76 根据所选插桩类型判断是否包含IF分支类型,若包含并且该结点是IF 分支结点,则进入步骤77,否则跳转到步骤78 ;步骤77 将事先由分析人员所定义的IF分支类型插桩代码插入到抽象语法树中的相应节点;步骤78 根据所选插桩类型判断是否包含Switch分支类型,若包含并且该结点是 Switch分支结点,则进入步骤79,否则跳转到步骤7a ;步骤79 将事先由分析人员所定义的Switch分支类型插桩代码插入到抽象语法树中的相应节点;步骤7a 根据所选插桩类型判断是否包含While分支类型,若包含并且该结点是 While分支结点,则进入步骤7b,否则跳转到步骤7a ;步骤7b 将事先由分析人员所定义的While分支类型插桩代码插入到抽象语法树中的相应节点;步骤7c 根据所选插桩类型判断是否包含Do-While分支类型,若包含并且该结点是Do-Whi Ie分支结点,则进入步骤7d,否则跳转到步骤7a ;步骤7d 将事先由分析人员所定义的Do-While分支类型插桩代码插入到抽象语法树中的相应节点;步骤7e:根据所选插桩类型判断是否包含分支类型,若包含并且该结点是分支结点,则进入步骤7f,否则跳转到步骤7a ;步骤7f 将事先由分析人员所定义的For分支类型插桩代码插入到抽象语法树中的相应节点;步骤7g 完成语法树插本文档来自技高网
...

【技术保护点】
1.一种无痕可管理的源代码自动插桩方法,其特征是步骤包括:步骤40:开始,打开一个工程;步骤41:定义一个文件过滤器,对所需插桩的工程进行匹配,保留匹配的工程;步骤42:接着使用所述文件过滤器对被插桩的源文件进行过滤;步骤43:选择自动插桩的具体应用类型,定义相应类型所需插桩的代码;步骤44:用语法树结构匹配,根据自动插桩的具体应用类型进行相应插桩点的位置定位,并在相应位置插入代码,生成一个新源文件;步骤45:所述新源文件进行编译产生新的可执行字节码文件,并保存;步骤46:生成可执行文件,结束。

【技术特征摘要】

【专利技术属性】
技术研发人员:张天陈华杰
申请(专利权)人:南京大学
类型:发明
国别省市:84

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

1