程序死锁的测试方法、装置和设备制造方法及图纸

技术编号:20944182 阅读:24 留言:0更新日期:2019-04-24 02:16
本公开提供了一种程序死锁的测试方法、装置和设备,在被测试程序启动后,通过侦听被测试程序中线程的处理指令的方法,记录各个线程的用于表征该线程加锁与解锁流程的锁对象信息序列,并在被测试程序停止运行后,获取各个线程的锁对象信息序列包含的带有嵌套关系的最简加锁序列,然后根据该最简加锁序列绘制有向图,从而根据该有向图确定被测试程序的死锁信息。该方式通过自动收集被测试程序运行中死锁隐患的相关数据,以该相关数据为依据利用有向图确定相应程序的死锁信息,从而实现了死锁隐患的自动检测,有效提高了发现死锁隐患的概率。

Program deadlock testing methods, devices and equipment

The present disclosure provides a method, apparatus and equipment for testing program deadlock. After the test program is started, by listening to the processing instructions of the threads in the test program, the sequence of lock object information used by each thread to represent the process of lock and unlock of the thread is recorded, and after the test program stops running, the bands contained in the sequence of lock object information of each thread are obtained. The simplest lock sequence with nested relations is then plotted according to the simplest lock sequence, and the deadlock information of the tested program is determined according to the directed graph. By automatically collecting the relevant data of the deadlock hidden danger in the running of the tested program and using the directed graph to determine the deadlock information of the corresponding program, the method realizes the automatic detection of the deadlock hidden danger and effectively improves the probability of discovering the deadlock hidden danger.

【技术实现步骤摘要】
程序死锁的测试方法、装置和设备
本公开涉及计算机
,尤其是涉及程序死锁的测试方法、装置和设备。
技术介绍
Java是目前最流行的编程语言之一,在全球有非常多的大型服务程序(如Web程序)采用Java作为主要编程语言。Java语言编写的程序被编译为字节码后,由JVM(JavaVirtualMachine,Java虚拟机)负责解释执行。Java语言支持多线程机制,一般大型服务程序的开发者在书写Java程序时,都会编写代码启动多个不同的线程来并发地完成任务。如果程序开发者编写的代码,采用了不恰当的线程间同步机制,例如参见图1,如果线程T1已加锁lock1(lock1为锁对象标识),然后再请求加锁lock2(lock2为锁对象标识),然后才能执行一个事务;此时如果lock2已被线程T2占用,线程T1就会停止执行,等待线程T2释放lock2;如果线程T2在持有锁lock2期间,期望加锁lock1,就必须等待线程T1释放lock1,此时线程T2就会停止执行,等待T1释放lock1;从上述描述看,T1和T2都会停止执行,且永远没有时机再恢复执行,从而导致死锁现象。死锁现象一旦发生,服务程序就有很大可能无法继续正常提供服务。现有技术中通常在程序发布前,对程序进行评审以检查程序中的死锁问题,由于大型程序的设计和编码都比较复杂,存在隐患的代码的调用关系也非常庞大,通过肉眼发现死锁隐患的概率较低。
技术实现思路
有鉴于此,本公开的目的在于提供一种程序死锁的测试方法、装置和设备,以实现死锁隐患的自动检测,有效提高发现死锁隐患的概率。为了实现上述目的,本公开采用的技术方案如下:第一方面,本公开提供了一种程序死锁的测试方法,包括:在被测试程序启动后,侦听被测试程序中的线程的处理指令;如果侦听到该线程的锁指令,记录该线程的锁对象信息序列;其中,该锁指令包括加锁指令和解锁指令;该锁对象信息序列包括:该加锁指令对应的加锁对象信息和该解锁指令对应的解锁对象信息;当被测试程序停止运行时,获取上述各个线程的锁对象信息序列中的最简加锁序列;其中,该最简加锁序列为带有嵌套关系的加锁对象序列;将各个线程的最简加锁序列中相同的最简加锁序列合并;绘制合并后的最简加锁序列的有向图;基于绘制出的有向图确定被测试程序的死锁信息。第二方面,本公开提供了一种程序死锁的测试装置,包括:指令侦听模块,用于在被测试程序启动后,侦听被测试程序中的线程的处理指令;信息记录模块,用于当侦听到线程的锁指令时,记录该线程的锁对象信息序列;其中,该锁指令包括加锁指令和解锁指令;该锁对象信息序列包括:该加锁指令对应的加锁对象信息和该解锁指令对应的解锁对象信息;序列获取模块,用于当被测试程序停止运行时,获取上述各个线程的锁对象信息序列中的最简加锁序列;其中,该最简加锁序列为带有嵌套关系的加锁对象序列;序列合并模块,用于将各个线程的最简加锁序列中相同的最简加锁序列合并;绘制模块,用于绘制合并后的最简加锁序列的有向图;死锁确定模块,用于基于绘制出的有向图确定被测试程序的死锁信息。第三方面,本公开实施方式提供了一种程序死锁的测试设备,包括处理器和机器可读存储介质,所述机器可读存储介质存储有能够被所述处理器执行的机器可执行指令,所述处理器执行所述机器可执行指令以实现上述方法。第四方面,本公开实施方式提供了一种机器可读存储介质,所述机器可读存储介质存储有机器可执行指令,所述机器可执行指令在被处理器调用和执行时,所述机器可执行指令促使所述处理器实现上述方法。上述程序死锁的测试方法、装置、设备和机器可读存储介质,在被测试程序启动后,通过侦听被测试程序中线程的处理指令的方法,记录各个线程的用于表征该线程加锁与解锁流程的锁对象信息序列,并在被测试程序停止运行后,获取各个线程的锁对象信息序列包含的带有嵌套关系的最简加锁序列,然后根据该最简加锁序列绘制有向图,从而根据该有向图确定被测试程序的死锁信息。该方式通过自动收集被测试程序运行中死锁隐患的相关数据,以该相关数据为依据利用有向图确定相应程序的死锁信息,从而实现了死锁隐患的自动检测,有效提高了发现死锁隐患的概率。本公开的其他特征和优点将在随后的说明书中阐述,或者,部分特征和优点可以从说明书推知或毫无疑义地确定,或者通过实施本公开的上述技术即可得知。为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施方式,并配合所附附图,作详细说明如下。附图说明为了更清楚地说明本公开具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本公开的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为现有技术提供的一种程序运行过程中死锁现象示意图;图2为本公开实施方式提供的一种程序死锁的测试方法的流程示意图;图3为本公开实施方式提供的另一种程序死锁的测试方法的流程示意图;图4为本公开实施方式提供的一种有向图绘制的流程示意图;图5为本公开实施方式提供的一种扩展后的JVM进行死锁检测的示意图;图6为本公开实施方式提供的一种具体实现实例中各线程的执行指令的时序图;图7为本公开实施方式提供的一种被测试程序启动后映射表中记录的数据示意图;图8为本公开实施方式提供的一种第一定时器超时归并处理后的映射表中记录的数据示意图;图9为本公开实施方式提供的一种第二定时器超时归并处理后的映射表中记录的数据示意图;图10为本公开实施方式提供的有向图T1的示意图;图11为本公开实施方式提供的有向图T2的示意图;图12为本公开实施方式提供的一种程序死锁的测试装置的结构示意图;图13为本公开实施方式提供的另一种程序死锁的测试装置的结构示意图;图14为本公开实施方式提供的另一种程序死锁的测试装置的结构示意图;图15为本公开实施方式提供的一种程序死锁的测试设备的结构示意图。具体实施方式为使本公开实施方式的目的、技术方案和优点更加清楚,下面将结合附图对本公开的技术方案进行清楚、完整地描述,显然,所描述的实施方式是本公开一部分实施方式,而不是全部的实施方式。基于本公开中的实施方式,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施方式,都属于本公开保护的范围。需要说明的是,上述各方法实施方式均采用递进的方式描述,每个实施方式重点说明的都是与其他实施方式的不同之处,各个实施方式之间相同相似的部分互相参见即可。目前JVM在解释执行Java字节码时,可能会在不同的CPU(CentralProcessingUnit,中央处理器)上并行执行。在这种并行处理的过程中,如果程序开发者编写的代码,采用了不恰当的线程间同步机制,则可能会导致死锁,基于此,本公开实施例提供了一种程序死锁的测试方法、装置、设备及机器可读存储介质,以实现了死锁隐患的自动检测,有效提高了发现死锁隐患的概率。本公开实施例提供的程序死锁的测试技术,可以对Java和其它类似程序进行死锁检测,如果是Java程序,可以但不限于在OpenJDK的基础上,定制开发JVM,如在现有JVM进行扩展,增加上述程序死锁的测试方法的对应功能模块,然后利用该扩展后的JVM执行上述程序死锁的测试方法。参见图2所示本文档来自技高网...

【技术保护点】
1.一种程序死锁的测试方法,其特征在于,包括:在被测试程序启动后,侦听所述被测试程序中的线程的处理指令;如果侦听到所述线程的锁指令,记录所述线程的锁对象信息序列;其中,所述锁指令包括加锁指令和解锁指令;所述锁对象信息序列包括:所述加锁指令对应的加锁对象信息和所述解锁指令对应的解锁对象信息;当所述被测试程序停止运行时,获取各个线程的锁对象信息序列中的最简加锁序列;其中,所述最简加锁序列为带有嵌套关系的加锁对象序列;将各个所述线程的最简加锁序列中相同的最简加锁序列合并;绘制合并后的所述最简加锁序列的有向图;基于绘制出的所述有向图确定所述被测试程序的死锁信息。

【技术特征摘要】
1.一种程序死锁的测试方法,其特征在于,包括:在被测试程序启动后,侦听所述被测试程序中的线程的处理指令;如果侦听到所述线程的锁指令,记录所述线程的锁对象信息序列;其中,所述锁指令包括加锁指令和解锁指令;所述锁对象信息序列包括:所述加锁指令对应的加锁对象信息和所述解锁指令对应的解锁对象信息;当所述被测试程序停止运行时,获取各个线程的锁对象信息序列中的最简加锁序列;其中,所述最简加锁序列为带有嵌套关系的加锁对象序列;将各个所述线程的最简加锁序列中相同的最简加锁序列合并;绘制合并后的所述最简加锁序列的有向图;基于绘制出的所述有向图确定所述被测试程序的死锁信息。2.根据权利要求1所述的方法,其特征在于,所述方法还包括:如果被测试程序启动,启动第一定时器;如果所述第一定时器计时停止,查找已结束的线程;从查找到的所述已结束的线程的各个锁对象信息序列中,分别提取出具有嵌套关系的加锁对象序列,得到所述已结束的线程的最简加锁序列;清空所述已结束的线程的锁对象信息序列,并启动所述第一定时器重新计时。3.根据权利要求2所述的方法,其特征在于,从查找到的所述已结束的线程的各个锁对象信息序列中,分别提取出具有嵌套关系的加锁对象序列,得到所述已结束的线程的最简加锁序列的步骤,包括:对查找到的所述已结束的线程的每个锁对象信息序列,均按照元素先后顺序读取当前线程的锁对象信息序列中的元素,对于每个读取到的元素均执行如下步骤:检查所述元素是否为加锁对象信息;如果所述元素为加锁对象信息,将所述加锁对象信息添加至所述锁对象信息序列的当前最简序列;如果所述元素为解锁对象信息,复制所述当前最简序列,将复制的所述当前最简序列作为下一个最简序列,从所述下一个最简序列中删除所述解锁对象信息对应的加锁对象信息;对所述当前最简序列中的重复元素进行去重处理,检查所述当前线程的最简序列集合中是否存在与去重后的当前最简序列相互包含的最简序列;如果存在,则在所述最简序列集合中保留相互包含的最简序列中较长的序列;如果不存在,将去重后的当前最简序列加入至所述最简序列集合中;将删除所述锁对象信息后的下一个最简序列作为当前最简序列,继续读取所述锁对象信息序列中的下一个元素;当所述锁对象信息序列中的元素均遍历完,读取所述当前线程的下一个锁对象信息序列中的元素,继续返回所述检查所述元素是否为加锁对象信息的步骤;如果所述当前线程的所有锁对象信息序列均遍历完,将下一个所述已结束的线程作为新的当前线程,读取新的所述当前线程的锁对象信息序列中的元素,继续返回所述检查所述元素是否为加锁对象信息的步骤;如果查找到的所述已结束的线程的每个锁对象信息序列均遍历完,将每个所述已结束的线程的最简序列集合作为所述已结束的线程的最简加锁序列。4.根据权利要求2所述的方法,其特征在于,所述方法还包括:如果被测试程序启动,启动第二定时器;如果所述第二定时器计时停止,停止所述被测试程序的运行,停止所述第一定时器的计时,将未结束的线程设置为结束。5.根据权利要求1所述的方法,其特征在于,将各个所述线程的最简加锁序列中相同的最简加锁序列合并的步骤,包括:检查各个所述线程的最简加锁序列中是否存在相同的最简加锁序列;如果存在相同的最简加锁序列,保留相同的最简加锁序列中的一个,为保留的所述最简加锁序列设置重复标识。6.根据权利要求1所述的方法,其特征在于,绘制合并后的所述最简加锁序列的有向图的步骤,包括:对于合并后的每个所述最简加锁序列,均执行如下步骤:读取所述最简加锁序列中的第一个元素,如果不存在包含所述第一个元素的已创建的有向图,则创建以所述第一个元素为首节点的有向图作为当前图;如果存在包含所述第一个元素的已创建的有向图,将所述包含所述第一个元素的已创建的有向图作为当前图;逐一读取所述最简加锁序列中的后续元素,判断是否存在包含所述后续元素的已创建的有向图;如果不存在包含所述后续元素的已创建的有向图,则在所述当前图中增加所述后续元素以及所述后续元素的前一个元素指向所述后续元素的连线,并为所述连线配置对应的线程信息;如果存在包含所述后续元素的已创建的有向图,则判断是否存在所述后续元素的前一个元素指向所述后续元素的连线;如果不存在所述连线,则在所述当前图中增加所述后续元素的前一个元素指向所述后续元素的连线;如果存在所述连线,为所述连线配置对应的线程信息。7.根据权利要求6所述的方法,其特征在于,基于绘制出的所述有向图确定所述被测试程序的死锁信息的步骤,包括:判断所述有向图中是否存在环路;如果存在...

【专利技术属性】
技术研发人员:郭祥斌
申请(专利权)人:新华三技术有限公司合肥分公司
类型:发明
国别省市:安徽,34

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1