论文部分内容阅读
动态程序分析工具被用于各式各样的软件工程任务中,如性能分析、调试、测试、程序理解以及逆向工程等。开发动态程序分析工具的其中一项关键技术便是字节码注入。许多低层次的字节码工程库支持在任意位置注入任意字节码,但是与此同时导致开发、维护工作不仅耗费大,而且容易发生错误。另一方面,研究者尝试将面向方面语言应用到动态程序分析工具的开发上。然而,尽管面向方面语言为动态程序分析工具的开发提供一种高层次抽象的编程模型,像AspectJ这样的主流面向方面语言的连接点模型并不适用于部分动态程序分析,而且其用以实现部分特殊语言特性而生成的代码将导致较大的性能开销。近期来,面向方面语言DiSL被用于改善动态程序分析工具的开发条件。DiSL为开发者提供的特性包括有允许选择任意字节码序列作为连接点的开放连接点模型、可扩展的静态上下文信息访问以及允许在注入阶段执行的静态分析。DiSL语言本身保证丰富的语言表义性以及高层次且对用户友好的编程模型,但它需要一款确保所注入代码的高执行效率的编织器实现。此外,尽管DiSL提供更高层次的抽象以支持高效字节码注入逻辑的快速开发,开发者往往需要抽取部分代码以便在注入时执行。否则,这些代码将被注入到目标类中,因此有可能导致死代码的出现,并依赖于实时优化将之去除。如果DiSL编织器能够提供对所注入代码的优化,那么将极大地简化DiSL的编程模型。本论文的主要贡献由如下两方面组成:1.本文实现一款高效的DiSL编织器,并通过已转换为DiSL语言的动态程序分析工具Senseo来测评该编织器。2.本文在DiSL编织器中集成部分计值器Turbo,并通过四个案例来说明应用Turbo的好处。而后利用其中一个案例来测评Turbo对注入时间以及运行时执行效率的影响。本文所展示的DiSL编织器高效实现提供对所注入代码的直接内联、支持高效数据传递的虚拟局部变量及线程局部变量、对静态上下文信息及动态上下文信息的高效访问和支持高效处理参数的机制。在本文中,我们将一个已有的基于AspectJ的动态程序分析工具转换为DiSL版本,并通过比较来展示DiSL编织器的优势。部分计值器Turbo则通过常量传播、分支消除、基于模式的代码精简以及注入式执行不含边际效应的方法等步骤来优化所要注入的代码。我们通过若干个案例来说明在应用Turbo的情况下,开发者无需将部分代码提取成额外的Java类中以便在注入时执行。DiSL编织器的实验结果表明,AspectJ版本的Senseo引入6.47倍的性能开销,而在相同代码覆盖的情况下,DiSL版本的Senseo的性能开销仅为基线版本的3.09倍。Turbo的实验结果表明,尽管Turbo引入4.2倍的注入时间性能开销而手工优化版本仅比基线版本慢10%,但是它们都达到13倍的稳定阶段执行效率加速比。总而言之,DiSL编织器相较AspectJ而言耗费更小的性能开销,而Turbo在引入额外注入时间开销的前提下,经过其优化的注入代码可以达到手工优化版本的稳定阶段执行效率。