论文部分内容阅读
随着支持多线程技术的操作系统与多核处理器技术的普及,多线程技术不再是一个很遥远的话题。我们在享受着Microsoft Word编写文档与Netscape Firefox浏览网页带来便利的同时,也希望构造自己的多线程应用,但是多线程程序设计相对传统的程序设计而言还是很困难并且容易出错。在多线程程序设计中,很容易因为没有使用同步保护机制从而导致产生数据竞争故障,但是该故障很难通过一两次运行程序而发现,并且纵使发现有数据竞争故障,针对该故障的调试信息也非常难以获取。因此,研究如何有效的检测多线程程序中数据竞争故障并根据被测程序的实际情况给予程序设计人员有效的故障信息,是一个非常值得研究的问题。目前,有很多专家学者在数据竞争故障的检测方面做出了不少工作,其中利用lockset算法来检测数据竞争故障是该领域的主流做法,因而从lockset算法派生出Racer算法、Goodlock算法等。由于基于lockset算法的检测是采用了动态测试方法,即需要运行待测程序,所以本文引入面向方面编程技术(AOP,Aspect OrientedProgramming),对待测程序设置切入点来在线监测待测程序的运行状态,通过切入点能够更为准确的获取待测程序运行时的现场数据,并通过定义多线程程序变量状态图和变量集合用于对lockset算法进行有效的补充,在此基础上提出了基于变量状态图与锁集的数据竞争故障动态检测算法,并通过该算法对数据竞争故障进行了有效检测。本文的主要工作如下:(1)研究了面向方面编程技术在程序动态测试中的应用研究了面向方面编程技术的原理、特点与功能,特别是面向方面编程技术中的切入点设置问题,包括针对待测方法的切入点以及对变量的构造函数切入点的设置问题,以及在程序动态检测中的应用方式。(2)基于lockset算法的数据竞争故障检测方法的研究针对lockset算法所存在的问题,定义了一种用于描述多线程程序中变量状态的变量状态图和记录程序运行时变量的变量集合,通过变量状态图使原有lockset检测算法降低误报率,通过变量集合使原有lockset检测算法支持运行时期的变量分配,即动态内存变量,在此基础上提出基于变量状态图与锁集的数据竞争故障动态检测算法。该算法减少了误报情况的发生,使检测更为有效。给出了多线程程序中数据竞争故障动态检测的系统框架。(3)实验验证与结果分析利用AspectJ完成对待测程序的切入点设置与运行事件获取工作,利用Java和AspectJ实现了多线程程序中数据竞争故障检测系统原型。以多线程程序访问变量(包括读写操作)为例,使用本文提出的多线程数据竞争故障检测方法进行了实验,发现该方法较之lockset算法减少了误报的情况,使检测更为有效,并且提供了lockset算法所不能提供的故障现场信息。