CN111767155A - 死锁检测方法、装置、设备及计算机可读存储介质 - Google Patents
死锁检测方法、装置、设备及计算机可读存储介质 Download PDFInfo
- Publication number
- CN111767155A CN111767155A CN202010785310.4A CN202010785310A CN111767155A CN 111767155 A CN111767155 A CN 111767155A CN 202010785310 A CN202010785310 A CN 202010785310A CN 111767155 A CN111767155 A CN 111767155A
- Authority
- CN
- China
- Prior art keywords
- thread
- identifier
- determining
- deadlock
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/524—Deadlock detection or avoidance
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请实施例提供了一种死锁检测方法、装置、设备及计算机可读存储介质,该方法包括:获取目标线程集合中的每一第一线程的线程标识,目标线程集合包括至少一个第一线程,第一线程在运行过程中处于阻塞状态;对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用被锁对象的第二线程的线程标识;根据第一线程的线程标识、以及第二线程的线程标识,确定至少一个死锁组的标识,死锁组包括处于循环等待状态下的至少一个第一线程和至少一个第二线程。该方法通过处于阻塞状态的第一线程和占用被锁对象的第二线程,确定死锁组,从而定位到死锁,提升了死锁检测的效率和准确度。
Description
技术领域
本申请涉及计算机技术领域,具体而言,本申请涉及一种死锁检测方法、装置、设备及计算机可读存储介质。
背景技术
现有技术中当安卓系统android的应用程序在UI(User Interface,用户界面)线程被阻塞太长时间,就会出现ANR(Application Not Responding,应用程序无响应),通常出现ANR,系统会弹出一个提示提示框,让用户知道,该应用程序正在被阻塞,是否继续等待还是关闭。对于安卓系统android死锁造成的ANR的问题,除了可以捕获主线程堆栈外,还可以通过获取/data/anr/traces.txt文件,trace文件中包含了线程信息和锁的信息,借助trace文件可以分析卡死的原因。但是,随着android版本升高,安全性也做了提高,在android 8及以上的版本且没有获得android的超级用户权限的机器上,应用程序app已无权限获取/data/anr/traces.txt文件,因此,对于死锁的问题就无法定位解决了。
发明内容
本申请针对现有的方式的缺点,提出一种死锁检测方法、装置、电子设备及计算机可读存储介质,用以解决如何检测到死锁的问题。
第一方面,本申请提供了一种死锁检测方法,包括:
获取目标线程集合中的每一第一线程的线程标识,目标线程集合包括至少一个第一线程,第一线程在运行过程中处于阻塞状态;
对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用被锁对象的第二线程的线程标识;
根据第一线程的线程标识、以及第二线程的线程标识,确定至少一个死锁组的标识,死锁组包括处于循环等待状态下的至少一个第一线程和至少一个第二线程。
可选地,获取目标线程集合中的每一第一线程的线程标识,包括:
确定与目标线程集合对应的处于操作系统的第一层的线程对象;
通过反射方式得到线程对象中的成员对象;
通过成员对象,获取目标线程集合中的每一第一线程的线程标识。
可选地,通过成员对象,获取目标线程集合中的每一第一线程的线程标识,包括:
通过成员对象,确定线程对象处于操作系统的第二层的地址;
根据线程对象处于第二层的地址和预设的地址偏移量,确定目标线程集合中的每一第一线程的线程标识的存储地址;
从每一第一线程的线程标识的存储地址,获取每一第一线程的线程标识。
可选地,第一层包括应用框架层,第二层包括系统运行库层。
可选地,确定该第一线程等待占用的被锁对象,包括:
调用预设的第一函数,确定该第一线程等待占用的被锁对象,第一函数包括私有函数GetContendedMonitor。
可选地,确定占用被锁对象的第二线程的线程标识,包括:
调用预设的第二函数,确定占用被锁对象的第二线程的线程标识的存储地址,第二函数包括内部函数GetLockOwnerThreadId;
从第二线程的线程标识的存储地址,获取第二线程的线程标识。
可选地,根据第一线程的线程标识、以及第二线程的线程标识,确定死锁组的标识,包括:
检测各个第一线程以及各个第二线程之间存在的循环等待状态;
对于检测到的每一种循环等待状态,将处于该循环等待状态下的至少一个第一线程和至少一个第二线程的各线程标识,构成一个死锁组的标识。
第二方面,本申请提供了一种死锁检测装置,包括:
第一处理模块,用于获取目标线程集合中的每一第一线程的线程标识,目标线程集合包括至少一个第一线程,第一线程在运行过程中处于阻塞状态;
第二处理模块,用于对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用被锁对象的第二线程的线程标识;
第三处理模块,用于根据第一线程的线程标识、以及第二线程的线程标识,确定至少一个死锁组的标识,死锁组包括处于循环等待状态下的至少一个第一线程和至少一个第二线程。
可选地,第一处理模块,具体用于确定与目标线程集合对应的处于操作系统的第一层的线程对象;通过反射方式得到线程对象中的成员对象;通过成员对象,获取目标线程集合中的每一第一线程的线程标识。
可选地,第一处理模块,具体用于通过成员对象,确定线程对象处于操作系统的第二层的地址;根据线程对象处于第二层的地址和预设的地址偏移量,确定目标线程集合中的每一第一线程的线程标识的存储地址;从每一第一线程的线程标识的存储地址,获取每一第一线程的线程标识。
可选地,第一层包括应用框架层,第二层包括系统运行库层。
可选地,第二处理模块,具体用于调用预设的第一函数,确定该第一线程等待占用的被锁对象,第一函数包括私有函数GetContendedMonitor。
可选地,第二处理模块,具体用于调用预设的第二函数,确定占用被锁对象的第二线程的线程标识的存储地址,第二函数包括内部函数GetLockOwnerThreadId;从第二线程的线程标识的存储地址,获取第二线程的线程标识。
可选地,第三处理模块,具体用于检测各个第一线程以及各个第二线程之间存在的循环等待状态;对于检测到的每一种循环等待状态,将处于该循环等待状态下的至少一个第一线程和至少一个第二线程的各线程标识,构成一个死锁组的标识。
第三方面,本申请提供了一种电子设备,包括:处理器、存储器和总线;
总线,用于连接处理器和存储器;
存储器,用于存储操作指令;
处理器,用于通过调用操作指令,执行本申请第一方面的死锁检测方法。
第四方面,本申请提供了一种计算机可读存储介质,存储有计算机程序,计算机程序被用于执行本申请第一方面的死锁检测方法。
本申请实施例提供的技术方案,至少具有如下有益效果:
获取目标线程集合中的每一第一线程的线程标识,目标线程集合包括至少一个第一线程,第一线程在运行过程中处于阻塞状态;对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用被锁对象的第二线程的线程标识;通过处于阻塞状态的第一线程和占用被锁对象的第二线程,确定死锁组,从而在android 8及以上的版本且没有获得android的超级用户权限的机器上,能够定位到死锁,提升了死锁检测的效率和准确度。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对本申请实施例描述中所需要使用的附图作简单地介绍。
图1为本申请实施例提供的一种死锁检测方法的流程示意图;
图2为本申请实施例提供的成员对象nativePeer的示意图;
图3为本申请实施例提供的第一线程的线程标识的示意图;
图4为本申请实施例提供的私有函数GetContendedMonitor的示意图;
图5为本申请实施例提供的内部函数GetLockOwnerThreadId的示意图;
图6为本申请实施例提供的死锁检测的示意图;
图7为本申请实施例提供的死锁检测的示意图;
图8为本申请实施例提供的一种死锁检测装置的结构示意图;
图9为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
为使得本申请的发明目的、特征、优点能够更加的明显和易懂,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而非全部实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
下面详细描述本申请的实施例,该实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本申请,而不能解释为对本申请的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本申请的说明书中使用的措辞“包括”是指存在特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
为了更好的理解及说明本申请实施例的方案,下面对本申请实施例中所涉及到的一些技术用语进行简单说明。
死锁:死锁指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,两个或两个以上的线程都将无法推进下去;此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
ANR:ANR(Application Not Responding,应用程序无响应)指应用中一些特定的事件,例如用户触摸事件、广播等,在应用的主线程没有在规定的时间内处理完,系统自动做出终止应用运行的响应。应用程序无响应出现的原因主要是两个方面:一方面是应用进程自身引起的,例如:主线程阻塞、挂起、死循环;另一方面是应用进程的其他线程的CPU占用率高,使得主线程无法抢占到CPU时间片。
JAVA反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
锁:锁可以理解为内存中的一个整型数,拥有两种状态:空闲状态和上锁状态;加锁时,判断锁是否空闲,如果空闲,修改为上锁状态,返回成功;当已经上锁,则返回失败;解锁时,则把锁状态修改为空闲状态。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。对于代码块同步,也就是synchronized(lock){},lock这个对象就是锁,当两个并行的线程a和b,当a先进入同步块,即a先拿到lock对象,这时候a就相当于用一把锁把synchronized里面的代码锁住了,现在只有a才能执行这块代码,而b就只能等待a用完了lock对象锁之后才能进入同步块。
线程:线程(thread)是操作系统能够进行运算调度的最小单位;线程被包含在进程之中,是进程中的实际运作单位;一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程标识:每个线程有一个线程标识ID,线程标识ID只在线程所属的进程环境中有效。
Java线程的六种状态:初始(NEW)、运行(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)、超时等待(TIMED_WAITING)和终止(TERMINATED)。其中,初始(NEW):新创建了一个线程对象,但还没有调用start()方法。运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为运行。阻塞(BLOCKED):表示线程阻塞于锁。等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。终止(TERMINATED):表示该线程已经执行完毕。
线程对象:线程对象是线程类的实例对象,它是通过继承thread类或通过实现runnable接口得到;线程对象封装了线程的一些信息,一个线程对象的方法可以被任何线程运行。
系统运行库层:系统运行库层分为两部分,分别是C/C++程序库和Android运行时库。
应用框架层:应用框架层为开发人员提供了可以开发应用程序所需要的API,应用框架层是由Java代码编写的,可以称为Java Framework。
ART:Android runtime,Android系统的一种应用运行模式,ART模式可以实现更为流畅的安卓系统体验。在启用ART模式后,系统在安装应用的时候会进行一次预编译,在安装应用程序时会先将代码转换为机器语言存储在本地,这样在运行程序时就不会每次都进行一次编译了,执行效率也大大提升。
查找符号信息的技术:查找符号信息的技术利用可执行文件的文件结构导入表、导出表或者符号表等信息来查找函数在二进制文件的偏移,即查询函数在系统内存中的地址。
下面以具体的实施例对本申请的技术方案以及本申请的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本申请的实施例进行描述。
本申请实施例中提供了一种死锁检测方法,该方法的流程示意图如图1所示,该方法包括:
S101,获取目标线程集合中的每一第一线程的线程标识,目标线程集合包括至少一个第一线程,第一线程在运行过程中处于阻塞状态。
可选地,在应用程序无响应ANR状态时,获取全部的线程信息,全部的线程信息包括在运行过程中处于阻塞BLOCKED状态的至少一个第一线程;根据全部的线程信息,确定在运行过程中处于阻塞BLOCKED状态的至少一个第一线程,并获得在运行过程中处于阻塞BLOCKED状态的至少一个第一线程的线程列表,线程列表包括了至少一个第一线程,线程列表为目标线程集合。
可选地,线程信息包括线程状态、线程标识等,其中,线程状态包括初始NEW状态、运行RUNNABLE状态、阻塞BLOCKED状态、等待WAITING状态、超时等待TIMED_WAITING状态和终止TERMINATED状态。从全部的线程信息包括的线程标识对应的线程中筛选出线程状态为阻塞BLOCKED状态的线程,该处于阻塞BLOCKED状态的线程为第一线程。
可选地,目标线程集合中的每一个第一线程都有唯一的一个线程标识,遍历目标线程集合中的每一个第一线程,获取目标线程集合中的每一第一线程的线程标识。
可选地,获取目标线程集合中的每一第一线程的线程标识,包括步骤S1011-S1012:
步骤S1011,确定与目标线程集合对应的处于操作系统的第一层的线程对象。
可选地,确定与第一线程对应的处于操作系统的第一层的线程对象,其中,操作系统为安卓系统android,第一层为java层,第一线程的线程对象为处于java层的线程对象,线程对象为java.Lang.Thread对象。
步骤S1012,通过反射方式得到线程对象中的成员对象。
可选地,通过反射方式得到处于java层的线程对象中的成员对象nativePeer,其中,反射方式为JAVA反射机制,成员对象nativePeer如图2所示。
可选地,nativePeer的属性是私有的,但是java不能直接调用私有属性,所以要通过反射获取nativePeer。反射方式可以通过java的getDeclaredFiled方式来实现,即通过java的getDeclaredFiled方式得到nativePeer。
步骤S1013,通过成员对象,获取目标线程集合中的每一第一线程的线程标识。
可选地,通过成员对象nativePeer获取第一线程的线程标识。
可选地,步骤S1013,通过成员对象,获取目标线程集合中的每一第一线程的线程标识,包括步骤A1-A3:
步骤A1,通过成员对象,确定线程对象处于操作系统的第二层的地址。
可选地,针对Art结构的android系统,即android 5.0以上的系统,通过成员对象nativePeer,确定第一线程的线程对象处于android系统的native层的地址,其中,操作系统为android系统,第二层为native层。
可选地,nativePeer是一个值,这个值是一个内存地址,在native层这个内存地址就是一个指针,这个指针指向处于native层的线程对象,这个内存地址就是线程对象处于native层的地址。
步骤A2,根据线程对象处于第二层的地址和预设的地址偏移量,确定目标线程集合中的每一第一线程的线程标识的存储地址。
可选地,将第一线程的线程对象处于android系统的native层的地址与预设的地址偏移量之间求和,得到第一线程的线程标识的存储地址,其中,预设的地址偏移量为N,N为正整数,例如,N为3。
步骤A3,从每一第一线程的线程标识的存储地址,获取每一第一线程的线程标识。
可选地,当确定第一线程的线程标识的存储地址后,可以从存储地址中获取第一线程的线程标识。例如,如图3所示,第一线程的线程标识为thin_lock_thread_id。
可选地,第一层包括应用框架层,第二层包括系统运行库层。
可选地,应用框架层为java层,系统运行库层为native层。
S102,对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用被锁对象的第二线程的线程标识。
可选地,当第一线程在运行过程中处于阻塞BLOCKED状态时,第一线程被挂起等待一个锁,该锁对应第一线程待占用的被锁对象。被锁对象是第二线程占用的线程对象。
可选地,确定该第一线程等待占用的被锁对象,包括:
调用预设的第一函数,确定该第一线程等待占用的被锁对象,第一函数包括私有函数GetContendedMonitor。
可选地,在android系统的内核中,android系统管理java线程和锁的信息,其中,第一线程为java线程,锁的信息对应被锁对象。从java线程对应的thead.h文件中,可以查询到锁的信息存储在对象monitor_enter_object中。如图4所示,调用私有函数GetContendedMonitor,私有函数GetContendedMonitor通过函数GetMonitorEnterObject获得对象monitor_enter_object;通过对象monitor_enter_object,查询到锁的信息;根据锁的信息,确定第一线程等待占用的被锁对象。
可选地,通过查找符号信息的技术,查询到私有函数GetContendedMonitor在系统内存中的地址,利用函数指针对私有函数GetContendedMonitor进行调用。
可选地,确定占用被锁对象的第二线程的线程标识,包括:
调用预设的第二函数,确定占用被锁对象的第二线程的线程标识的存储地址,第二函数包括内部函数GetLockOwnerThreadId;
从第二线程的线程标识的存储地址,获取第二线程的线程标识。
可选地,通过查找符号信息的技术,查询到内部函数GetLockOwnerThreadId在系统内存中的地址,利用函数指针对内部函数GetLockOwnerThreadId进行调用。如图5所示,调用内部函数GetLockOwnerThreadId确定占用被锁对象的第二线程的线程标识的存储地址。当确定第二线程的线程标识的存储地址后,可以从存储地址中获取第二线程的线程标识。
S103,根据第一线程的线程标识、以及第二线程的线程标识,确定至少一个死锁组的标识,死锁组包括处于循环等待状态下的至少一个第一线程和至少一个第二线程。
可选地,在确定各第一线程的线程标识以及各第二线程的线程标识后,对各第一线程的线程标识分别对应的第一线程和各第二线程的线程标识分别对应的第二线程之间进行检测。当检测到至少一个第一线程和至少一个第二线程之间存在循环等待状态,则将至少一个第一线程和至少一个第二线程归属为同一个死锁组,至少一个第一线程的线程标识和至少一个第二线程的线程标识构成了该死锁组的标识。
例如,线程A的线程标识为1,线程B的线程标识为2;线程A循环等待的锁被线程B占用,即线程A循环等待的被锁对象被线程B占用,其中,线程A为第一线程,线程B为第二线程;将线程A和线程B归属为同一个死锁组,该死锁组的标识为(1,2)。打印出死锁组(1,2)的堆栈,以及死锁组(1,2)中线程A和线程B之间的循环等待关系,线程A和线程B之间的循环等待关系包括线程A循环等待被线程B占用的被锁对象。
可选地,根据第一线程的线程标识、以及第二线程的线程标识,确定死锁组的标识,包括:
检测各个第一线程以及各个第二线程之间存在的循环等待状态;
对于检测到的每一种循环等待状态,将处于该循环等待状态下的至少一个第一线程和至少一个第二线程的各线程标识,构成一个死锁组的标识。
例如,如图6所示,线程1、线程2、线程3和线程4的线程标识分别为1、2、3和4;线程1在循环等待线程2占用的被锁对象,线程2在循环等待线程3占用的被锁对象,线程3在循环等待线程1占用的被锁对象,线程1、线程2和线程3之间存在循环等待关系,因此,线程1、线程2和线程3归属为同一个死锁组,该死锁组的标识为(1,2,3)。线程1、线程2和线程3之间存在循环等待关系,线程4在循环等待线程3占用的被锁对象,因此,线程1、线程2、线程3和线程4归属为同一个死锁组,该死锁组的标识为(1,2,3,4)。
又例如,如图7所示,线程5和线程6的线程标识分别为5和6;线程5和线程6互相循环等待对方占用的被锁对象,因此,线程5和线程6归属为同一个死锁组,该死锁组的标识为(5,6)。
本申请实施例中,获取目标线程集合中的每一第一线程的线程标识,目标线程集合包括至少一个第一线程,第一线程在运行过程中处于阻塞状态;对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用被锁对象的第二线程的线程标识;通过处于阻塞状态的第一线程和占用被锁对象的第二线程,确定死锁组,从而在android 8及以上的版本且没有获得android的超级用户权限的机器上,能够定位到死锁,提升了死锁检测的效率和准确度。
基于相同的发明构思,本申请实施例还提供了一种死锁检测装置,该装置的结构示意图如图8所示,死锁检测装置80,包括第一处理模块801、第二处理模块802和第三处理模块803。
第一处理模块801,用于获取目标线程集合中的每一第一线程的线程标识,目标线程集合包括至少一个第一线程,第一线程在运行过程中处于阻塞状态;
第二处理模块802,用于对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用被锁对象的第二线程的线程标识;
第三处理模块803,用于根据第一线程的线程标识、以及第二线程的线程标识,确定至少一个死锁组的标识,死锁组包括处于循环等待状态下的至少一个第一线程和至少一个第二线程。
可选地,第一处理模块801,具体用于确定与目标线程集合对应的处于操作系统的第一层的线程对象;通过反射方式得到线程对象中的成员对象;通过成员对象,获取目标线程集合中的每一第一线程的线程标识。
可选地,第一处理模块801,具体用于通过成员对象,确定线程对象处于操作系统的第二层的地址;根据线程对象处于第二层的地址和预设的地址偏移量,确定目标线程集合中的每一第一线程的线程标识的存储地址;从每一第一线程的线程标识的存储地址,获取每一第一线程的线程标识。
可选地,第一层包括应用框架层,第二层包括系统运行库层。
可选地,第二处理模块802,具体用于调用预设的第一函数,确定该第一线程等待占用的被锁对象,第一函数包括私有函数GetContendedMonitor。
可选地,第二处理模块802,具体用于调用预设的第二函数,确定占用被锁对象的第二线程的线程标识的存储地址,第二函数包括内部函数GetLockOwnerThreadId;从第二线程的线程标识的存储地址,获取第二线程的线程标识。
可选地,第三处理模块803,具体用于检测各个第一线程以及各个第二线程之间存在的循环等待状态;对于检测到的每一种循环等待状态,将处于该循环等待状态下的至少一个第一线程和至少一个第二线程的各线程标识,构成一个死锁组的标识。
应用本申请实施例,至少具有如下有益效果:
获取目标线程集合中的每一第一线程的线程标识,目标线程集合包括至少一个第一线程,第一线程在运行过程中处于阻塞状态;对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用被锁对象的第二线程的线程标识;通过处于阻塞状态的第一线程和占用被锁对象的第二线程,确定死锁组,从而在android 8及以上的版本且没有获得android的超级用户权限的机器上,能够定位到死锁,提升了死锁检测的效率和准确度。
基于相同的发明构思,本申请实施例还提供了一种电子设备,该电子设备的结构示意图如图9所示,该电子设备9000包括至少一个处理器9001、存储器9002和总线9003,至少一个处理器9001均与存储器9002电连接;存储器9002被配置用于存储有至少一个计算机可执行指令,处理器9001被配置用于执行该至少一个计算机可执行指令,从而执行如本申请实施例中任意一个实施例或任意一种可选实施方式提供的任意一种死锁检测方法的步骤。
进一步,处理器9001可以是FPGA(Field-Programmable Gate Array,现场可编程门阵列)或者其它具有逻辑处理能力的器件,如MCU(Microcontroller Unit,微控制单元)、CPU(Central Process Unit,中央处理器)。
应用本申请实施例,至少具有如下有益效果:
获取目标线程集合中的每一第一线程的线程标识,目标线程集合包括至少一个第一线程,第一线程在运行过程中处于阻塞状态;对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用被锁对象的第二线程的线程标识;通过处于阻塞状态的第一线程和占用被锁对象的第二线程,确定死锁组,从而在android 8及以上的版本且没有获得android的超级用户权限的机器上,能够定位到死锁,提升了死锁检测的效率和准确度。
基于相同的发明构思,本申请实施例还提供了另一种计算机可读存储介质,存储有计算机程序,该计算机程序用于被处理器执行时实现本申请实施例中任意一个实施例或任意一种可选实施方式提供的任意一种死锁检测方法的步骤。
本申请实施例提供的计算机可读存储介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、CD-ROM、和磁光盘)、ROM(Read-Only Memory,只读存储器)、RAM(RandomAccess Memory,随即存储器)、EPROM(Erasable Programmable Read-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically Erasable Programmable Read-Only Memory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,可读存储介质包括由设备(例如,计算机)以能够读的形式存储或传输信息的任何介质。
应用本申请实施例,至少具有如下有益效果:
获取目标线程集合中的每一第一线程的线程标识,目标线程集合包括至少一个第一线程,第一线程在运行过程中处于阻塞状态;对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用被锁对象的第二线程的线程标识;通过处于阻塞状态的第一线程和占用被锁对象的第二线程,确定死锁组,从而在android 8及以上的版本且没有获得android的超级用户权限的机器上,能够定位到死锁,提升了死锁检测的效率和准确度。
本技术领域技术人员可以理解,可以用计算机程序指令来实现这些结构图和/或框图和/或流图中的每个框以及这些结构图和/或框图和/或流图中的框的组合。本技术领域技术人员可以理解,可以将这些计算机程序指令提供给通用计算机、专业计算机或其他可编程数据处理方法的处理器来实现,从而通过计算机或其他可编程数据处理方法的处理器来执行本申请公开的结构图和/或框图和/或流图的框或多个框中指定的方案。
本技术领域技术人员可以理解,本申请中已经讨论过的各种操作、方法、流程中的步骤、措施、方案可以被交替、更改、组合或删除。进一步地,具有本申请中已经讨论过的各种操作、方法、流程中的其他步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。进一步地,现有技术中的具有与本申请中公开的各种操作、方法、流程中的步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。
以上所述仅是本申请的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。
Claims (10)
1.一种死锁检测方法,其特征在于,包括:
获取目标线程集合中的每一第一线程的线程标识,所述目标线程集合包括至少一个第一线程,所述第一线程在运行过程中处于阻塞状态;
对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用所述被锁对象的第二线程的线程标识;
根据第一线程的线程标识、以及第二线程的线程标识,确定至少一个死锁组的标识,所述死锁组包括处于循环等待状态下的至少一个第一线程和至少一个第二线程。
2.根据权利要求1所述的方法,其特征在于,所述获取目标线程集合中的每一第一线程的线程标识,包括:
确定与所述目标线程集合对应的处于操作系统的第一层的线程对象;
通过反射方式得到所述线程对象中的成员对象;
通过所述成员对象,获取所述目标线程集合中的每一第一线程的线程标识。
3.根据权利要求2所述的方法,其特征在于,所述通过所述成员对象,获取所述目标线程集合中的每一第一线程的线程标识,包括:
通过所述成员对象,确定所述线程对象处于所述操作系统的第二层的地址;
根据所述线程对象处于第二层的地址和预设的地址偏移量,确定所述目标线程集合中的每一第一线程的线程标识的存储地址;
从每一第一线程的线程标识的存储地址,获取每一第一线程的线程标识。
4.根据权利要求3所述的方法,其特征在于,所述第一层包括应用框架层,所述第二层包括系统运行库层。
5.根据权利要求1所述的方法,其特征在于,所述确定该第一线程等待占用的被锁对象,包括:
调用预设的第一函数,确定该第一线程等待占用的被锁对象,所述第一函数包括私有函数GetContendedMonitor。
6.根据权利要求1所述的方法,其特征在于,所述确定占用所述被锁对象的第二线程的线程标识,包括:
调用预设的第二函数,确定占用所述被锁对象的第二线程的线程标识的存储地址,所述第二函数包括内部函数GetLockOwnerThreadId;
从所述第二线程的线程标识的存储地址,获取所述第二线程的线程标识。
7.根据权利要求1-6任一项所述的方法,其特征在于,所述根据第一线程的线程标识、以及第二线程的线程标识,确定死锁组的标识,包括:
检测各个第一线程以及各个第二线程之间存在的循环等待状态;
对于检测到的每一种循环等待状态,将处于该循环等待状态下的至少一个第一线程和至少一个第二线程的各线程标识,构成一个死锁组的标识。
8.一种死锁检测装置,其特征在于,包括:
第一处理模块,用于获取目标线程集合中的每一第一线程的线程标识,所述目标线程集合包括至少一个第一线程,所述第一线程在运行过程中处于阻塞状态;
第二处理模块,用于对于每一第一线程,确定该第一线程等待占用的被锁对象,并确定占用所述被锁对象的第二线程的线程标识;
第三处理模块,用于根据第一线程的线程标识、以及第二线程的线程标识,确定至少一个死锁组的标识,所述死锁组包括处于循环等待状态下的至少一个第一线程和至少一个第二线程。
9.一种电子设备,其特征在于,包括:处理器、存储器;
所述存储器,用于存储计算机程序;
所述处理器,用于通过调用所述计算机程序,执行如权利要求1-7中任一项所述的死锁检测方法。
10.一种计算机可读存储介质,其特征在于,存储有计算机程序,所述计算机程序用于被处理器执行时实现如权利要求1-7中任一项所述的死锁检测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010785310.4A CN111767155A (zh) | 2020-08-06 | 2020-08-06 | 死锁检测方法、装置、设备及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010785310.4A CN111767155A (zh) | 2020-08-06 | 2020-08-06 | 死锁检测方法、装置、设备及计算机可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111767155A true CN111767155A (zh) | 2020-10-13 |
Family
ID=72729789
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010785310.4A Pending CN111767155A (zh) | 2020-08-06 | 2020-08-06 | 死锁检测方法、装置、设备及计算机可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111767155A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116701320A (zh) * | 2022-12-01 | 2023-09-05 | 荣耀终端有限公司 | 一种日志生成方法及相关装置 |
-
2020
- 2020-08-06 CN CN202010785310.4A patent/CN111767155A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116701320A (zh) * | 2022-12-01 | 2023-09-05 | 荣耀终端有限公司 | 一种日志生成方法及相关装置 |
CN116701320B (zh) * | 2022-12-01 | 2024-05-14 | 荣耀终端有限公司 | 一种日志生成方法及相关装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6983461B2 (en) | Method and system for deadlock detection and avoidance | |
US20110258608A1 (en) | Method and apparatus to locate bottleneck of java program | |
US20040199927A1 (en) | Enhanced runtime hosting | |
US10915424B2 (en) | Defeating deadlocks in production software | |
JP5648187B2 (ja) | 計算機システム、および、監視方法 | |
CN111488290B (zh) | 基于智能电表操作系统的线程测试方法和装置 | |
CN102103676A (zh) | 一种基于进程间继承关系的爪哇程序进程守护方法 | |
CN109213576B (zh) | 程序死锁检测方法、存储介质、设备及系统 | |
CN111414256A (zh) | 基于麒麟移动操作系统的应用程序进程派生方法、系统及介质 | |
US20080244592A1 (en) | Multitask processing device and method | |
CN109669858B (zh) | 程序死锁的测试方法、装置和设备 | |
CN114428733A (zh) | 基于静态程序分析与模糊测试的内核数据竞争检测方法 | |
Pina et al. | Tedsuto: A general framework for testing dynamic software updates | |
CN113220535A (zh) | 程序异常的处理方法、装置、设备及存储介质 | |
WO2015027403A1 (en) | Testing multi-threaded applications | |
CN102411513B (zh) | 一种工作于混合模式执行引擎中的垃圾收集方法 | |
CN111857984A (zh) | 银行系统中的作业调用处理方法、装置和计算机设备 | |
CN111767155A (zh) | 死锁检测方法、装置、设备及计算机可读存储介质 | |
CN110928787B (zh) | 自动化测试脚本录制回放方法、装置、设备和存储介质 | |
CN110289043B (zh) | 存储设备测试方法、装置、电子设备 | |
CN110941503A (zh) | 故障处理方法、装置及电子设备 | |
CN111026526B (zh) | 程序的定时器配置方法、装置、存储介质及终端设备 | |
CN114816662A (zh) | 应用于Kubernetes的容器编排方法和系统 | |
CN105487847B (zh) | 一种功能发布方法和设备 | |
CN110795231B (zh) | 一种虚拟cpu的处理方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |