本发明涉及嵌入式设备技术领域,具体而言,涉及一种异常线程定位方法及装置。
背景技术:
随着物联网技术和网络技术的不断发展,嵌入式设备的应用越发普及。而对嵌入式设备而言,一旦设备的线程运行出现异常,设备将不能正常运行。
目前,在嵌入式设备出现线程异常时,需要软件开发人员通过外部调试工具对嵌入式设备进行现场调试的方式获取到设备中每个线程的栈帧信息后,并对各栈帧信息进行人工分析后才能实现对异常线程的定位。这种异常线程定位方案的定位效率不高,软件开发人员工作量大,线程定位精准度不高。
技术实现要素:
为了克服现有技术中的上述不足,本发明的目的在于提供一种异常线程定位方法及装置,所述异常线程定位方法的定位效率高,能够自行地对嵌入式设备中的异常线程进行精准定位,降低软件开发人员的工作量。
就方法而言,本发明较佳的实施例提供一种异常线程定位方法,应用于嵌入式设备,所述方法包括:
根据所述嵌入式设备中各线程的线程标识以轮询的方式获得对应线程的运行状态参数,其中所述运行状态参数包括对应线程的线程状态及心跳参数中的至少一种;
根据获得的各线程的运行状态参数判断对应线程的状态是否异常;
在线程的状态被判定为异常时,对异常状态的线程进行定位,并将定位后的线程的栈帧信息保存到日志文件中。
就装置而言,本发明较佳的实施例提供一种异常线程定位装置,应用于嵌入式设备,所述装置包括:
参数获取模块,用于根据所述嵌入式设备中各线程的线程标识以轮询的方式获得对应线程的运行状态参数,其中所述运行状态参数包括对应线程的线程状态及心跳参数中的至少一种;
异常判断模块,用于根据获得的各线程的运行状态参数判断对应线程的状态是否异常;
线程定位模块,用于在线程的状态被判定为异常时,对异常状态的线程进行定位,并将定位后的线程的栈帧信息保存到日志文件中。
相对于现有技术而言,本发明较佳的实施例提供的异常线程定位方法及装置具有以下有益效果:所述异常线程定位方法的定位效率高,能够自行地对嵌入式设备中的异常线程进行精准定位,降低软件开发人员的工作量。首先,所述方法通过自行地根据所述嵌入式设备中各线程的线程标识以轮询的方式获得各线程的运行状态参数;接着,所述方法根据获得的各线程的运行状态参数判断对应线程的状态是否异常;最后,所述方法在线程的状态被判定为异常时,对异常状态的线程进行定位,并将定位后的线程的栈帧信息保存到日志文件中,从而在极短的时间内完成对异常线程的精准定位,使软件开发人员在需要获取所述嵌入式设备中异常线程的栈帧信息时,可通过直接查阅所述日志文件的方式,获取到对应需要的异常线程的栈帧信息,无需保留嵌入式设备的现场异常环境,降低软件开发人员的工作量。
为使本发明的上述目的、特征和优点能更明显易懂,下文特举本发明较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对本发明权利要求保护范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本发明较佳的实施例提供的嵌入式设备的一种方框示意图。
图2为本发明较佳的实施例提供的异常线程定位方法的一种方框示意图。
图3为图2中所示的步骤s220包括的子步骤的第一种流程示意图。
图4为图2中所示的步骤s220包括的子步骤的第二种流程示意图。
图5为图2中所示的步骤s220包括的子步骤的第三种流程示意图。
图6为图2中所示的步骤s230包括的子步骤的一种流程示意图。
图7为本发明较佳的实施例提供的图1中所示的异常线程定位装置的一种方框示意图。
图标:10-嵌入式设备;11-存储器;12-处理器;13-通信单元;100-异常线程定位装置;110-参数获取模块;120-异常判断模块;130-线程定位模块。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
在本发明的描述中,需要说明的是,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
如何提供一种定位效率高的,能够自行地对嵌入式设备中的异常线程进行精准定位以降低软件开发人员的工作量的异常线程定位方法及装置,对本领域技术人员而言,是急需解决的技术问题。
下面结合附图,对本发明的一些实施方式作详细说明。在不冲突的情况下,下述的实施例及实施例中的特征可以相互组合。
请参照图1,是本发明较佳的实施例提供的嵌入式设备10的一种方框示意图。在本发明实施例中,所述嵌入式设备10上运行有至少一个线程,所述嵌入式设备10可自行地对所述至少一个线程中可能存在的异常线程进行精准定位,以降低所述嵌入式设备10的软件开发人员的工作量。其中所述嵌入式设备10可以是,但不限于,基于linux系统的监控设备、平板电脑、个人数字助理(personaldigitalassistant,pda)、移动上网设备(mobileinternetdevice,mid)等。可选地,所述嵌入式设备10为监控设备。
在本实施例中,所述嵌入式设备10包括异常线程定位装置100、存储器11、处理器12及通信单元13。所述存储器11、处理器12及通信单元13各个元件相互之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可通过一条或多条通讯总线或信号线实现电性连接。
其中,所述存储器11可用于存储所述嵌入式设备10上运行的至少一个线程对应的程序代码,所述存储器11可以是,但不限于,快闪存储器(flashmemory),可擦除可编程只读存储器(erasableprogrammableread-onlymemory,eprom),电子可擦除可编程只读存储器(electricerasableprogrammableread-onlymemory,eeprom)等。
所述处理器12可以是一种具有信号的处理能力的集成电路芯片。所述处理器12可以是通用处理器,包括中央处理器(centralprocessingunit,cpu)、网络处理器(networkprocessor,np)等;还可以是数字信号处理器、专用集成电路、现成可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。所述处理器12可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。其中,所述嵌入式设备10上运行的所述至少一个线程由所述处理器12执行。
所述通信单元13用于通过网络建立所述嵌入式设备10与其他外部设备之间的通信连接,并通过所述网络收发数据。
所述异常线程定位装置100包括至少一个能够以软件或固件的形式存储于所述存储器11中的软件功能模块。所述处理器12可用于执行所述存储器11存储的所述异常线程定位装置100对应的可执行模块,例如所述异常线程定位装置100所包括的软件功能模块及计算机程序等。在本实施例中,所述异常线程定位装置100的定位异常线程的效率高,能够自行地对所述嵌入式设备10上运行的至少一个线程中可能存在的异常线程进行精准定位,从而降低所述嵌入式设备10的软件开发人员的工作量,提高软件开发人员的工作效率。
可以理解的是,图1所示的框图仅为嵌入式设备10的一种结构组成示意图,所述嵌入式设备10还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。图1中所示的各组件可以采用硬件、软件或其组合实现。
请参照图2,是本发明较佳的实施例提供的异常线程定位方法的一种方框示意图。在本发明实施例中,所述异常线程定位方法应用于上述的嵌入式设备10,用于自行地对所述嵌入式设备10上运行的至少一个线程中可能存在的异常线程进行精准定位,以降低软件开发人员的工作量,提高软件开发人员的软件开发效率。下面对图2所示的异常线程定位方法具体流程和步骤进行详细阐述。
在本发明实施例中,所述异常线程定位方法包括以下步骤:
步骤s210,根据嵌入式设备10中各线程的线程标识以轮询的方式获得对应线程的运行状态参数。
在本实施例中,所述运行状态参数用于表征对应线程的运行情况,嵌入式设备10可通过对运行于所述嵌入式设备10上的各线程的运行状态参数进行监测的方式,获取各线程的运行状态参数,以基于各线程的运行状态参数对所述各线程中可能存在的异常线程进行精准定位。其中所述嵌入式设备10通过自行地根据各线程的线程标识轮询各线程的运行状态参数的方式,实现对各线程的运行状态参数的监测。
其中所述运行状态包括对应线程的线程状态及心跳参数中的至少一种。
在本实施例中,每个线程在嵌入式设备10上运行时都对应一个单独的线程标识,所述线程标识用于区分对应线程与其他线程。所述嵌入式设备10可根据每个线程的线程标识查找到对应线程,并以轮询的方式获取各线程的运行状态参数。其中,所述线程状态用于表征对应线程当前的执行状态,所述线程状态包括运行状态、休眠状态及异常状态,所述运行状态表示对应线程处于正常执行调用的状态,所述休眠状态表示对应线程处于堵塞式执行调用的状态,所述异常状态表示对应线程处于异常的状态;所述心跳参数用于表征对应线程的执行情况,所述心跳参数包括对应线程当前的线程心跳值,及对应线程在上次轮询时的线程心跳值,所述线程心跳值表示对应线程的执行次数,若某线程在上次轮询与本次轮询之间的时间段内正常执行至少一次,则该线程在本次轮询时的线程心跳值与上次轮询时的线程心跳值相比将有所不同,本次轮询时的线程心跳值将大于上次轮询时的线程心跳值。在本实施例的一种实施方式中,线程被正常执行完一次时,该线程对应的线程心跳值自动加一。
在本实施例中,所述嵌入式设备10获得的各线程的运行状态参数可以仅包括各线程的线程状态,也可以仅包括各线程的心跳参数,还可以同时包括各线程的线程状态及心跳参数。在本发明实施例的一种实施方式中,所述嵌入式设备10可预先创建一个功能单一的仅用于监控各线程的运行状态参数的监控线程,并通过该监控线程实现所述步骤s210对应的步骤流程,其中所述监控线程可通过调用gettid函数的方式获取各线程的线程标识。
步骤s220,根据获得的各线程的运行状态参数判断对应线程的状态是否异常。
在本实施例中,所述嵌入式设备10判断各线程的状态是否异常的处理方式与所述嵌入式设备10获得的运行状态参数的实质内容相关,不同的实质内容对应不同的处理方式,例如,若所述嵌入式设备10获得的运行状态参数仅包括各线程的心跳参数时对应的处理方式为第一方案,所述嵌入式设备10获得的运行状态参数仅包括各线程的线程状态时对应的处理方式为第二方案,则所述第一方案与所述第二方案并不相同。
可选地,请参照图3,是图2中所示的步骤s220包括的子步骤的第一种流程示意图。在本实施例的第一种实施方式中,当获得的所述运行状态参数仅包括对应线程的心跳参数时,所述步骤s220可以包括子步骤s221及子步骤s222:
子步骤s221,将各线程当前的线程心跳值及对应线程在上次轮询时的线程心跳值进行比较。
在本实施例中,所述嵌入式设备10通过将对应线程在本次轮询时的当前线程心跳值与该线程在上次轮询时的线程心跳值进行比较,判断该线程在对应两次轮询之间的时间段内是否被正常执行过。
步骤s222,若存在线程当前的线程心跳值与上次轮询时的线程心跳值相同时,判定该线程的状态为异常。
在本实施例中,若线程在本次轮询时的当前线程心跳值与该线程在上次轮询时的线程心跳值相同,则该线程在对应两次轮询之间的时间段内未被执行,所述嵌入式设备10可判定该线程的状态为异常,属于异常线程。
可选地,请参照图4,是图2中所示的步骤s220包括的子步骤的第二种流程示意图。在本实施例的第二种实施方式中,当获得的所述运行状态参数仅包括对应线程的线程状态时,所述步骤s220可以包括子步骤s223及子步骤s224:
步骤s223,对各线程的线程状态进行识别。
在本实施例中,所述嵌入式设备10通过读取识别对应线程的线程状态,判断该线程的线程状态是运行状态、休眠状态或异常状态。
步骤s224,若对应线程的线程状态为异常状态时,判定该线程的状态为异常。
在本实施例中,若线程在本次轮询时的线程状态为异常状态时,表明该线程异常,所述嵌入式设备10可判定该线程的状态为异常,属于异常线程。
可选地,请参照图5,是图2中所示的步骤s220包括的子步骤的第三种流程示意图。在本实施例的第三种实施方式中,当获得的所述运行状态参数除了包括对应线程的线程状态,还包括对应线程的心跳参数时,本实施方式与上述图4所对应的实施方式不同的是,所述步骤s220除了包括上述的子步骤s223及子步骤s224外,还可以包括子步骤s225:
子步骤s225,若对应线程的线程状态为运行状态时,将所述线程当前的线程心跳值与上次轮询时的线程心跳值进行比较,并在相同时判定该线程的状态为异常,相应修改该线程的线程状态为异常状态。
在本实施例中,若所述嵌入式设备10获得的运行状态参数包括对应线程的线程状态及心跳参数时,所述嵌入式设备10首先对各线程的线程状态进行识别,并在识别到对应线程的线程状态为运行状态时,将该线程在本次轮询时的当前线程心跳值与上次轮询时的线程心跳值进行比较,以通过比较结果判断该线程是否异常。当该线程在本次轮询时的当前线程心跳值与上次轮询时的线程心跳值相同时,表明该线程在处于运行状态的情况下并未在对应两次轮询之间的时间段内被执行,则所述嵌入式设备10可判定该线程的状态为异常,属于异常线程,并相应地调整修改该线程的线程状态为异常状态。
在本发明实施例的一种实施方式中,所述嵌入式设备10创建的监控线程也可执行图3-图5对应的三种实施方式中的任意一种,以判断所述嵌入式设备10中运行的各线程是否异常。
请再次参照图2,步骤s230,在线程的状态被判定为异常时,对异常状态的线程进行定位,并将定位后的线程的栈帧信息保存到日志文件中。
在本实施例中,所述嵌入式设备10在判断完各线程的状态是否异常以确定出所述嵌入式设备10上运行的各线程中可能存在的异常线程后,将根据状态被判定为异常的线程所对应的线程标识,对所述异常线程进行定位处理,以降低软件开发人员的工作量。
可选地,请参照图6,是图2中所示的步骤s230包括的子步骤的一种流程示意图。在本实施例中,所述步骤s230中对异常状态的线程进行定位,并将定位后的线程的栈帧信息保存到日志文件中的步骤包括子步骤s231及子步骤s232:
子步骤s231,根据所述异常状态的线程的线程标识向对应线程发送定位信号以获取该线程的栈帧信息。
在本实施例中,所述嵌入式设备10可基于sigaction函数预先配置与定位信号相关联的处理动作函数,而该处理动作函数对应的是获取捕获到所述定位信号的线程所对应的栈帧信息,其中所述定位信号可由软件开发人员进行自定义式预先设置,所述栈帧信息包括对应线程的返回地址、局部变量及栈帧地址中的至少一种。所述嵌入式设备10在判断出有线程的状态为异常时,将根据状态被判定为异常的所述线程的线程标识向该线程发送定位信号,而该线程在捕获到所述定位信号时,所述处理动作函数将被触发,以通过所述处理动作函数获取到异常线程的栈帧信息。在本实施例的一种实施方式中,所述处理动作函数通过调用backtrace函数及backtrace_symbols函数获取对应线程的栈帧信息。
子步骤s232,将获取到的所述异常状态的线程的栈帧信息记录到日志文件中进行保存。
在本实施例中,所述嵌入式设备10在获取到异常线程的栈帧信息后,通过在日志文件中记录该线程的栈帧信息的方式,对异常线程的栈帧信息进行保存。与现有技术中软件开发人员需要在保留嵌入式设备10的现场异常环境下,采用外部调试工具进行外部调试以获取异常线程的栈帧信息的方案不同,软件开发人员在需要获取所述嵌入式设备10中异常线程的栈帧信息时,可通过直接查阅所述日志文件的方式,获取到对应需要的异常线程的栈帧信息,无需保留嵌入式设备10的现场异常环境,确保所述嵌入式设备10可能存在的自我恢复机制能够正常运行。
请参照图7,是本发明较佳的实施例提供的图1中所示的异常线程定位装置100的一种方框示意图。在本发明实施例中,所述异常线程定位装置100包括参数获取模块110、异常判断模块120及线程定位模块130。
所述参数获取模块110,用于根据嵌入式设备10中各线程的线程标识以轮询的方式获得对应线程的运行状态参数。
在本实施例中,所述运行状态包括对应线程的线程状态及心跳参数中的至少一种。其中,所述线程状态用于表征对应线程当前的执行状态,所述线程状态包括运行状态、休眠状态及异常状态,所述运行状态表示对应线程处于正常执行调用的状态,所述休眠状态表示对应线程处于堵塞式执行调用的状态,所述异常状态表示对应线程处于异常的状态;所述心跳参数用于表征对应线程的执行情况,所述心跳参数包括对应线程当前的线程心跳值,及对应线程在上次轮询时的线程心跳值。所述参数获取模块110获得的运行状态参数可以仅包括各线程的线程状态,也可以仅包括各线程的心跳参数,还可以同时包括各线程的线程状态及心跳参数。所述参数获取模块110可以执行图2中所示的步骤s210,具体的执行过程可参照上文对步骤s210的详细描述,在此就不一一赘述了。
所述异常判断模块120,用于根据获得的各线程的运行状态参数判断对应线程的状态是否异常。
在本实施例的第一种实施方式中,若所述参数获取模块110获得的所述运行状态参数仅包括对应线程的心跳参数时,所述异常判断模块120根据获得的各线程的运行状态参数判断对应线程的状态是否异常的方式,包括:
将各线程当前的线程心跳值及对应线程在上次轮询时的线程心跳值进行比较;
若存在线程当前的线程心跳值与上次轮询时的线程心跳值相同时,判定该线程的状态为异常。
在本实施例的第二种实施方式中,若所述参数获取模块110获得的所述运行状态参数仅包括对应线程的线程状态时,所述异常判断模块120根据获得的各线程的运行状态参数判断对应线程的状态是否异常的方式,包括:
对各线程的线程状态进行识别;
若对应线程的线程状态为异常状态时,判定该线程的状态为异常。
在本实施例的第三种实施方式中,若所述参数获取模块110获得的所述运行状态参数除了包括对应线程的线程状态,还包括对应线程的心跳参数时,所述异常判断模块120根据获得的各线程的运行状态参数判断对应线程的状态是否异常的方式,除了包括上述第二种实施方式对应的内容外,还包括:
若对应线程的线程状态为运行状态时,将所述线程当前的线程心跳值与上次轮询时的线程心跳值进行比较,并在相同时判定该线程的状态为异常,相应修改该线程的线程状态为异常状态。
在本实施例中,所述异常判断模块120可以执行图2中所示的步骤s220,及所述步骤s220对应的图3、图4、图5中的任意一种实施方式,具体的执行过程可以参照上文中对步骤s220、子步骤s221、子步骤s222、子步骤s223、子步骤s224、子步骤s225的详细描述,在此就不一一赘述了。
所述线程定位模块130,用于在线程的状态被判定为异常时,对异常状态的线程进行定位,并将定位后的线程的栈帧信息保存到日志文件中。
在本实施例中,所述线程定位模块130对异常状态的线程进行定位,并将定位后的线程的栈帧信息保存到日志文件中的方式包括:
根据所述异常状态的线程的线程标识向对应线程发送定位信号以获取该线程的栈帧信息,其中所述栈帧信息包括对应线程的返回地址、局部变量及栈帧地址中的至少一种;
将获取到的所述异常状态的线程的栈帧信息记录到日志文件中进行保存。
其中,所述线程定位模块130可以执行图2中所示的步骤s230,及图6中所示的子步骤s231、子步骤s232,具体的执行过程可以参照上文中对步骤s230、子步骤s231、子步骤s232的详细描述,在此就不一一赘述了。
综上所述,在本发明较佳的实施例提供的异常线程定位方法及装置中,所述异常线程定位方法的定位效率高,能够自行地对嵌入式设备中的异常线程进行精准定位,降低软件开发人员的工作量。首先,所述方法通过自行地根据所述嵌入式设备中各线程的线程标识以轮询的方式获得各线程的运行状态参数;接着,所述方法根据获得的各线程的运行状态参数判断对应线程的状态是否异常;最后,所述方法在线程的状态被判定为异常时,对异常状态的线程进行定位,并将定位后的线程的栈帧信息保存到日志文件中,从而在极短的时间内完成对异常线程的精准定位,使软件开发人员在需要获取所述嵌入式设备中异常线程的栈帧信息时,可通过直接查阅所述日志文件的方式,获取到对应需要的异常线程的栈帧信息,无需保留嵌入式设备的现场异常环境,降低软件开发人员的工作量。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。