CN102231109A - 无痕可管理的源代码自动插桩方法 - Google Patents
无痕可管理的源代码自动插桩方法 Download PDFInfo
- Publication number
- CN102231109A CN102231109A CN2011101985825A CN201110198582A CN102231109A CN 102231109 A CN102231109 A CN 102231109A CN 2011101985825 A CN2011101985825 A CN 2011101985825A CN 201110198582 A CN201110198582 A CN 201110198582A CN 102231109 A CN102231109 A CN 102231109A
- Authority
- CN
- China
- Prior art keywords
- pitching pile
- file
- pitching
- pile
- coupling
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 88
- 238000001914 filtration Methods 0.000 claims abstract description 7
- 230000008878 coupling Effects 0.000 claims description 49
- 238000010168 coupling process Methods 0.000 claims description 49
- 238000005859 coupling reaction Methods 0.000 claims description 49
- 230000014509 gene expression Effects 0.000 claims description 18
- 238000003780 insertion Methods 0.000 claims description 8
- 230000037431 insertion Effects 0.000 claims description 8
- 230000000295 complement effect Effects 0.000 claims description 7
- 230000009191 jumping Effects 0.000 claims description 6
- 238000010276 construction Methods 0.000 claims description 2
- 238000010586 diagram Methods 0.000 description 8
- 238000005516 engineering process Methods 0.000 description 6
- 239000000523 sample Substances 0.000 description 5
- 238000013461 design Methods 0.000 description 3
- 238000012800 visualization Methods 0.000 description 3
- 230000003068 static effect Effects 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 230000000007 visual effect Effects 0.000 description 2
- 238000004590 computer program Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
Images
Landscapes
- Stored Programmes (AREA)
Abstract
一种无痕可管理的源代码自动插桩方法,步骤包括:40:开始,打开一个工程;41:定义一个文件过滤器,对所需插桩的工程进行匹配,保留匹配的工程;42:接着使用所述文件过滤器对被插桩的源文件进行过滤;43:选择自动插桩的具体应用类型,定义相应类型所需插桩的代码;44:用语法树结构匹配,根据自动插桩的具体应用类型进行相应插桩点的位置定位,并在相应位置插入代码,生成一个新源文件;45:所述新源文件进行编译产生新的可执行字节码文件,并保存;46:生成可执行文件,结束。本方法主要特点为插桩代码可视化、集中管理插入代码、插桩过程无痕化、插桩点自动化定位、自动插桩可扩展、自动插桩高效性。
Description
技术领域
本发明涉及计算机程序动态分析,主要涉及一种无痕可管理的源代码插桩方法。该方法包括插桩点可视化、插桩点管理、插桩点定位、自动插桩框架、自动插桩性能优化五个部分。
背景技术
程序分析通常利用静态程序分析和动态程序分析对程序行为进行自动分析,进而提高软件质量。动态程序分析常借助于插桩方法来收集程序动态运行行为,某些与运行环境相关的程序行为只能通过插桩来收集,而静态程序分析无法进行分析。软件开发过程中,代码审查者在代码编写阶段完成后使用源代码插桩方法对代码进行审查,通常审查者拥有阅读源代码权限但不便对代码进行修改。通过对程序运行行为的分析尽早发现代码中的错误,进而提高软件质量。源代码插桩能够充分地利用程序语义、可视化地显示插桩代码、并且不会提高代码逻辑复杂性。
程序插桩技术,是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针,通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。由于程序插桩技术是在被测程序中插入探针,然后通过探针的执行来获得程序的控制流和数据流信息,以此来实现测试的目的。因此,根据探针插入的时间可以分为目标代码插桩和源代码插桩。
现有插桩方法主要包括断言机制、字节码插桩、面向方面插桩等三类方法。断言机制直接在写源文件中添加插桩代码,将会降低代码阅读性。字节码插桩则直接对字节码文件进行修改,被插字节码的源代码无法可视化,且无法保证代码插入过程的正确性。面向方面插桩在程序纵向继承关系的基础上增加了横向方面关系,增加了程序的逻辑复杂性。
目前插桩技术主要存在插桩点及其代码可视化、被插代码管理、插桩点自动定位、自动插桩性能较低的问题。
发明内容
鉴于上述问题,本发明旨在提供一个源代码插桩方法,该方法不仅支持手动插桩,并且支持批量自动插桩。其主要特点有插桩代码可视化、插入代码集中管理、插桩过程无痕化、插桩点自动化定位、自动插桩可扩展性和自动插桩高效性。
本发明是通过以下技术方案实现的:
一种无痕可管理的源代码自动插桩方法,步骤包括:
步骤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:查看是否还有下一个源文件,如果没有则进入步骤7h,结束;如果有则进入步骤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 le分支结点,则进入步骤7d,否则跳转到步骤7a;
步骤7d:将事先由分析人员所定义的Do-While分支类型插桩代码插入到抽象语法树中的相应节点;
步骤7e:根据所选插桩类型判断是否包含For分支类型,若包含并且该结点是For分支结点,则进入步骤7f,否则跳转到步骤7a;
步骤7f:将事先由分析人员所定义的For分支类型插桩代码插入到抽象语法树中的相应节点;
步骤7g:完成语法树插桩后,将语法树转换成源代码文件,然后进入步骤73对下一个源文件进行插桩;
步骤7h:完成了对所有文件的插桩插桩,整个过程结束。
本发明的自动插桩方案是针对某具体应用类型进行的,利用抽象语法树的结构匹配进行插桩点自动定位,插桩点自动定位是自动插桩部分的重点。定位后将代码片段的语法树添加到原文件的语法树中的相应位置,然后将产生的新语法树并将其转换成源代码,最后将新文件编译成字节码文件,所得字节码文件可直接运行。
整个自动插桩过程是逐个文件进行的。首先将原文件和插桩代码编译成语法树,接着遍历每个文件的语法树查看是否具有与插桩类型相匹配的语法树结构。找到匹配的语法树结点后,将对应插桩类型代码的语法树合并到原文件的语法树上。
语法树结构匹配使用了Visitor设计模式,利用该设计模式逐结点地遍历整个语法树,进而实现了树形结构的匹配。
为提高自动插桩的效率,本发明为自动插桩提供了文件过滤方法和元插桩类型重用框架。
利用文件过滤方法可以对所需编译的文件进行过滤,降低所需编译文件数量。程序分析时只需对整个工作空间(或工程)中的部分代码进行分析,分析员对工作空间(或工程)的结构已有所了解,利用分析员已有知识对自动插桩过程进行优化。分析者定义一些正则表达式进而对文件进行过滤,与之相匹配的文件(工程或包)将被保留下来。通过上述方案,所需编译文件数目将大大减小。
进一步的,在自动插桩中,若每种元插桩类型的插桩过程都需遍历一遍语法树,则使用多个元插桩类型进行插桩时开销将很大。整个过程开销主要体现在对原文件的编译,将文件编译成语法树其时间代价大,本发明提供元插桩类型重用框架以便解决该问题。元插桩类型重用框架主要包含:元插桩类型池、元插桩操作组合器,其中元插桩类型池包含多个元插桩类型。每种元插桩类型都是针对某一具体类型进行的并对插桩点的结构匹配进行定义,但元插桩类型并不能直接对语法树进行操作,需结合元插桩操作组合器进行使用。元插桩操作组合器将对文件的语法树进行遍历,根据元插桩类型所定义结构对语法树进行修改。元插桩类型池支持定义并添加新的插桩类型,进而实现对不同应用类型自动插桩的扩展。
本发明利用标志保存插桩代码,并将插桩代码与原有代码区分开来,提高了插桩代码可视化能力。标志可以在插桩位置显示相应的插桩代码,且不会干扰原文件编辑工作。同时可以集中管理所有插桩标志,进而提高插桩代码的管理能力。本发明还利用语法树结构匹配进而实现插桩点的自动定位,自动定位能有效地实现自动插桩功能。在抽象语法树上,自动插桩在所得定位位置添加插桩代码,然后将新的语法树转换成源文件。为提高自动插桩的效率,本发明还设计了文件过滤和元插桩类型重用框架。以上所有操作均在后台完成且不修改用户原文件,整个过程是一个无痕过程。
附图内容
图1为自动插桩的完整的流程图。
图2为自动插桩的元插桩类型重用框架图。
图3为自动插桩中文件过滤的流程图。
图4为自动插桩中,语法树匹配并插入代码的流程图。
具体实施方式
下面通过附图对本发明的技术方案做进一步的详细描述。
一种无痕可管理的源代码自动插桩方法,本方法是针对某具体应用类型进行的,利用抽象语法树的结构匹配进行插桩点的自动定位,插桩点自动定位自动插桩部分的重点。定位后将代码片段的语法树结构添加到原文件的语法树结构中的相应位置,将产生的新语法树转换成源代码并编译成字节码,所得字节码可以直接进行运行。自动插桩的完整的流程图如图1所示,包括如下步骤:
步骤40:整个自动插桩过程的开始,此时打开一个工程并准备通过插桩对其进行分析;
步骤41:定义一个文件过滤器,文件过滤器使用正则表达式对所需插桩的工程(包、文件、方法)进行匹配,与之匹配的则将保留下来;
步骤42:接着使用上述定义的过滤器对被插桩的文件进行过滤,利用分析者对工程文件已有知识提高了自动插桩性能;
步骤43:选择所需插桩的类型,定义相关类型所需插桩的代码;
步骤44:接着利用语法树结构匹配根据不同的插桩类型进行插桩点的位置定位,并在相应位置插入代码最终产生一个新的文件;
步骤45:对上述新的文件进行编译产生新的可执行字节码文件,并将这些文件保存起来;
步骤46:最终产生可执行文件,整个过程将不会修改原有文件信息,整个过程是一个无痕的过程。
自动插桩方案中为提高插桩效率提供了文件过滤方案和元插桩类型重用框架。自动插桩的元插桩类型重用框架图如图2所示,该框架主要是由元插桩操作组合器和元插桩类型池两部分组成。其中元插桩类型支持对不同类型插桩进行插桩,且每一个元插桩只能针对某一类型进行插桩。元插桩类型池包含多个元插桩类型,并且支持添加新的元插桩类型。元插桩操作组合器用于将多个元插桩类型组合到一起,通过遍历一次语法树进而完成在语法树上多种类型的插桩操作。
文件过滤方案通过减小插桩文件集合,降低被编译文件数目。插桩过程中并非每个文件都需要进行插桩,编译一些无关文件并将语法树遍历一遍将会浪费大量时间。通过文件过滤将大大降低插桩文件集大小,自动插桩文件过滤的流程图如图3所示,包括如下步骤:
步骤60:自动插桩文件过滤是对某一工作空间所有文件进行过滤;
步骤61:先看该工作空间是否包含其它工程,如没有则跳转到步骤64开始进行包的过滤,若有则进入下一步;
步骤62:将工程名与工程名正则表达式进行匹配,若匹配则进入下一步骤,若不匹配则回到步骤61继续查看是否有下一个工程;
步骤63:该工程名与正则表达式相匹配,说明该工程需要进行插桩,将其添加到插桩工程集合中,然后跳回至步骤61;
步骤64:先看工程集合中的工程是否包含其它包,如没有则跳转到步骤67开始进行文件的过滤,若有则进入下一步;
步骤65:将包名与包名正则表达式进行匹配,若匹配则进入下一步骤,若不匹配则回到步骤64继续查看是否有下一个包;
步骤66:该包名与正则表达式相匹配,说明该包需要进行插桩,将其添加到插桩包集合中,然后跳回至步骤64;
步骤67:先看包集合中的包是否包含其它文件,如果没有则跳转到步骤6b,如果有则进入下一步;
步骤68:将文件名与文件名正则表达式进行匹配,若匹配则进入下一步对方法名进行匹配,否则跳回至步骤67;
步骤69:查看文件中是否包含与方法名正则表达式相匹配的方法,若匹配则进入下一步,否则跳回至步骤67;
步骤6a:将匹配的文件添加到文件匹配集合;
步骤6b:对工程中所有工程名、包名、文件名以及方法名进行匹配后并完成对文件的过滤操作。
通过语法树匹配可实现插桩定位,该部分使用设计模式中的visitor模式进行匹配,语法树匹配并插入代码的流程图如图4所示,包括如下步骤:
步骤70:对文件进行插桩是逐个文件进行操作的,然后根据不同插桩类型进行插桩,下面流程包含对方法、IF分支、Switch分支、While分支、Do-while分支以及For分支类型进行语法树结构匹配并进行插桩。
步骤71:查看是否还有下一个文件,如果没有则结束,否则进入下一步骤;
步骤72:将文件编译成语法树,以便后面的插桩定位使用,下面将以Visitor模式访问各个节点,下面几个步骤描述了visitor模型下几种插桩类型的操作;
步骤73:首先判断语法树是否有下一个节点;
步骤74:根据所选插桩类型判断是否包含方法类型,若包含并且该结点是方法体结点,则跳转到下一步,否则跳转到步骤76;
步骤75:将事先由分析人员所定义的方法类型插桩代码插入到抽象语法树中;
步骤76:根据所选插桩类型判断是否包含IF分支类型,若包含并且该结点是IF分支结点,则跳转到下一步,否则跳转到步骤78;
步骤77:将事先由分析人员所定义的IF分支类型插桩代码插入到抽象语法树中;
步骤78:根据所选插桩类型判断是否包含Switch分支类型,若包含并且该结点是Switch分支结点,则跳转到下一步,否则跳转到步骤7a;
步骤79:将事先由分析人员所定义的Switch分支类型插桩代码插入到抽象语法树中;
步骤7a:根据所选插桩类型判断是否包含While分支类型,若包含并且该结点是While分支结点,则跳转到下一步,否则跳转到步骤7a;
步骤7b:将事先由分析人员所定义的While分支类型插桩代码插入到抽象语法树中;
步骤7c:根据所选插桩类型判断是否包含Do-While分支类型,若包含并且该结点是Do-While分支结点,则跳转到下一步,否则跳转到步骤7a;
步骤7d:将事先由分析人员所定义的Do-While分支类型插桩代码插入到抽象语法树中;
步骤7e:根据所选插桩类型判断是否包含For分支类型,若包含并且该结点是For分支结点,则跳转到下一步,否则跳转到步骤7a;
步骤7f:将事先由分析人员所定义的For分支类型插桩代码插入到抽象语法树中;
步骤7g:完成语法树插桩后,将语法树转换成源代码文件,然后进入下一步对下一个文件进行插桩;
步骤7h:完成了对所有文件的插桩插桩,整个过程结束;
最后对所产生的新文件进行编译,生成包含原文件和插桩代码的字节码文件,运行这些文件便可获得插桩后文件运行结果。
本发明的技术方案利用标志编辑并保存插桩代码,插桩标志能够将插桩代码与原代码区分开,同时能在插桩位置显示插桩代码,能够有效地提高程序的可阅读性。插桩标志不影响对源程序的编辑工作,此外插桩点的集中管理提高了插桩标志的易用性。本发明使用语法树结构匹配提高了定位精度,将原源代码文件编译成语法树后进行结构匹配,对语法树进行修改最后将语法树转换成源代码文件。另外,为提高匹配效率,方案还提出了文件过滤方法和元插桩类型重用框架。文件过滤方法有效地降低了所需编译和遍历的文件数目,元插桩类型重用框架使得多种插桩类型能在一次语法树遍历中完成。
最后应当说明的是:以上步骤仅用于说明本发明的技术方案而非对其限制。尽管上述步骤对本发明进行了详细的说明,相关领域的技术人员应当理解,依然可以对本发明的具体技术进行修改或者对部分技术进行等同替换;而不脱离本发明技术方案的精神,其均应涵盖在本发明请求保护的技术方案范围当中。
Claims (6)
1.一种无痕可管理的源代码自动插桩方法,其特征是步骤包括:
步骤40:开始,打开一个工程;
步骤41:定义一个文件过滤器,对所需插桩的工程进行匹配,保留匹配的工程;
步骤42:接着使用所述文件过滤器对被插桩的源文件进行过滤;
步骤43:选择自动插桩的具体应用类型,定义相应类型所需插桩的代码;
步骤44:用语法树结构匹配,根据自动插桩的具体应用类型进行相应插桩点的位置定位,并在相应位置插入代码,生成一个新源文件;
步骤45:所述新源文件进行编译产生新的可执行字节码文件,并保存;
步骤46:生成可执行文件,结束。
2.根据权利要求1所述的无痕可管理的源代码自动插桩方法,其特征是本自动插桩方法提供了元插桩类型重用框架,包括元插桩操作组合器和元插桩类型池,其中,
元插桩类型池包括多个元插桩类型,并且支持添加新的元插桩类型;
元插桩操作组合器将多个元插桩类型组合到一起,通过遍历一次语法树完成在语法树上多种类型的插桩操作;
所述元插桩类型支持对不同类型插桩进行插桩,且每一个元插桩类型只能针对某一类型元插桩进行插桩。
3.根据权利要求1所述的无痕可管理的源代码自动插桩方法,其特征是所述步骤41中,对所需插桩的工程进行匹配,包括匹配工程中的包、文件、和方法。
4.根据权利要求3所述的无痕可管理的源代码自动插桩方法,其特征是所述步骤42中,所述源文件过滤的步骤包括:
步骤60:开始:源文件过滤是对某一工作空间所有源文件进行过滤;
步骤61:先判断该工作空间是否包含其它工程,如没有则跳转到步骤64,若有则进入步骤62;
步骤62:匹配工程名,如果匹配则进入步骤63,如果不匹配则返回步骤61继续查看是否有下一个工程;
步骤63:如果工程名匹配,说明该工程需要进行插桩,将其添加到插桩工程集合中,然后跳回至步骤61;
步骤64:进行包的过滤,先判断工程集合中的工程是否包含其它包,如没有则跳转到步骤67开始进行文件的过滤,若有则进入步骤65;
步骤65:匹配包名,若匹配则进入步骤66,若不匹配则回到步骤64继续查看是否有下一个包;
步骤66:匹配包名,若相匹配,说明该包需要进行插桩,将其添加到插桩包集合中,然后跳回至步骤64;
步骤67:判断包集合中的包是否包含其它源文件,如果没有则跳转到步骤6b,如果有则进入步骤68;
步骤68:匹配源文件名,若匹配则进入步骤69对方法进行匹配,否则跳回至步骤67;
步骤69:匹配方法,若匹配则进入步骤6a,否则跳回至步骤67;
步骤6a:将匹配的源文件添加到文件匹配集合;
步骤6b:对工程中所有工程名、包名、文件名和方法名进行匹配后并完成对文件的过滤操作。
5.根据权利要求4所述的无痕可管理的源代码自动插桩方法,其特征是
所述步骤62中,匹配工程名,是将工程名与工程名正则表达式进行匹配;
所述步骤65中,匹配包名,是将包名与包名正则表达式进行匹配;
所述步骤66中,匹配包名,是将包名与包名正则表达式进行匹配;
所述步骤68中,匹配源文件名,是将源文件名与源文件名正则表达式进行匹配;
所述步骤69中,匹配方法,是将源文件中的方法的方法名与方法名正则表达式进行匹配。
6.根据权利要求1所述的无痕可管理的源代码自动插桩方法,其特征是所述步骤44中,通过语法树匹配可实现插桩定位,该部分使用visitor模式进行匹配,语法树匹配并插入代码的步骤包括:
步骤70:开始:对源文件进行插桩是逐个文件进行操作的,然后根据不同插桩类型进行插桩;插桩类型包括方法、IF分支、Switch分支、While分支、Do-while分支和For分支类型;
步骤71:查看是否还有下一个源文件,如果没有则进入步骤7h,结束;如果有则进入步骤72;
步骤72:先把源文件编译成语法树,再以Visitor模式访问各个节点,Visitor模型下几种插桩类型的操作步骤如下:
步骤73:首先判断语法树是否有下一个节点;
步骤74:根据所选插桩类型判断是否包含方法类型,若包含并且该结点是方法体结点,则进入步骤75,否则跳转到步骤76;
步骤75:将事先由分析人员所定义的方法类型插桩代码插入到抽象语法树中的相应节点;
步骤76:根据所选插桩类型判断是否包含IF分支类型,若包含并且该结点是IF分支结点,则进入步骤77,否则跳转到步骤78;
步骤77:将事先由分析人员所定义的IF分支类型插桩代码插入到抽象语法树中的相应节点;
步骤78:根据所选插桩类型判断是否包含Switch分支类型,若包含并且该结点是Switch分支结点,则进入步骤79,否则跳转到步骤7a;
步骤79:将事先由分析人员所定义的Switch分支类型插桩代码插入到抽象语法树中的相应节点;
步骤7a:根据所选插桩类型判断是否包含Whi le分支类型,若包含并且该结点是While分支结点,则进入步骤7b,否则跳转到步骤7a;
步骤7b:将事先由分析人员所定义的While分支类型插桩代码插入到抽象语法树中的相应节点;
步骤7c:根据所选插桩类型判断是否包含Do-While分支类型,若包含并且该结点是Do-While分支结点,则进入步骤7d,否则跳转到步骤7a;
步骤7d:将事先由分析人员所定义的Do-While分支类型插桩代码插入到抽象语法树中的相应节点;
步骤7e:根据所选插桩类型判断是否包含For分支类型,若包含并且该结点是For分支结点,则进入步骤7f,否则跳转到步骤7a;
步骤7f:将事先由分析人员所定义的For分支类型插桩代码插入到抽象语法树中的相应节点;
步骤7g:完成语法树插桩后,将语法树转换成源代码文件,然后进入步骤73对下一个源文件进行插桩;
步骤7h:完成了对所有文件的插桩插桩,整个过程结束。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011101985825A CN102231109A (zh) | 2011-07-15 | 2011-07-15 | 无痕可管理的源代码自动插桩方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011101985825A CN102231109A (zh) | 2011-07-15 | 2011-07-15 | 无痕可管理的源代码自动插桩方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102231109A true CN102231109A (zh) | 2011-11-02 |
Family
ID=44843676
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2011101985825A Pending CN102231109A (zh) | 2011-07-15 | 2011-07-15 | 无痕可管理的源代码自动插桩方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102231109A (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103049504A (zh) * | 2012-12-11 | 2013-04-17 | 南京大学 | 基于源代码查询的半自动插桩方法 |
CN103488460A (zh) * | 2013-09-04 | 2014-01-01 | 用友软件股份有限公司 | 自动标记源代码的系统和方法 |
WO2014134990A1 (en) * | 2013-03-08 | 2014-09-12 | Tencent Technology (Shenzhen) Company Limited | Method, device and computer-readable storage medium for closure testing |
CN104142819A (zh) * | 2013-07-10 | 2014-11-12 | 腾讯科技(深圳)有限公司 | 一种文件处理方法及装置 |
CN106529224A (zh) * | 2016-10-27 | 2017-03-22 | 南京大学 | 基于rop攻击特点的二进制混淆方法 |
CN106610898A (zh) * | 2016-12-28 | 2017-05-03 | 南京大学 | 一种基于JPF的Java代码SSA单路径的生成方法 |
CN106649118A (zh) * | 2016-12-28 | 2017-05-10 | 南京大学 | 一种基于AST的Java代码SSA单路径的生成方法 |
CN106874058A (zh) * | 2016-12-29 | 2017-06-20 | 中国航天系统科学与工程研究院 | 一种基于源代码的程序自动插桩方法 |
CN110442346A (zh) * | 2019-07-08 | 2019-11-12 | 中国科学院计算技术研究所 | 用于编译器代码检测的规则扩充方法 |
CN110471670A (zh) * | 2019-08-20 | 2019-11-19 | 杭州和利时自动化有限公司 | 一种编译器、编译方法和追踪方法及dcs控制器 |
CN111158667A (zh) * | 2020-01-02 | 2020-05-15 | 广州虎牙科技有限公司 | 代码注入方法和装置、电子设备及存储介质 |
CN112905443A (zh) * | 2019-12-04 | 2021-06-04 | 阿里巴巴集团控股有限公司 | 一种测试用例生成方法、设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7240335B2 (en) * | 1996-08-27 | 2007-07-03 | Compuware Corporation | Byte code instrumentation |
CN101706750A (zh) * | 2009-11-16 | 2010-05-12 | 西安邮电学院 | 一种基于嵌入式模拟器的测试桩获取方法 |
CN101833500A (zh) * | 2010-04-07 | 2010-09-15 | 南京航空航天大学 | 一种基于Agent的嵌入式软件智能测试方法 |
-
2011
- 2011-07-15 CN CN2011101985825A patent/CN102231109A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7240335B2 (en) * | 1996-08-27 | 2007-07-03 | Compuware Corporation | Byte code instrumentation |
CN101706750A (zh) * | 2009-11-16 | 2010-05-12 | 西安邮电学院 | 一种基于嵌入式模拟器的测试桩获取方法 |
CN101833500A (zh) * | 2010-04-07 | 2010-09-15 | 南京航空航天大学 | 一种基于Agent的嵌入式软件智能测试方法 |
Non-Patent Citations (1)
Title |
---|
CHEN HUAJIE等: "An Instrumentation Tool for Program Dynamic Analysis in Java", 《2011 FIFTH INTERNATIONAL CONFERENCE ON SECURE SOFTWARE INTEGRATION AND RELIABILITY IMPROVEMENT-COMPANION》 * |
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103049504A (zh) * | 2012-12-11 | 2013-04-17 | 南京大学 | 基于源代码查询的半自动插桩方法 |
WO2014134990A1 (en) * | 2013-03-08 | 2014-09-12 | Tencent Technology (Shenzhen) Company Limited | Method, device and computer-readable storage medium for closure testing |
US9507693B2 (en) | 2013-03-08 | 2016-11-29 | Tencent Technology (Shenzhen) Company Limited | Method, device and computer-readable storage medium for closure testing |
CN104142819A (zh) * | 2013-07-10 | 2014-11-12 | 腾讯科技(深圳)有限公司 | 一种文件处理方法及装置 |
CN104142819B (zh) * | 2013-07-10 | 2016-08-24 | 腾讯科技(深圳)有限公司 | 一种文件处理方法及装置 |
CN103488460A (zh) * | 2013-09-04 | 2014-01-01 | 用友软件股份有限公司 | 自动标记源代码的系统和方法 |
CN103488460B (zh) * | 2013-09-04 | 2015-12-02 | 用友网络科技股份有限公司 | 自动标记源代码的系统和方法 |
CN106529224A (zh) * | 2016-10-27 | 2017-03-22 | 南京大学 | 基于rop攻击特点的二进制混淆方法 |
CN106610898A (zh) * | 2016-12-28 | 2017-05-03 | 南京大学 | 一种基于JPF的Java代码SSA单路径的生成方法 |
CN106649118A (zh) * | 2016-12-28 | 2017-05-10 | 南京大学 | 一种基于AST的Java代码SSA单路径的生成方法 |
CN106610898B (zh) * | 2016-12-28 | 2019-01-04 | 南京大学 | 一种基于JPF的Java代码SSA单路径的生成方法 |
CN106649118B (zh) * | 2016-12-28 | 2019-02-19 | 南京大学 | 一种基于AST的Java代码SSA单路径的生成方法 |
CN106874058A (zh) * | 2016-12-29 | 2017-06-20 | 中国航天系统科学与工程研究院 | 一种基于源代码的程序自动插桩方法 |
CN110442346A (zh) * | 2019-07-08 | 2019-11-12 | 中国科学院计算技术研究所 | 用于编译器代码检测的规则扩充方法 |
CN110471670A (zh) * | 2019-08-20 | 2019-11-19 | 杭州和利时自动化有限公司 | 一种编译器、编译方法和追踪方法及dcs控制器 |
CN112905443A (zh) * | 2019-12-04 | 2021-06-04 | 阿里巴巴集团控股有限公司 | 一种测试用例生成方法、设备及存储介质 |
CN111158667A (zh) * | 2020-01-02 | 2020-05-15 | 广州虎牙科技有限公司 | 代码注入方法和装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102231109A (zh) | 无痕可管理的源代码自动插桩方法 | |
US10698682B1 (en) | Computerized software development environment with a software database containing atomic expressions | |
CN101739339B (zh) | 一种基于程序动态依赖关系的软件故障定位方法 | |
CN102819492B (zh) | 一种基于Android的关键字驱动自动化测试框架 | |
CN102063324B (zh) | 一种实现自动化编程的方法及系统 | |
Nogueira et al. | Test generation from state based use case models | |
US7243090B2 (en) | System and method for specification tracking in a Java compatibility testing environment | |
US20080104096A1 (en) | Software development system | |
CN104809071A (zh) | 一种代码测试方法及装置 | |
CN101996131A (zh) | 基于xml封装关键字的gui自动测试方法及自动测试平台 | |
Huang et al. | Precise dynamic impact analysis with dependency analysis for object-oriented programs | |
CN102567164A (zh) | 用于处理器的指令集批量测试装置与方法 | |
US10496379B2 (en) | Facilitated production of code for software testing | |
CN103605556A (zh) | 虚拟试验对象一体化构建系统及方法 | |
Rajan et al. | Aspect language features for concern coverage profiling | |
CN106354638A (zh) | 基于词法分析的自动测试方法及装置 | |
CN101344855A (zh) | 一种基于编译的跟踪代码中特定对象的控制方法及装置 | |
CN102214142A (zh) | 无痕可管理的源代码手动定义标志插桩方法 | |
Reimann et al. | Role-based generic model refactoring | |
US7624381B1 (en) | Portable detection of start and completion of object construction | |
Li et al. | A User-extensible Refactoring Tool for Erlang Programs | |
Combemale et al. | A Solution to the TTC'15 Model Execution Case Using the GEMOC Studio | |
CN114924767A (zh) | 一种基于对齐空洞的内核数据类型动态扩展热补方法 | |
Hamann et al. | Abstract runtime monitoring with USE | |
CN103116514A (zh) | 基于系统扩展调用图的操作系统自动优化方法和系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20111102 |