无痕可管理的源代码手动定义标志插桩方法

文档序号:6428637阅读:120来源:国知局
专利名称:无痕可管理的源代码手动定义标志插桩方法
技术领域
本发明涉及计算机程序动态分析,主要涉及一种无痕可管理的源代码手动定义标志插桩方法。
背景技术
程序分析通常利用静态程序分析和动态程序分析对程序行为进行自动分析,进而提高软件质量。动态程序分析常借助于插桩方法来收集程序动态运行行为,某些与运行环境相关的程序行为只能通过插桩来收集,而静态程序分析无法进行分析。软件开发过程中, 代码审查者在代码编写阶段完成后使用源代码插桩方法对代码进行审查,通常审查者拥有阅读源代码权限但不便对代码进行修改。通过对程序运行行为的分析尽早发现代码中的错误,进而提高软件质量。源代码插桩能够充分地利用程序语义、可视化地显示插桩代码、并且不会提高代码逻辑复杂性。程序插桩技术,是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针,通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。由于程序插桩技术是在被测程序中插入探针,然后通过探针的执行来获得程序的控制流和数据流信息,以此来实现测试的目的。因此,根据探针插入的时间可以分为目标代码插桩和源代码插桩。现有插桩方法主要包括断言机制、字节码插桩、面向方面插桩等三类方法。断言机制直接在写源文件中添加插桩代码,将会降低代码阅读性。字节码插桩则直接对字节码文件进行修改,被插字节码的源代码无法可视化,且无法保证代码插入过程的正确性。面向方面插桩在程序纵向继承关系的基础上增加了横向方面关系,增加了程序的逻辑复杂性。目前插桩技术主要存在插桩点及其代码可视化、被插代码管理、插桩点自动定位、 自动插桩性能较低的问题。

发明内容
鉴于上述问题,本发明旨在提供一个源代码插桩方法,该方法不仅支持手动插桩, 并且支持批量自动插桩。其主要特点有插桩代码可视化、插入代码集中管理和插桩过程无痕化等。本发明是通过以下技术方案实现的一种对源代码进行无痕可管理的无痕可管理的源代码手动定义标志插桩方法,步骤包括步骤10 打开一个工程;步骤11 通过在源代码编辑器上定义插桩标志,进而在整个工程中定义插桩点;步骤12 审查所有插桩点的定义若发现带有错误的插桩点,则进入步骤13对其进行修改;没有发现带有错误的插桩点,则直接进入步骤14 ;
步骤13 修改插桩的定义直至正确;步骤14 将插桩点与原源文件合并生成新源文件;步骤15 对新源文件进行编译生成字节码文件。所述步骤11)中,插桩点定义的步骤包括步骤20 打开一个工程;步骤21 判断是否需要在工程中的源文件上定义插桩点,如果是,则跳转到步骤 22,如果不是,则跳转到步骤25;步骤22 选取所需插桩的源文件,用源代码编辑器打开该源文件;步骤23 先定位到插桩点所在代码行,并定义一个标志便于能够及时识别,再在该标志上定义相应的插桩代码;步骤M 如果需要在本源文件中继续定义新的插桩点,则跳转到步骤21,如果不需要,则进入步骤25;步骤25 结束本次插桩定义。所述步骤13中,可修改信息包括插桩点所包含的插桩代码和插桩点是否需要编译到字节码文件。所述步骤14中,手动插桩中原源文件与插桩点合并生成新源文件的步骤包括步骤30 原源文件与插桩点合并的开始,此时各个源文件中的插桩点已经定义好;步骤31 先将工程中所有源文件查找出来,并从中选择一个源文件;步骤32 查看所选源文件中是否包含插桩点,若有则进入步骤33,若没有则跳转到步骤36 ;步骤33 首先将原源文件备份,然后查找出源文件中所有插桩点;步骤34 对查找出来的所有插桩点进行排序,按照行号进行排序;步骤35 逐行读取原源文件并写入一个新源文件,生成一个新源文件;步骤36:查看是否还有源文件需要合并插桩点,如果有,则返回步骤31,如果没有,则进入步骤37 ;步骤37 所有源文件都已经合并过插桩点,结束。所述步骤34中,排序是按照行号由小到大进行排序;对于行号的相同的插桩点, 行首类型插桩点排在行末类型插桩点之前。所述步骤35中,逐行读取原源文件,从前往后遍历所有插桩点;在逐行读取源文件时a)如果行号与插桩点行号不同,则直接写入新源文件中;b)如果行号与插桩点行号相同,此时b. 1)若插桩类型是行首类型,则先向新源文件写入插桩代码,再写入原源文件代码,b. 2)若插桩类型是行末类型,则先向新源文件写入原源文件代码,再写入插桩代码;在逐行读取源文件时,取出下一个插桩点,直到所有插桩点全部合并到原源文件中。
所述插桩点管理器,通过查询显示工程中所有插桩点信息、修改插桩点的信息、插桩点分类及过滤、插桩点定位到源文件中具体某一行和插桩点的删除。所述插桩标志显示在源代码编辑器的左侧垂直标尺上,以不同图标形式表明该行已植入插桩代码以及插桩类型;插桩点的代码可由用户自定义。所有插桩标志均随工程进行插桩标志在工程关闭后自动进行保存,在下次打开工程时插桩标志依旧能够在源代码编辑器的标尺上进行还原。本方法借助插桩点集中管理器完成,插桩点集中管理器的功能包括查询并显示工程中所有插桩点信息、修改插桩点的信息、插桩点分类及过滤显示、插桩点定位到文件中具体某一行和插桩点的删除。手动定义标志的插桩方案是按行进行插桩的,每行最多包含两种插桩标志类型, 一种是在行首植入插桩代码,另一种是在行末植入插桩代码。在源代码编辑器上,定义插桩点的行会左侧垂直标尺上显示一个标志,表明该行已被植入插桩代码同时指明插桩类型。 每个插桩点代码均可由用户自定义,并且所有插桩标志均随工程进行持久化。插桩标志持久化是指插桩标志在工程关闭后自动进行保存,在下次打开工程时插桩标志依旧能够在源代码编辑器的标尺上进行还原。所有插桩点在定义完后可以进行集中管理,插桩点的集中管理部分包括查询并显示工程中所有插桩点信息、修改插桩点信息、插桩点分类及过滤显示、插桩点定位到文件中具体某一行、插桩点的删除。进一步的,查询显示工程中所有插桩点信息,包括查询文件中所有行首和行末插桩点,其所显示的信息包括插桩点所属工程名、所属文件路径、所在行号、所需植入的代码以及是否需要合并字节码文件中。步骤13中,修改插桩点信息,包括编辑插桩点中插桩代码以及是否需要合并到字节码文件的选项。插桩分类可按工程名、文件名、插桩类型、合并选择进行排序,排序后同一类别的插桩点集中显示在一起。按工程名进行排序时,工程名相同的插桩点将显示在一起, 其它几种分类方式与此类似。插桩点过滤支持在插桩点管理界面显示少量必须的插桩点,避免因插桩点数目巨大而增大用户编辑难度进而提高用户体验指数。插桩点过滤利用正则表达式对工程名及文件名进行过滤,进而使得过滤所得工程(或文件)中的插桩点保留下来并显示在插桩管理界面上。过滤时先查找哪些工程(或文件)名称与正则表达式相匹配,将与之匹配的工程 (或文件)保存下来。接着将保留下来工程(或文件)中的插桩点查找出来并显示到插桩管理界面上。插桩点定位能够方便地定位到插桩点所在文件,使得用户能够及时查看插桩点所处环境,进而分析该部分程序的功能。插桩点删除功能支持在插桩点管理部分统一删除指定(或所有)的插桩点,避免了删除插桩前必须定位到其所在文件的问题,进而提高了软件的易用性。将定义好的插桩点与原源文件合并成新源文件的过程是对工程中的每一个源文件单独进行操作。对于某具体源文件而言,先将该文件拷贝备份,然后获取该文件中的所有插桩点,按照从行号从小到大进行排序。接着按行读取文件并写入到新文件中,当行号与某一个插桩点行号相等时,根据插桩类型将该插桩点代码和原文件代码写到新文件中然后读下一行。代码写入顺序由插桩类型决定,若是行首插桩类型则先写插桩代码再写原文件代码,若是行末插桩类型则先写原文件代码再写插桩代码。按上述方法逐源文件进行操作,将所有插桩点合并到相应的源文件中并生成新源文件。对新源文件进行编译产生新的字节码并运行的过程中,利用事先的备份还原源文件,从合并插桩点到编译并运行字节码文件是一个完整的自动过程。对于外部而言,原源文件未被改变且结果为插桩代码的执行结果,整个过程是一个无痕过程。本发明利用标志保存插桩代码,并将插桩代码与原有代码区分开来,提高了插桩代码可视化能力。标志可以在插桩位置显示相应的插桩代码,且不会干扰原文件编辑工作。 同时可以集中管理所有插桩标志,进而提高插桩代码的管理能力。为提高自动插桩的效率, 本发明还设计了文件过滤和元插桩类型重用框架。以上所有操作均在后台完成且不修改用户原文件,整个过程是一个无痕过程。附图内容

图1为手动插桩的完整流程图。图2为手动插桩插桩点定义的流程图。图3为手动插桩中原源文件与插桩点合并的流程图。
具体实施例方式下面通过附图对本发明的技术方案做进一步的详细描述。本发明主要包含两种类型插桩方案一种是手动定义标志插桩类型,另一种是不同应用类型自动插桩。手动插桩方案支持分析人员根据分析需要灵活地在整个工程中定义插桩点,并进行插桩点的管理。所植入的插桩代码不会破坏原有代码,最终可根据需要选择几个插桩点与原文件一起运行。整个手动插桩完整流程图如图1所示,包括如下步骤步骤10 整个手动插桩过程的开始,此时打开一个工程并准备通过插桩对其进行分析;步骤11 通过在源代码编辑器上定义标志进而在整个工程定义插桩点;步骤12 定义完插桩点后审查一下所有插桩点的定义,若发现带有错误的插桩点,则进入步骤13对其进行修改,否则进入步骤14 ;步骤13 修改插桩的定义,可修改信息主要有两种其一是插桩点所包含的插桩代码,其二是插桩点是否需要编译到字节码文件;步骤14 在完成插桩定义以及没有插桩点需要修改时,将插桩点与原源文件合并并产生新文件;步骤15 对所产生的新源文件进行编译进而产生字节码文件;上述手动插桩点定义流程利用标志保存资源信息,标志须和工程一起持久化便于以后使用,整个手动插桩插桩点定义的流程图如图2所示,包括如下步骤步骤20 整个手动插桩插桩点定义的开始,此时需打开一个工程并准备定义插桩点。步骤21 判断是否需要在文件上定义插桩点,如果是则跳转到步骤22,否则跳转到步骤25 ;
步骤22 选取所需插桩的文件,并用源代码编辑器打开该文件;步骤23 手动插桩须先定位到插桩点所在代码行,并定义一个标志以便以后能够及时识别,在该标志上定义相应的插桩代码;步骤M 判断是否还需在本文件定义新的插桩点,如果需要定义新的插桩点则跳转到步骤21,否则进入步骤25 ;步骤25 所有插桩点定义已经完成,结束本次插桩定义;在定义好插桩点后,为进一步提高插桩点的正确性,本方案提供了插桩点管理器。 通过查询并显示工程中所有插桩点信息、修改插桩点的信息、插桩点分类及过滤显示、插桩点定位到文件中具体某一行、插桩点的删除五种操作进而提高插桩点集中管理能力。所述原源文件与插桩点合并的流程是在定义完插桩点后进行的,该操作将文件中需编译的插桩点与原文件进行合并生成新的文件。手动插桩中原源文件与插桩点合并的流程图如图3所示,包括如下步骤步骤30 原文件与插桩点合并的开始部分,此时各个文件中的插桩点已经定义好,下面将对每个文件进行插桩点合并操作;步骤31 先将整个工程中所有源文件查找出来,并从中选择一个文件;步骤32 查看所选文件中是否包含插桩点,若有则进入步骤33,否则跳转到步骤 36 ;步骤33 若文件包含插桩点,则首先将原文件备份然后查找出文件中所有插桩占.
^ \\\ 步骤34:对查找出来的所有插桩点进行排序,按照行号由小到大进行排序,行号的相同的插桩点,行首类型插桩点排在行末类型插桩点之前;步骤35 逐行读取原文件并写入一个新文件,同时从前往后遍历所有插桩点。在逐行读取文件时,如果行号与插桩点不同则直接写入新文件中;如果行号与插桩点行号相同时,此时若插桩类型是行首类型则先向新文件写入插桩代码再写入原文件代码,若插桩类型是行末类型则先向新文件写入原文件代码再写入插桩代码。同时将取出下一个插桩点,直到所有插桩点全部合并到原文件中。步骤36 查看是否还有文件需要合并插桩点;步骤37 所有文件都已经合并过插桩点。在本方案中,逐个文件进行插桩点合并后将会对新文件进行编译同时产生新的字节码。运行新字节码,所得结果即为插桩点与原代码共同执行结果。自动插桩方案是针对某具体应用类型进行的,利用抽象语法树的结构匹配进行插桩点的自动定位,插桩点自动定位自动插桩部分的重点。定位后将代码片段的语法树结构添加到原文件的语法树结构中的相应位置,将产生的新语法树转换成源代码并编译成字节码,所得字节码可以直接进行运行。自动插桩的完整的流程图如图4所示,包括如下步骤步骤40 整个自动插桩过程的开始,此时打开一个工程并准备通过插桩对其进行分析;步骤41 定义一个文件过滤器,文件过滤器使用正则表达式对所需插桩的工程 (包、文件、方法)进行匹配,与之匹配的则将保留下来;步骤42 接着使用上述定义的过滤器对被插桩的文件进行过滤,利用分析者对工程文件已有知识提高了自动插桩性能;步骤43 选择所需插桩的类型,定义相关类型所需插桩的代码;步骤44 接着利用语法树结构匹配根据不同的插桩类型进行插桩点的位置定位, 并在相应位置插入代码最终产生一个新的文件;步骤45 对上述新的文件进行编译产生新的可执行字节码文件,并将这些文件保存起来;步骤46 最终产生可执行文件,整个过程将不会修改原有文件信息,整个过程是一个无痕的过程。最后应当说明的是以上步骤仅用于说明本发明的技术方案而非对其限制。尽管上述步骤对本发明进行了详细的说明,相关领域的技术人员应当理解,依然可以对本发明的具体技术进行修改或者对部分技术进行等同替换;而不脱离本发明技术方案的精神,其均应涵盖在。
权利要求
1.一种无痕可管理的源代码手动定义标志插桩方法,其特征是包括步骤 步骤10 打开一个工程;步骤11 通过在源代码编辑器上定义插桩标志,进而在整个工程中定义插桩点; 步骤12 审查所有插桩点的定义若发现带有错误的插桩点,则进入步骤13对其进行修改;没有发现带有错误的插桩点,则直接进入步骤14 ; 步骤13 修改插桩的定义至正确; 步骤14 将插桩点与原源文件合并生成新源文件; 步骤15 对新源文件进行编译生成字节码文件。
2.根据权利要求1所述的无痕可管理的源代码手动定义标志插桩方法,其特征是所述步骤11)中,插桩点定义的步骤包括步骤20:打开一个工程;步骤21 判断是否需要在工程中的源文件上定义插桩点,如果是,则跳转到步骤22,如果不是,则跳转到步骤25;步骤22 选取所需插桩的源文件,用源代码编辑器打开该源文件; 步骤23 先定位到插桩点所在代码行,并定义一个标志便于能够及时识别,再在该标志上定义相应的插桩代码;步骤M 如果需要在本源文件中继续定义新的插桩点,则跳转到步骤21,如果不需要, 则进入步骤25 ;步骤25:结束本次插桩定义。
3.根据权利要求1所述的无痕可管理的源代码手动定义标志插桩方法,其特征是所述步骤13中,可修改信息包括插桩点所包含的插桩代码和插桩点是否需要编译到字节码文件。
4.根据权利要求1或2或3所述的无痕可管理的源代码手动定义标志插桩方法,其特征是所述步骤14中,手动插桩中原源文件与插桩点合并生成新源文件的步骤包括步骤30 原源文件与插桩点合并的开始,此时各个源文件中的插桩点已经定义好; 步骤31 先将工程中所有源文件查找出来,并从中选择一个源文件; 步骤32 查看所选源文件中是否包含插桩点,若有则进入步骤33,若没有则跳转到步骤36 ;步骤33 首先将原源文件备份,然后查找出源文件中所有插桩点; 步骤34 对查找出来的所有插桩点进行排序,按照行号进行排序; 步骤35 逐行读取原源文件并写入一个新源文件,生成一个新源文件; 步骤36 查看是否还有源文件需要合并插桩点,如果有,则返回步骤31,如果没有,则进入步骤37 ;步骤37 所有源文件都已经合并过插桩点,结束。
5.根据权利要求4所述的无痕可管理的源代码手动定义标志插桩方法,其特征是所述步骤34中,排序是按照行号由小到大进行排序;对于行号的相同的插桩点,行首类型插桩点排在行末类型插桩点之前。
6.根据权利要求4所述的无痕可管理的源代码手动定义标志插桩方法,其特征是所述步骤35中,逐行读取原源文件,从前往后遍历所有插桩点;在逐行读取源文件时a)如果行号与插桩点行号不同,则直接写入新源文件中;b)如果行号与插桩点行号相同,此时b. 1)若插桩类型是行首类型,则先向新源文件写入插桩代码,再写入原源文件代码,b. 2)若插桩类型是行末类型,则先向新源文件写入原源文件代码,再写入插桩代码;在逐行读取源文件时,取出下一个插桩点,直到所有插桩点全部合并到原源文件中。
7.根据权利要求1所述的无痕可管理的源代码手动定义标志插桩方法,其特征是所述插桩标志显示在源代码编辑器的左侧垂直标尺上,以不同图标形式表明该行已植入插桩代码以及插桩类型;插桩点的代码可由用户自定义。
8.根据权利要求7所述的无痕可管理的源代码手动定义标志插桩方法,其特征是所有插桩标志均随工程进行插桩标志在工程关闭后自动进行保存,在下次打开工程时插桩标志依旧能够在源代码编辑器的标尺上进行还原。
9.根据权利要求1所述的无痕可管理的源代码手动定义标志插桩方法,其特征是本方法借助插桩点集中管理器完成,插桩点集中管理器的功能包括查询并显示工程中所有插桩点信息、修改插桩点的信息、插桩点分类及过滤显示、插桩点定位到文件中具体某一行和插桩点的删除。
全文摘要
一种无痕可管理的源代码手动定义标志插桩方法,包括步骤10打开一个工程;11通过在源代码编辑器上定义插桩标志,进而在整个工程中定义插桩点;12审查所有插桩点的定义若发现带有错误的插桩点,则进入步骤13对其进行修改;没有发现带有错误的插桩点,则直接进入步骤14;13修改插桩的定义至正确;14将插桩点与原源文件合并生成新源文件;15对新源文件进行编译生成字节码文件。该方法主要特点为插桩代码可视化、集中管理插入代码、插桩过程无痕化、插桩点自动化定位、自动插桩可扩展、自动插桩高效性。
文档编号G06F11/36GK102214142SQ20111019854
公开日2011年10月12日 申请日期2011年7月15日 优先权日2011年7月15日
发明者张天, 陈华杰 申请人:南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1