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.一种程序死锁的测试方法,其特征在于,包括:在被测试程序启动后,侦听所述被测试程序中的线程的处理指令;如果侦听到所述线程的锁指令,记录所述线程的锁对象信息序列;其中,所述锁指令包括加锁指令和解锁指令;所述锁对象信息序列包括:所述加锁指令对应的加锁对象信息和所述解锁指令对应的解锁对象信息;当所述被测试程序停止运行时,获取各个线程的锁对象信息序列中的最简加锁序列;其中,所述最简加锁序列为带有嵌套关系的加锁对象序列;将各个所述线程的最简加锁序列中相同的最简加锁序列合并;绘制合并后的所述最简加锁序列的有向图;基于绘制出的所述有向图确定所述被测试程序的死锁信息。
【技术特征摘要】
1.一种程序死锁的测试方法,其特征在于,包括:在被测试程序启动后,侦听所述被测试程序中的线程的处理指令;如果侦听到所述线程的锁指令,记录所述线程的锁对象信息序列;其中,所述锁指令包括加锁指令和解锁指令;所述锁对象信息序列包括:所述加锁指令对应的加锁对象信息和所述解锁指令对应的解锁对象信息;当所述被测试程序停止运行时,获取各个线程的锁对象信息序列中的最简加锁序列;其中,所述最简加锁序列为带有嵌套关系的加锁对象序列;将各个所述线程的最简加锁序列中相同的最简加锁序列合并;绘制合并后的所述最简加锁序列的有向图;基于绘制出的所述有向图确定所述被测试程序的死锁信息。2.根据权利要求1所述的方法,其特征在于,所述方法还包括:如果被测试程序启动,启动第一定时器;如果所述第一定时器计时停止,查找已结束的线程;从查找到的所述已结束的线程的各个锁对象信息序列中,分别提取出具有嵌套关系的加锁对象序列,得到所述已结束的线程的最简加锁序列;清空所述已结束的线程的锁对象信息序列,并启动所述第一定时器重新计时。3.根据权利要求2所述的方法,其特征在于,从查找到的所述已结束的线程的各个锁对象信息序列中,分别提取出具有嵌套关系的加锁对象序列,得到所述已结束的线程的最简加锁序列的步骤,包括:对查找到的所述已结束的线程的每个锁对象信息序列,均按照元素先后顺序读取当前线程的锁对象信息序列中的元素,对于每个读取到的元素均执行如下步骤:检查所述元素是否为加锁对象信息;如果所述元素为加锁对象信息,将所述加锁对象信息添加至所述锁对象信息序列的当前最简序列;如果所述元素为解锁对象信息,复制所述当前最简序列,将复制的所述当前最简序列作为下一个最简序列,从所述下一个最简序列中删除所述解锁对象信息对应的加锁对象信息;对所述当前最简序列中的重复元素进行去重处理,检查所述当前线程的最简序列集合中是否存在与去重后的当前最简序列相互包含的最简序列;如果存在,则在所述最简序列集合中保留相互包含的最简序列中较长的序列;如果不存在,将去重后的当前最简序列加入至所述最简序列集合中;将删除所述锁对象信息后的下一个最简序列作为当前最简序列,继续读取所述锁对象信息序列中的下一个元素;当所述锁对象信息序列中的元素均遍历完,读取所述当前线程的下一个锁对象信息序列中的元素,继续返回所述检查所述元素是否为加锁对象信息的步骤;如果所述当前线程的所有锁对象信息序列均遍历完,将下一个所述已结束的线程作为新的当前线程,读取新的所述当前线程的锁对象信息序列中的元素,继续返回所述检查所述元素是否为加锁对象信息的步骤;如果查找到的所述已结束的线程的每个锁对象信息序列均遍历完,将每个所述已结束的线程的最简序列集合作为所述已结束的线程的最简加锁序列。4.根据权利要求2所述的方法,其特征在于,所述方法还包括:如果被测试程序启动,启动第二定时器;如果所述第二定时器计时停止,停止所述被测试程序的运行,停止所述第一定时器的计时,将未结束的线程设置为结束。5.根据权利要求1所述的方法,其特征在于,将各个所述线程的最简加锁序列中相同的最简加锁序列合并的步骤,包括:检查各个所述线程的最简加锁序列中是否存在相同的最简加锁序列;如果存在相同的最简加锁序列,保留相同的最简加锁序列中的一个,为保留的所述最简加锁序列设置重复标识。6.根据权利要求1所述的方法,其特征在于,绘制合并后的所述最简加锁序列的有向图的步骤,包括:对于合并后的每个所述最简加锁序列,均执行如下步骤:读取所述最简加锁序列中的第一个元素,如果不存在包含所述第一个元素的已创建的有向图,则创建以所述第一个元素为首节点的有向图作为当前图;如果存在包含所述第一个元素的已创建的有向图,将所述包含所述第一个元素的已创建的有向图作为当前图;逐一读取所述最简加锁序列中的后续元素,判断是否存在包含所述后续元素的已创建的有向图;如果不存在包含所述后续元素的已创建的有向图,则在所述当前图中增加所述后续元素以及所述后续元素的前一个元素指向所述后续元素的连线,并为所述连线配置对应的线程信息;如果存在包含所述后续元素的已创建的有向图,则判断是否存在所述后续元素的前一个元素指向所述后续元素的连线;如果不存在所述连线,则在所述当前图中增加所述后续元素的前一个元素指向所述后续元素的连线;如果存在所述连线,为所述连线配置对应的线程信息。7.根据权利要求6所述的方法,其特征在于,基于绘制出的所述有向图确定所述被测试程序的死锁信息的步骤,包括:判断所述有向图中是否存在环路;如果存在...
【专利技术属性】
技术研发人员:郭祥斌,
申请(专利权)人:新华三技术有限公司合肥分公司,
类型:发明
国别省市:安徽,34
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。