死循环定位方法、装置、计算机设备和存储介质与流程

文档序号:20186452发布日期:2020-03-27 19:08阅读:211来源:国知局
死循环定位方法、装置、计算机设备和存储介质与流程

本申请涉及计算机技术领域,特别是涉及一种死循环定位方法、装置、计算机设备和存储介质。



背景技术:

在计算机系统的软件程序运行过程中,系统程序或应用程序等程序有时会发生死循环异常,因而需要跟踪定位死循环异常产生的部位和根本原因并加以解决。所谓死循环异常,是指程序一直停留在某个状态,像僵死了一样,不再向预期的后续流程执行,但底层系统及其输入、输出设备(例如按键、串口等)仍然处于正常工作或可正常工作状态。

目前,通过断点采样法,即通过触发某个中断进而获取中断断点地址来对程序进行采样定位死循环时,若程序中包括对公共函数,尤其是耗时公共函数等代码的大量重复调用时,采样断点地址容易落在公共函数中,无法有效定位出死循环的准确位置,需要反复进行采样处理,导致死循环的定位效率较低。



技术实现要素:

基于此,有必要针对上述技术问题,提供一种能够提高死循环定位效率的死循环定位方法、装置、计算机设备和存储介质。

一种死循环定位方法,所述方法包括:

当检测到死循环时,触发第一中断程序;

获取通过触发第一中断程序所产生的第一中断结果;

基于第一中断结果执行第二中断程序,第二中断程序的中断周期的数量级不大于指令执行周期的数量级;

获取通过触发第二中断程序所产生的第二中断结果,并根据第二中断结果确定触发死循环对应的死循环位置。

在其中一个实施例中,基于第一中断结果执行第二中断程序包括:

从第一中断结果中确定死循环对应的死循环进程;

触发第二中断程序对死循环进程进行中断处理。

在其中一个实施例中,触发第二中断程序对死循环进程进行中断处理包括:

触发第二中断程序,并确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识;

当第二进程识别标识与死循环进程对应的第一进程识别标识相同时,通过第二中断程序对死循环进程进行中断处理。

在其中一个实施例中,通过第二中断程序对死循环进程进行中断处理包括:

确定死循环进程中函数体的起始地址和截止地址;

根据起始地址和截止地址确定函数体的地址范围;

当第二中断程序的当前断点地址在函数体的地址范围之外时,确定当前断点地址对应的相对地址,根据相对地址得到第二中断结果。

在其中一个实施例中,确定当前断点地址对应的相对地址包括:

确定死循环进程的起始地址;

根据当前断点地址和死循环进程的起始地址得到当前断点地址对应的相对地址。

在其中一个实施例中,在根据相对地址得到第二中断结果之后,还包括:

将连续输出计数加1,获得更新后的连续输出计数;

当更新后的连续输出计数不小于预设的连续输出阈值时,退出第二中断程序。

在其中一个实施例中,还包括:

当第二进程识别标识与死循环进程对应的第一进程识别标识不同、或第二中断程序的当前断点地址在函数体的地址范围之内、或更新后的连续输出计数小于连续输出阈值时,返回执行触发第二中断程序,并确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识。

在其中一个实施例中,根据第二中断结果确定触发死循环对应的死循环位置包括:

获取死循环进程对应的反汇编代码;

从反汇编代码中确定与第二中断结果对应的死循环反汇编代码;

将死循环反汇编代码与死循环对应死循环进程的代码进行校验,当校验通过时,根据死循环反汇编代码确定死循环对应死循环进程中的死循环位置。

在其中一个实施例中,还包括:

当死循环位置为不包括死循环的函数体时,返回执行基于第一中断结果执行第二中断程序的步骤。

一种死循环定位装置,所述装置包括:

第一中断触发模块,用于当检测到死循环时,触发第一中断程序;

第一中断结果模块,用于获取通过触发第一中断程序所产生的第一中断结果;

第二中断触发模块,用于基于第一中断结果执行第二中断程序,第二中断程序的中断周期的数量级不大于指令执行周期的数量级;

死循环定位模块,用于获取通过触发第二中断程序所产生的第二中断结果,并根据第二中断结果确定触发死循环对应的死循环位置。

一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,处理器执行计算机程序时实现以下步骤:

当检测到死循环时,触发第一中断程序;

获取通过触发第一中断程序所产生的第一中断结果;

基于第一中断结果执行第二中断程序,第二中断程序的中断周期的数量级不大于指令执行周期的数量级;

获取通过触发第二中断程序所产生的第二中断结果,并根据第二中断结果确定触发死循环对应的死循环位置。

一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:

当检测到死循环时,触发第一中断程序;

获取通过触发第一中断程序所产生的第一中断结果;

基于第一中断结果执行第二中断程序,第二中断程序的中断周期的数量级不大于指令执行周期的数量级;

获取通过触发第二中断程序所产生的第二中断结果,并根据第二中断结果确定触发死循环对应的死循环位置。

上述死循环定位方法、装置、计算机设备和存储介质,通过触发第一中断程序得到第一中断结果,再基于第一中断结果执行中断周期的数量级不大于指令执行周期的数量级的第二中断程序,并根据第二中断程序产生的中断结果确定触发死循环对应的死循环位置,实现了通过第一中断程序进行初步死循环定位,再执行中断周期不超过处理器指令执行周期数量级的第二中断程序进行密集处理,可以有效避免断点地址落入被大量重复调用的代码中,从而有效定位死循环位置,提高了死循环的定位效率。

附图说明

图1为一个实施例中死循环定位方法的应用环境图;

图2为一个实施例中死循环定位方法的流程示意图;

图3为一个实施例中第二中断程序进行中断处理的流程示意图;

图4为一个实施例中死循环定位装置的结构框图;

图5为一个实施例中计算机设备的内部结构图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。

本申请提供的死循环定位方法,可以应用于如图1所示的应用环境中。其中,计算机设备110可以运行各种程序,如应用程序、系统程序等。当计算机设备110在运行程序发生死循环时,通过触发第一中断程序得到第一中断结果,再基于第一中断结果执行中断周期的数量级不大于指令执行周期的数量级的第二中断程序,并根据第二中断程序产生的中断结果确定触发死循环对应的死循环位置。其中,计算机设备110可以但不限于是各种个人计算机、笔记本电脑、智能手机、平板电脑和便携式可穿戴设备等终端设备,也可以为嵌入式设备或服务器设备。

在一个实施例中,如图2所示,提供了一种死循环定位方法,以该方法应用于图1中的计算机设备为例进行说明,包括以下步骤:

步骤s202,当检测到死循环时,触发第一中断程序。

其中,死循环为程序运行时一直停留在某个状态,无法按照预期执行程序流程的异常状态,程序运行若发生死循环,则无法执行程序正常功能。死循环由程序代码错误导致。当系统程序或应用程序陷入死循环异常时,将由于退出循环的条件无法满足而反复地运行在某一个局部的代码段中,并且会高频率地占用cpu(centralprocessingunit,中央处理器)的运行时间,需要进行死循环处理,以确定发生死循环的代码,并针对该代码进行处理,以修改程序直至程序能够实现正常功能。中断指计算机的处理器暂停当前的工作去处理紧急事件,处理完毕后,处理器可以再回到原来被中断的地址,继续原来的工作的过程。中断程序即为执行中断的程序。中断程序被触发后,一般只运行一次,运行时长应尽可能短,不会也不能在里面从头到尾式循环地运行;下一次触发后,再从头到尾地运行一次;若一直不被触发,则一直不运行。中断程序完成一次中断服务后,结束中断程序,以待下一次触发;而关闭中断功能后,即使中断源再次动作和触发,对应的中断程序也不会运行。

具体地,计算机设备在运行程序时,实时或定时检测程序的运行状态,当检测到死循环时,表明程序进入异常状态,需要进行死循环定位处理,此时,可以通过各种触发方式触发第一中断程序进行中断处理,触发方式如人工触发、定时器触发、硬件电路触发等。

步骤s204,获取通过触发第一中断程序所产生的第一中断结果。

触发第一中断程序后,第一中断程序会进行断点信息采样,输出第一中断结果,第一中断结果可以包括死循环进程的信息,如死循环进程的进程标识。一般地,若死循环对应的死循环代码中含有对一个或几个耗时公共函数的调用,则通过第一中断程序采样到的断点地址一般均落在这些公共函数内,极难落在该函数之外。其中,公共函数是指软件系统中,提供基础性服务、并被众多更高层的程序所调用的函数。耗时公共函数是指需要相对较长的执行时间才能退出的公共函数,这里,较长的时间是一个相对的概念,是指比其它语句长度相近的函数耗用的时间明显更长,例如,前者是后者的一万倍、十万倍、或者以上。常见的耗时公共函数,例如,延时函数、按键等候函数、某一事件等候函数等。公共函数在程序中往往被大量调用,因此,仅根据第一中断结果难以得到死循环代码段的确切地址,即无法有效定位死循环。

步骤s206,基于第一中断结果执行第二中断程序,第二中断程序的数量级不大于指令执行周期的数量级。

得到第一中断结果后,基于该第一中断结果执行第二中断程序,第二中断程序按照其对应的中断周期进行中断和断点地址采样处理。其中,第二中断程序的中断周期数量级不大于指令执行周期的数量级,其中,指令执行周期为处理器执行机器指令的周期,第二中断程序的中断周期数量级不大于指令执行周期的数量级,使得第二中断程序可以进行更密集地采样,如可以使处理器在执行一条或几条机器指令后进行断点地址采样,从而得到更密集的断点地址信息。具体地,第二中断程序的中断周期根据cpu的指令周期tm来选取,使得第二中断程序的中断周期等于tm的若干倍(假设为n倍,n是一个正实数),也就是使得cpu仅执行一条或几条机器指令后定时中断就发生,从而实现密集采样,n的典型值为1、2、3等,根据经验n不超过10,即第二中断程序的中断周期的数量级不大于指令执行周期的数量级。

具体实现时,第二中断程序为定时器中断,即第二中断程序包括定时器中断程序、采集中断信息程序、输出断点地址信息程序。触发第二中断程序时,由定时器中断程序对定时器所产生的中断进行响应,以使第二中断程序中的采集中断信息程序和输出断点地址信息程序进行中断处理和断点地址信息采样处理。其中,定时器可以从系统中选择一个尚未使用或当前不使用的定时器作为工作定时器,并重置该定时器。具体可以先关闭该定时器的中断,再停止该定时器的计时,并根据第二中断程序的定时周期设置该定时器的周期计时模式;。再使能该定时器的中断,并开启该定时器的计时和运行,以实现第二中断程序进行中断和断点地址信息采样的处理。

通过基于第一中断程序产生的第一中断结果连环触发并执行第二中断程序,可以避免中断周期较小的第二中断程序过早运行而导致系统运行迟钝、死循环故障可能无法复现等弊端,同时可以确保所定位进程中落在耗时公共函数之外的代码段能更大概率地被第二中断程序所切分和采样到,从而提高死循环的定位效率。

步骤s208,获取通过触发第二中断程序所产生的第二中断结果,并根据第二中断结果确定触发死循环对应的死循环位置。

获取通过触发第二中断程序所产生的第二中断结果,基于该第二中断结果可以确定触发死循环对应的死循环位置,如具体在程序源代码的代码部位。在具体实现时,可以根据死循环对应进程的反汇编代码结合第二中断结果得到触发死循环对应的死循环位置。

上述死循环定位方法中,通过触发第一中断程序得到第一中断结果,再基于第一中断结果执行中断周期的数量级不大于指令执行周期的数量级的第二中断程序,并根据第二中断程序产生的中断结果确定触发死循环对应的死循环位置,实现了通过第一中断程序进行初步死循环定位,再执行中断周期不超过处理器指令执行周期数量级的第二中断程序进行密集处理,可以有效避免断点地址落入被大量重复调用的代码中,从而有效定位死循环位置,提高了死循环的定位效率。

在一个实施例中,基于第一中断结果执行第二中断程序包括:从第一中断结果中确定死循环对应的死循环进程;触发第二中断程序对死循环进程进行中断处理。

本实施例中,触发第二中断程序对基于第一中断结果中确定的死循环进程进行中断处理,以提高第二中断程序中断处理的针对性。具体地,第一中断结果中可以包括死循环对应的死循环进程信息,具体可以包括死循环进程的进程识别标识;在基于第一中断结果执行第二中断程序时,从第一中断结果中确定死循环对应的死循环进程。确定死循环对应的死循环进程后,触发第二中断程序对死循环进程进行中断处理。根据第一中断程序产生的第一中断结果作为初步定位,再由中断周期较小的第二中断周期进行针对性中断处理,可以避免中断周期较小的第二中断程序过早运行而导致系统运行迟钝、死循环故障可能无法复现等弊端,同时可以确保所定位进程中落在耗时公共函数之外的代码段能更大概率地被第二中断程序所切分和采样到,从而提高死循环的定位效率。

在一个实施例中,触发第二中断程序对死循环进程进行中断处理包括:触发第二中断程序,并确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识;当第二进程识别标识与死循环进程对应的第一进程识别标识相同时,通过第二中断程序对死循环进程进行中断处理。

本实施例中,通过进程识别标识确定第二中断程序进行中断处理的死循环进程。具体地,触发第二中断程序后,第二中断程序会进行断点采样,确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识。当前中断进程即为第二中断程序当前触发断点的对象进程,进程识别标识为进程的标识信息,如可以包括进程标识号,通过进程识别标识可以确定对应的进程。即第二进程识别标识与当前中断进程相对应。确定死循环进程对应的第一进程识别标识,第一进程识别标识可以直接从第一中断结果中获取,也可以根据第一中断结果确定的死循环进程查询对应的标识信息,得到第一进程识别标识。在具体实现时,可以在代码中设置一全局变量pfocus,通过将第一进程识别标识赋值给该全局变量pfocus进行处理。

比较第一进程识别标识和第二进程识别标识,即比较第二中断程序当前进行中断处理的进程是否为第一中断程序确定的死循环进程,若第二进程识别标识与死循环进程对应的第一进程识别标识相同,表明第二中断进程中断的进程对象为第一中断程序确定的死循环进程,则通过第二中断程序对死循环进程进行中断处理,得到第二中断程序产生的第二中断结果。

在一个实施例中,如图3所示,第二中断程序进行中断处理的步骤,即通过第二中断程序对死循环进程进行中断处理包括:

步骤s302,确定死循环进程中函数体的起始地址和截止地址。

本实施例中,对第二中断程序中断死循环进程时采样的断点信息进行过滤,滤除了大量无用的断点地址,保证了得到的第二中断结果的精简性和有效性,从而大幅提高了死循环的定位效率。具体地,确定死循环进程中函数体的起始地址和截止地址。其中,函数体主要为死循环进程中的公共函数,如耗时公共函数,函数体会被各种程序的各种进程反复、大量调用。函数体的起始地址和截止地址可以在确定函数体的名称后,在编译所生成的内存映像文件中分别查询和计算得到,函数体的名称可以在反汇编文件中根据地址信息查询确定。函数体的起始地址和截止地址与函数体本身及死循环进程相关。

步骤s304,根据起始地址和截止地址确定函数体的地址范围。

得到函数体的起始地址和截止地址后,根据该起始地址和截止地址确定函数体的地址范围。具体可以将起始地址和截止地址之间的地址区间作为函数体的地址范围,在该地址范围内的地址属于该函数体。

在一具体应用中,函数体包括公共函数f,公共函数f的起始地址s,计算公共函数f的截止地址e,即:e=s+l。其中,l是公共函数f以字节数为单位的长度,可以根据编译器编译时产生的内存映像文件来人工获取公共函数f的长度、并赋值给l;在内存映像文件中还可以获取到该函数链接到的起始地址,并赋值给s;从而得到函数体的地址范围为[s,e]。

步骤s306,当第二中断程序的当前断点地址在函数体的地址范围之外时,确定当前断点地址对应的相对地址,根据相对地址得到第二中断结果。

得到函数体的地址范围后,判断第二中断程序的当前断点地址是否处于函数体的地址范围之外,其中,第二中断程序的当前断点地址为第二中断程序中断时断点的地址信息。若第二中断程序的当前断点地址在函数体的地址范围之外,则表明第二中断程序当前中断的断点位置不在函数体内,则可以根据该当前断点地址得到第二中断结果,具体可以确定当前断点地址对应的相对地址,相对地址表征了断点在死循环进程中的位置,根据相对地址可以得到第二中断结果。其中,第二中断结果可以包括断点的断点信息,如当前断点地址、相对地址、当前中断进程对应的第二进程识别标识或死循环进程的起始地址等,并通过计算机设备的输出设备,如屏幕、打印机、通讯口中的一种或几种输出。

若第二中断程序的当前断点地址在函数体的地址范围之内,则表明第二中断程序当前中断的断点位置在函数体内,而函数体本身可能被各种进程所调用,则无法基于该当前断点地址确定对应的死循环位置,则结束此次中断,进入下一次中断处理。此外,当死循环进程包括多个函数体时,可以逐一将第二中断程序的当前断点地址与各函数体进行比较,以确定第二中断程序的当前断点地址是否落在死循环进程的某一函数体中,通过遍历死循环进程中的各函数体,可以确保当前断点地址落在非函数体,从而确保能够有效进行循环体定位。

本实施例中,第二中断程序的中断周期的数量级不大于指令执行周期的数量级,在第一中断程序确定死循环进程后,通过第二中断程序可以对该死循环进程进行密集地采样,可以确保所定位进程中落在函数体(如耗时公共函数)之外的代码段能更大概率地被第二中断服务程序所切分和采样到,从而避免采样落入函数体内,可以直接根据函数体外代码段的断点采样信息确定死循环的位置信息,从而提高了死循环的定位效率。

在一个实施例中,确定当前断点地址对应的相对地址包括:确定死循环进程的起始地址;根据当前断点地址和死循环进程的起始地址得到当前断点地址对应的相对地址。

本实施例中,根据死循环进程的位置信息和当前断点地址得到当前断点地址对应的相对地址。具体地,确定当前断点地址对应的相对地址时,确定死循环进程的起始地址,死循环进程的起始地址可以根据计算机设备操作系统的设计、软件接口和数据结构,进行检索确定。再根据当前断点地址和死循环进程的起始地址得到当前断点地址对应的相对地址,具体根据相对地址r=采集到的当前断点地址a―死循环进程的起始地址sa,可以将绝对的断点地址转换为该进程被加载之前的相对断点地址。

例如,若被定位的是系统程序,即死循环进程为系统程序,且该程序是同操作系统内核一起加载到内存中,则其起始地址一般就是内核整体被加载的起始地址;若该程序是被操作系统动态加载到内存中,则其起始地址就是该程序被动态加载的起始地址。若被定位的是应用程序,即死循环进程为应用程序,则被操作系统加载到内存中时,会被放入一块空闲的、临时的连续逻辑内存中,然后以一个新进程的方式进行运行,该内存的起始地址,就是进程被加载的起始地址。

在一个实施例中,在根据相对地址得到第二中断结果之后,还包括:将连续输出计数加1,获得更新后的连续输出计数;当更新后的连续输出计数不小于预设的连续输出阈值时,退出第二中断程序。

本实施例中,采用容限控制的方式来有限度地连续输出若干次第二中断结果,以进一步提高死循环定位的准确性。具体地,在根据相对地址得到第二中断结果之后,将连续输出计数加1。其中,连续输出计数表征获取的第二中断结果的组数目,具体实现时,可以在代码中设置一全局变量noutput表征连续输出计数,通过对该全局变量noutput进行赋值以实现对全局变量noutput的更新。

进一步地,将连续输出计数加1表明获取的第二终端结果的组数目加1,得到更新后的连续输出计数。将更新后的连续输出计数与预设的连续输出阈值进行比较,若更新后的连续输出计数不小于预设的连续输出阈值,表明第二终端结果的组数目已满足需求,此时关闭第二中断,并退出第二中断程序,以停止运行第二中断程序。具体可以关闭第二中断程序中的定时器中断,停止定时器的运行,从而退出第二中断程序。其中,连续输出阈值根据实际需求进行设置,如可以根据第二中断程序的中断周期相对于cpu指令周期的大小、输出设备或通道的输出能力等具体情况来设定,典型值如5、10等。例如,当第二中断的触发周期极短、接近于cpu指令周期时,可将其值设小一点,如5;当第二中断程序的中断周期较长、显著大于cpu指令周期、且输出设备具备容纳能力时,可将其值设大一点,如100。通过采用容限控制的方式来有限度地连续输出若干次第二中断结果,既可以避免单次输出可能效率低下的弊端,又可以避免信息无条件地永远输出所可能面临的输出通道拥塞、进程无法获得被调度运行时隙进而无法采样到死循环路径信息等风险。

在一个实施例中,死循环定位方法还包括:当第二进程识别标识与死循环进程对应的第一进程识别标识不同、或第二中断程序的当前断点地址在函数体的地址范围之内、或更新后的连续输出计数小于连续输出阈值时,返回执行触发第二中断程序,并确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识。

本实施例中,若不满足确定第二中断结果的条件,则结束当次中断处理,重新触发第二中断程序进行下一次中断处理。具体地,当第二进程识别标识与死循环进程对应的第一进程识别标识不同,即表明第二中断程序当前中断的进程与第一中断程序确定的死循环进程不同,即并非第二中断程序需要进行中断处理的对象进程;或第二中断程序的当前断点地址在函数体的地址范围之内,即表明第二中断程序的当前断点地址落入会被各进程反复、大量调用的函数体内,无法进行死循环定位;或更新后的连续输出计数小于连续输出阈值时,即获得的第二中断结果的组数目不满足需求,需要进行下一次中断处理时,返回执行触发第二中断程序,并确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识,等候进行下一次中断处理。

此外,考虑到第一中断程序可能无法采样到所有公共函数而产生遗漏的公共函数被第二中断程序采样到、或者公共函数内嵌套有公共函数而更上层的公共函数被第二中断程序采样到时,则会导致无法准确定位,此时,根据采样到的该地址,在对应反汇编文件中可以查到该地址所在的函数名称,并确认该函数是一公共函数;再根据该函数名称,在编译所生成的内存映像文件中可以查到该函数链接到的起始地址。接着,在上述已实现的函数地址范围过滤代码时,将这些地址信息增加到过滤代码中。最后,重新编译代码、运行程序、复现问题、触发第一中断、进而触发第二中断、断点信息被过滤输出,并继续进行输出信息的分析,最终圈定死循环部位。

在一个实施例中,根据第二中断结果确定触发死循环对应的死循环位置包括:获取死循环进程对应的反汇编代码;从反汇编代码中确定与第二中断结果对应的死循环反汇编代码;将死循环反汇编代码与死循环对应死循环进程的代码进行校验,当校验通过时,根据死循环反汇编代码确定死循环对应死循环进程中的死循环位置。

本实施例中,根据死循环进程对应的反汇编代码结合第二中断结果确定触发死循环对应的死循环位置。具体地,在确定触发所述死循环对应的死循环位置时,获取死循环进程对应的反汇编代码,具体可以根据死循环进程对应的第一进程识别标识查询对应的反汇编代码。从反汇编代码中确定与第二中断结果对应的死循环反汇编代码,具体可以将第二中断结果中的地址信息与反汇编代码中的代码相对地址进行比对,从而确定与第二中断结果对应的死循环反汇编代码,并将死循环反汇编代码与死循环对应死循环进程的代码进行校验,如进行代码比对,以确定是否死循环代码,若是则校验通过,根据死循环反汇编代码确定死循环对应死循环进程中的死循环位置。若否,则表明死循环定位结果不合理,则返回执行触发第二中断程序的步骤,直到输出正确结果为止,以确定准确的死循环位置。

在具体实现时,得到死循环进程对应的反汇编代码后,检索反汇编代码中相同地址处的代码及其所在的函数名称,再对照查看所对应的高级语言程序源代码中该函数的实现代码,即可圈定死循环代码的循环路径及其准确代码部位。死循环代码是在循环控制语句作用域内循环运行、在超出设计容限时长或用户可接受容限时长后仍未终止循环运行的代码。以c语言为例,死循环代码是在while、for、dowhile、goto等循环控制语句作用域内死循环运行的代码。因此,圈定死循环代码的循环路径,就是找出这些循环控制语句之一及其作用域。根据c语言的语法规则,可以确定各循环控制语句的作用域,如:while循环的作用域是紧随其后的一条语句或紧随其后的{}括号对所包括的代码段。

在一个实施例中,死循环定位方法还包括:当死循环位置为不包括死循环的函数体时,返回执行基于第一中断结果执行第二中断程序的步骤。

本实施例中,若根据第二中断结果确定触发死循环对应的死循环位置为不包括死循环的函数体时,即得到的并非包括死循环的目标公共函数时,重复执行第二中断程序进行中断处理,具体返回执行基于第一中断结果执行第二中断程序的步骤,从而通过第二中断程序进行重复定位检测,直至确定的死循环位置为包括死循环的函数体,如包括死循环的公共函数。

应该理解的是,虽然图2-3的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2-3中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。

在一个实施例中,如图4所示,提供了一种死循环定位装置,包括:第一中断触发模块402、第一中断结果模块404、第二中断触发模块406和死循环定位模块408,其中:

第一中断触发模块402,用于当检测到死循环时,触发第一中断程序;

第一中断结果模块404,用于获取通过触发第一中断程序所产生的第一中断结果;

第二中断触发模块406,用于基于第一中断结果执行第二中断程序,第二中断程序的中断周期的数量级不大于指令执行周期的数量级;

死循环定位模块408,用于获取通过触发第二中断程序所产生的第二中断结果,并根据第二中断结果确定触发死循环对应的死循环位置。

在其中一个实施例中,第二中断触发模块406包括死循环进程确定模块和死循环进程中断模块;其中,死循环进程确定模块,用于从第一中断结果中确定死循环对应的死循环进程;死循环进程中断模块,用于触发第二中断程序对死循环进程进行中断处理。

在其中一个实施例中,死循环进程中断模块包括中断触发模块和中断处理模块;其中,中断触发模块,用于触发第二中断程序,并确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识;中断处理模块,用于当第二进程识别标识与死循环进程对应的第一进程识别标识相同时,通过第二中断程序对死循环进程进行中断处理。

在其中一个实施例中,中断处理模块包括函数体地址模块、函数体范围模块和中断结果模块;其中,函数体地址模块,用于确定死循环进程中函数体的起始地址和截止地址;函数体范围模块,用于根据起始地址和截止地址确定函数体的地址范围;中断结果模块,用于当第二中断程序的当前断点地址在函数体的地址范围之外时,确定当前断点地址对应的相对地址,根据相对地址得到第二中断结果。

在其中一个实施例中,中断结果模块包括死循环起始地址模块和相对地址模块;其中,死循环起始地址模块,用于确定死循环进程的起始地址;相对地址模块,用于根据当前断点地址和死循环进程的起始地址得到当前断点地址对应的相对地址。

在其中一个实施例中,还包括输出计数更新模块和第二中断退出模块;其中,输出计数更新模块,用于将连续输出计数加1,获得更新后的连续输出计数;第二中断退出模块,用于当更新后的连续输出计数不小于预设的连续输出阈值时,退出第二中断程序。

在其中一个实施例中,还包括中断再处理模块,用于当第二进程识别标识与死循环进程对应的第一进程识别标识不同、或第二中断程序的当前断点地址在函数体的地址范围之内、或更新后的连续输出计数小于连续输出阈值时,返回执行触发第二中断程序,并确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识。

在其中一个实施例中,死循环定位模块408包括反汇编码模块、代码匹配模块和定位模块;其中,反汇编码模块,用于获取死循环进程对应的反汇编代码;代码匹配模块,用于从反汇编代码中确定与第二中断结果对应的死循环反汇编代码;定位模块,用于将死循环反汇编代码与死循环对应死循环进程的代码进行校验,当校验通过时,根据死循环反汇编代码确定死循环对应死循环进程中的死循环位置。

在其中一个实施例中,还包括第二中断触发循环模块,用于当死循环位置为不包括死循环的函数体时,返回执行基于第一中断结果执行第二中断程序的步骤。

关于死循环定位装置的具体限定可以参见上文中对于死循环定位方法的限定,在此不再赘述。上述死循环定位装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。

在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器或终端或嵌入式设备,其内部结构图可以如图5所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种死循环定位方法。

本领域技术人员可以理解,图5中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,处理器执行计算机程序时实现以下步骤:

当检测到死循环时,触发第一中断程序;

获取通过触发第一中断程序所产生的第一中断结果;

基于第一中断结果执行第二中断程序,第二中断程序的中断周期的数量级不大于指令执行周期的数量级;

获取通过触发第二中断程序所产生的第二中断结果,并根据第二中断结果确定触发死循环对应的死循环位置。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:从第一中断结果中确定死循环对应的死循环进程;触发第二中断程序对死循环进程进行中断处理。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:触发第二中断程序,并确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识;当第二进程识别标识与死循环进程对应的第一进程识别标识相同时,通过第二中断程序对死循环进程进行中断处理。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:确定死循环进程中函数体的起始地址和截止地址;根据起始地址和截止地址确定函数体的地址范围;当第二中断程序的当前断点地址在函数体的地址范围之外时,确定当前断点地址对应的相对地址,根据相对地址得到第二中断结果。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:确定死循环进程的起始地址;根据当前断点地址和死循环进程的起始地址得到当前断点地址对应的相对地址。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:将连续输出计数加1,获得更新后的连续输出计数;当更新后的连续输出计数不小于预设的连续输出阈值时,退出第二中断程序。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:当第二进程识别标识与死循环进程对应的第一进程识别标识不同、或第二中断程序的当前断点地址在函数体的地址范围之内、或更新后的连续输出计数小于连续输出阈值时,返回执行触发第二中断程序,并确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:获取死循环进程对应的反汇编代码;从反汇编代码中确定与第二中断结果对应的死循环反汇编代码;将死循环反汇编代码与死循环对应死循环进程的代码进行校验,当校验通过时,根据死循环反汇编代码确定死循环对应死循环进程中的死循环位置。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:当死循环位置为不包括死循环的函数体时,返回执行基于第一中断结果执行第二中断程序的步骤。

在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:

当检测到死循环时,触发第一中断程序;

获取通过触发第一中断程序所产生的第一中断结果;

基于第一中断结果执行第二中断程序,第二中断程序的中断周期的数量级不大于指令执行周期的数量级;

获取通过触发第二中断程序所产生的第二中断结果,并根据第二中断结果确定触发死循环对应的死循环位置。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:从第一中断结果中确定死循环对应的死循环进程;触发第二中断程序对死循环进程进行中断处理。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:触发第二中断程序,并确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识;当第二进程识别标识与死循环进程对应的第一进程识别标识相同时,通过第二中断程序对死循环进程进行中断处理。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:确定死循环进程中函数体的起始地址和截止地址;根据起始地址和截止地址确定函数体的地址范围;当第二中断程序的当前断点地址在函数体的地址范围之外时,确定当前断点地址对应的相对地址,根据相对地址得到第二中断结果。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:确定死循环进程的起始地址;根据当前断点地址和死循环进程的起始地址得到当前断点地址对应的相对地址。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:将连续输出计数加1,获得更新后的连续输出计数;当更新后的连续输出计数不小于预设的连续输出阈值时,退出第二中断程序。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:当第二进程识别标识与死循环进程对应的第一进程识别标识不同、或第二中断程序的当前断点地址在函数体的地址范围之内、或更新后的连续输出计数小于连续输出阈值时,返回执行触发第二中断程序,并确定第二中断程序的当前中断进程和当前中断进程对应的第二进程识别标识。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取死循环进程对应的反汇编代码;从反汇编代码中确定与第二中断结果对应的死循环反汇编代码;将死循环反汇编代码与死循环对应死循环进程的代码进行校验,当校验通过时,根据死循环反汇编代码确定死循环对应死循环进程中的死循环位置。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:当死循环位置为不包括死循环的函数体时,返回执行基于第一中断结果执行第二中断程序的步骤。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。

以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1