一、课题任务
对程序进行动态分析,将程序运行中的轨迹信息以直观的图标或者数字形式表示,有助于程序设计人员快速熟悉程序,了解程序的调用关系以及对程序整体性能影响最大的部分,并为程序优化提供一定的参考数据,对分析和优化程序提供帮助。
本课题旨在通过学习程序分析,并且通过研究pin工具的相关技术和功能从而开发linux环境下程序运行轨迹剖析工具。本课题的具体要求如下:
1、熟悉Linux环境和C语言程序的编程规范和编程技巧;
2、知道程序分析工具pin的运行使用;
3、熟悉程序分析特点及方法;
4、能够准确利用程序分析工具pin开发并分析程序运行轨迹。
二、 文献的查阅和理解
(1)程序分析
程序分析是指对计算机程序行为进行自动分析的过程,主要包括静态分析和动态分析两种策略。程序分析主要应用在程序优化、程序正确性验证等方面。相关技术包括类型系统、抽象解释、程序验证和模型检查等等。
程序分析是以某种语言书写的程序为对象,对其内部的运作流程进行分析。程序分析的目的主要有三点:一是通过程序内部各个模块之间的调用关系,整体上把握程序的运行流程,从而更好地理解程序,从中汲取有价值的内容。二是以系统优化为目的,通过对程序中关键函数的跟踪或者运行时信息的统计,找到系统性能的瓶颈,从而采取进一步行动对程序进行优化。最后一点,程序分析也有可能用于系统测试和程序调试中。当系统跟踪起来比较复杂,而某个BUG又比较难找时,可以通过一些特殊的数据构造一个测试用例,然后将分析到的函数调用关系和运行时实际的函数调用关系进行对比,从而找出错误代码的位置。
本次课题主要是进行动态分析,即主要通过软件来得到程序的动态行为信息,包括分析软件的覆盖率、监控内存的状态,分析变量执行轨迹、提取程序不变式等等。相比较静态分析而言,动态分析基于程序运行时信息进行分析,有利于用户更好地理解软件的行为。
(2)Pin工具
Pin 是intel公司开发的用于程序测试的一款工具软件,支持32位、64位的Linux和Windows的可执行程序,可以检测程序运行过程中的命令、内存、地址等的详细信息。
Pin允许工具插入任意代码(用C或C++)在可执行文件中的任意位置。该代码在可执行程序运行时动态添加了代码。这也使得有可能将Pin连接到一个已经运行的过程。
Pin提供了丰富的API,抽象了底层指令集的特点,允许上下文信息,如登记内容作为参数传递给注入的代码。Pin自动保存和恢复,被注入的代码使应用程序继续工作寄存器。有限的访问符号和调试信息是可用的。
Pin包括大量实例仪表工具如基本块的定义,缓存模拟器的源代码,指令跟踪发生器,等很容易派生出新的工具的使用示例作为模板。
(3)程序插装技术
程序插装的概念是由J.C.Huang教授首次提出的,程序插装是在不改变被测程序逻辑正确性和完整性的基础上,在适当的程序点上插入一些控制语句(一般称为“探针”),通过执行探针,抛出程序的运行特征数据。基于对这些特征数据的分析,揭示程序的内部行为和特征。基于程序插装的动态分析主要分为 3 步:
(1) 探针插装阶段。该阶段对被分析程序进行静态分析,边分析边寻找特定插装点,根据插装点的类型插入相应探针。这部分工作由插装器完成。
(2) 编译执行阶段。该阶段将插装后的程序重新编译,生成可执行程序并运行该程序,输出预期格式的动态数据。这个过程一般需要插装探针库的支持。
(3)数据处理阶段。该阶段分析整合第 2 阶段得到的数据,和源程序做匹配,(若有静态分析结果,根据需要和静态分析结果做关联),统计数据,制作报表。这部分工作由动态信息合并器完成。
三、 实施方案
3 结构设计
即将研发的基于linux系统与intel pin的程序分析测试工具旨在给程序设计人员提供一个友好、方便的计算机软件。为C语言程序设计人员快速理解程序提供帮助。程序设计人员可以通过建立测试项目并且导入C语言源程序而得知该程序的函数调用关系与一些参考数据,以助于程序得到更好的优化。
图1 系统结构图
基本功能模块:
(一)程序运行指令记录模块。该模块用于记录程序运行指令的总数。
(二)程序指令内存地址查询模块。此模块可用于显示指令执行的内存地址。
(三)函数关系调用模块。此模块显示出源程序函数被调用的次数。
(四)内存地址检测模块。此模块可用于检测指令读取和写入的内存地址。
3.2 任务描述
1、熟悉Linux环境和C语言程序的编程规范和编程技巧;
2、知道程序分析工具pin的运行使用;
3、熟悉程序分析特点及方法;
4、能够准确利用程序分析工具pin开发并分析程序运行轨迹。
3.3 进度安排
1.认真学习程序分析和pin工具,完成开题报告 2 周
2.熟悉Linux操作系统的基本使用方法,能够在该系统下进行简单操作 2 周
3.熟悉pin工具,了解pin tools的相关功能 3 周
4.利用pin开发linux环境下程序运行轨迹剖析工具 3 周
5.完善程序运行轨迹剖析工具,并进行优化和测试 2 周
6.整理资料,论文写作,准备答辩 2 周
四、参考文献:
[1] Luk C K, Cohn R, Muth R, et al. Pin: Building Customized Program Analysis Tools with Dynamic Instrumentation[C]. Proceedings of the ACM SIGPLAN Conference on Programming Language Design and Implementation,2005:190-200.
[2] Jalan R, Kejariwal A. Trin-Trin: Who’s Calling? A Pin-Based Dynamic Call Graph Extraction Framework[J]. International Journal of Parallel Programming, 2012, 40(4):410-442.
[3] Chabbi M, Liu X, Mellor-Crummey J. Call Paths for Pin Tools[C]. Proceedings of IEEE/ACM International Symposium on Code Generation & Optimization, 2014:76-78.
[4]曾佳平,杨秋辉,汪华龙,等. 基于动态插桩的C/C++内存泄漏检测工具的设计与实现[J]. 计算机应用研究,2015,32(6):1737-1741.
[5] 钟芳挺, 刘超, 金茂忠. 程序动态分析系统中插桩方式的改进[J]. 计算机工程与设 计,2007,28(19):4585-4587.
[6] M. Uhgr, R. Cohn. Analyzing dynamic binary instrumentation over head[C]. Proceedings of Workshop on Binary Instrumentation and Application, 2007:56-64.
[7]郑人杰.计算机软件测试技术[M]. 北京:清华大学出版,1990:10-20.
[8]代声馨,洪玫,郭鑫宇,张鹏,祁琳莹. 基于动态插桩的程序分析工具的性能改进[J]. 计算机应用研究, 2013, 30(7):2087-2090
[9]孙昌爱,靳若明,刘超,金茂忠. 实时嵌入式软件的测试技术[J].小型微型计算机系统.2000,21(9):920-924
[10]张荣,王曙燕. 基于插桩技术的动态测试研究与实现[J]. 现代电子技术, 2011, 34(4):50-52.
[11]J.C.Huang. Instrumenting programs for data flow analysis[R].TR-UH-CS-77-4. Univ. Of Houston. May 1977
[12]周晓宇,黄文伟,史亮,徐宝文. 基于源代码插桩的C程序内存使用错误动态检测[J]. 舰船电子工程, 2004, 24(6):70-73
[13]曾锃,赵建华. 基于程序分析的代码查询技术[J]. 计算机科学, 2012,39(2):143-147
[14]Back M,Charney M,Cohn R,et al. Analyzing parallel programs with Pin[J].Computer,2010,43(3):34-41
[15]孙昌爱,金茂忠. 基于程序插装的动态测试技术实现[J]. 小型微型计算机系统,2001,22(12),1475-1479
[16]高海昌,冯博琴,何杭军,朱利. Linux平台下基于源代码插装的动态内存检测[J].小型微型计算机系统,2006,27(9):1647-1651
|