检测多线程程序中的死锁的方法及系统技术方案

技术编号:6867439 阅读:401 留言:0更新日期:2012-04-11 18:40
本发明专利技术涉及一种检测多线程程序中的死锁的方法及其系统,所述方法包括以下步骤:选定所要检测的线程;启动跟踪程序,以跟踪在内核中运行的线程;启动目标多线程程序;判断是否存在所选定的线程在运行;在线程库中动态地插入探测点,以通过探测函数对所述选定的线程进行探测;所述探测函数记录所探测的数据,并且当记录的数据超过内核的阀值时,将数据传输到用户空间并进行存储;对存储于用户空间中的数据进行分析,以判断是否产生死锁。根据本发明专利技术,在不需要目标程序的源代码的情况下,就可以有效地检测出死锁,因而有利于多线程的调试作业,而且还有利于多线程程序对资源使用情况的分析。

【技术实现步骤摘要】

本专利技术涉及计算机
,尤其涉及在多任务情况下检测死锁的方法及系统。
技术介绍
随着计算机技术的快速发展,多任务、多线程或者多处理器的技术应用目前已经非常广泛。所述多任务是指同一个程序能有几个并发执行的路径,这些任务共享内存地址空间,可以并发异步执行。死锁(Dead Lock)是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。然而,由于死锁只在涉及例如正在执行的线程的交错或时序的特定条件下才可能发生,它是难以检测的。在目前的检测方法中,可以分为静态代码分析和运行时分析。静态代码分析,是指对目标源程序进行分析,找出目标线程和相关的资源,建立线程和资源之间的关系图,如果存在循环就认为存在死锁。运行时分析需要增加额外的数据结构和软件模块,每当有线程使用资源(获取或者释放)加以记录分析,如果获取的资源和释放的资源不一致,或者其他异常,认为存在死锁。在现有技术的情况下,都需要目标程序的源代码,这在比较大的程序进行联合开发的情况下,往往并不能得到所有的源代码,在源代码比较多的情况下,对源代码进行分析也是一件很困难的事情。另外,现有动态死锁检测方法都需要增加额外的数据结构和软件模块,并且会修改目标程序的行为。比如,目标程序请求资源或者释放资源的时候,往往需要在增加的数据结构中填写对应的值。这样做,会影响目标程序的行为,导致得到的结果的可信度降低。
技术实现思路
本专利技术是为了解决上述问题而提出的,其目的在于提供一种采用动态插入探测点的方式,且不需要目标程序源代码,也不影响目标程序的运行的检测多线程程序中的死锁的方法及系统。根据本专利技术的目的,提供一种检测多线程程序中的死锁的方法,其特征在于,包括以下步骤选定所要检测的线程;启动跟踪程序,以跟踪在内核中运行的线程;启动目标多线程程序;判断是否存在所选定的线程在运行;在线程库中动态地插入探测点,以通过探测函数对所述选定的线程进行探测;记录所述探测函数所探测的数据,并且当记录的数据超过内核的阀值时,将数据传输到用户空间并进行存储;对存储于用户空间中的数据进行分析,以判断是否产生死锁。所述探测函数进行探测的方式包括入口探测与返回探测,其中,所述入口探测是在资源函数进入时执行,所述返回探测是在资源函数返回的时候执行。在记录所述探测函数所探测的数据的步骤中,记录线程号和资源标示。在对存储到用户空间的数据进行分析的步骤中,当多个线程中的其中一个线程长时间请求资源,而所述线程请求的资源被另一个线程所拥有,且所述另一个线程所请求的资源由所述线程拥有时,判断为发生死锁。在对存储 到用户空间的数据进行分析的步骤中,当多个线程中的其中一个线程长时间请求资源,并且所述线程请求的资源被另一个线程所拥有,而所述另一个线程所请求的资源由所述线程拥有时,判断为发生死锁。根据本专利技术的另一目的,提供一种检测多线程程序中的死锁的系统,包括探测设置模块,其用于在线程库中动态插入探测点,以通过探测函数对线程进行探测,并且记录所述探测函数所探测的数据;数据传输模块,以用于当所述记录数据超过阀值时,将所述记录数据传输到用户空间并进行存储;分析模块,以用于对存储到用户空间的所述记录数据进行分析,以判断是否产生死锁。所述探测函数的探测方式包括入口探测和返回探测,其中,所述入口探测是在资源函数进入时执行,所述返回探测是在资源函数返回的时候执行。所述探测函数记录线程号和资源标示。当多个线程中的其中一个线程长时间请求资源,而所述线程请求的资源被另一个线程所拥有,且所述另一个线程所请求的资源由所述线程拥有时,则所述分析模块判断为发生死锁。根据本专利技术,在不需要目标程序的源代码的情况下,就可以有效地检测出死锁,因而有利于多线程的调试作业,而且还有利于多线程程序对资源使用情况的分析。附图说明通过下面的附图对本专利技术实施例进行的描述,本专利技术的上述和其他目的和特点将会变得更加清楚,其中图1为根据本专利技术的检测多线程程序中的死锁的方法的流程图;图2为根据本专利技术的动态插入用户空间的方法的简要示意图;图3为根据本专利技术的死锁的分析方法的流程图;图4为图3的中的死锁状态的简要示意图;图5为根据本专利技术的检测多线程程序中的死锁的系统的方框图。具体实施例方式以下,参照附图来详细说明根据本专利技术的实施例。如图1所示,根据本专利技术的检测多线程程序中的死锁的方法包括以下步骤。在步骤S100,用户选定所要检测的线程。然后,在步骤SlOl启动跟踪程序,以跟踪在内核中运行的线程。接着,在步骤S102,启动目标多线程程序。此时,所述目标程序为用户空间的应用程序。用户空间的应用程序的探测相对于内核空间的探测的不同点在于,内核总是被加载于物理内存中,其有固定的地址,因此探测点可以在任何时候插入。但是用户空间的应用程序是按需要加载于内存里面去的,其没有固定的地址,因此探测点就不是在任何时候都可以插入。此时的解决方式是维护一个预先定义的探测点的列表,然后在内核函数do_page_fault插入一个探测点,从do_page_fault函数里面获取加载页面的信息,当do_page_ fault返回的时候检查探测点列表,如果在内核中发现存在需要插入探测点的线程,则在新加载的页面里面插入探测点。即,当启动目标程序时,所启动的程序就会被加载于内核中运行,此时将产生页面错误。由此,在步骤S103中,用户根据页面错误判断是否存在用户所选定的线程在运行。当发现存在运行中的用户所选定的线程时,执行步骤S104,在线程库中动态插入探测点,以通过探测函数对用户所选定的线程进行探测。图2为根据本专利技术的动态插入探测点的方法的简要示意图。参照图2可知,由于用户空间的应用程序不同于内核程序,其并没有一次全部被加载到内存中,而是在运行时选择性地进行加载。因此,当用户设置动态探测指令,这些指令会被记录到探测数据中。当发生页面错误的时候,页面错误处理器会调用探测设置模块,该探测设置模块去搜索新加载的应用程序是否需要插入探测函数,如果需要,就动态插入探测函数。动态插入探测点的方法有很多方式,本专利技术中,动态插入探测点利用kprobes,具体的插入方式为在需要插入探测点的地方插入一个中断指令, 当执行到这个中断指令,会调用相应的中断函数,用户自己定义的探测函数在中断函数中执行。Kprobes向运行的内核中给定地址写入断点指令,插入一个探测函数。而执行探测的指令会导致断点错误,Kprobes钩住(hook in)断点处理器并收集调试信息。所述探测函数探测的方式提供两种探测种类,一是入口探测,另一种是返回探测。其中,所述入口探测是在资源函数进入时执行,所述返回探测是在资源函数返回的时候执行,记录下线程号和资源标示。因此,在资源函数入口点(entry)和出口点(return)分别插入探测函数。然后,执行步骤S105,所述探测函数记录所探测的数据。当目标程序启动时,就会调用资源请求函数和资源释放函数,此时对应的入口探测函数和返回探测函数就会被调用,线程号和资源标示将会被记录下来。因此,所述探测函数所探测的数据中包含线程号以及资源标示。 所述资源请求函数包括资源请求入口函数和资源本文档来自技高网...

【技术保护点】
1.一种检测多线程程序中的死锁的方法,其特征在于,包括以下步骤:选定所要检测的线程;启动跟踪程序,以跟踪在内核中运行的线程;启动目标多线程程序;判断是否存在所选定的线程在运行;在线程库中动态地插入探测点,以通过探测函数对所述选定的线程进行探测;所述探测函数记录所探测的数据,并且当记录的数据超过内核的阀值时,将数据传输到用户空间并进行存储;对存储于用户空间中的数据进行分析,以判断是否产生死锁。

【技术特征摘要】

【专利技术属性】
技术研发人员:沈志刚田峰
申请(专利权)人:三星电子中国研发中心三星电子株式会社
类型:发明
国别省市:84

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

1