本发明涉及终端技术领域,具体涉及一种异常信号处理方法及装置。
背景技术:
客户端在运行过程中,可能会因为各种原因而发生崩溃,解决崩溃问题是移动应用开发者日常的工作之一。
目前,操作系统中引发客户端崩溃的代码本质上有两类,一类是C++语言层面的异常,比如野指针、除零、内存访问异常等系统底层异常;另一类是未捕获异常,比如iOS操作系统中最常见的objective-c的NSException。
对于上述第一类异常,可通过信号机制来捕获,即任何系统异常都会抛出一个异常信号,通过设定的signal函数对异常信号进行捕获。然而,该signal函数在捕获到异常信号后会“吃掉”该异常信号,这使得其它有捕获该异常信号需求的工程师就无法捕获该异常信号了。
技术实现要素:
本发明提供一种异常信号处理方法及装置,使得已被捕获的异常信号能够被再次捕获。
本发明一方面提供一种异常信号处理方法,包括:
对异常信号进行捕获;
当捕获到异常信号时,记录当前捕获到的上述异常信号的位置信息;
根据记录的上述异常信号的位置信息再次引发上述异常信号。
基于上述第一方面,在第一种可能的实现方式中,上述对异常信号进行捕获具体为:通过signal函数或sigaction函数对异常信号进行捕获;
上述当捕获到异常信号时,存储当前捕获到的异常信号的位置信息,具体为:当通过signal函数或sigaction函数捕获到异常信号时,记录当前捕获到的上述异常信号的位置信息。
基于上述第一方面,或者上述第一方面的第一种可能的实现方式,在第二种可能的实现方式中,上述根据记录的上述异常信号的位置信息再次引发上述异常信号,具体为:
根据记录的上述异常信号的位置信息,调用raise函数引发上述异常信号。
基于上述第一方面,或者上述第一方面的第一种可能的实现方式,在第三种可能的实现方式中,当捕获到异常信号之后,上述方法还包括:
通过Utils.Log方法并基于上述异常信号生成崩溃日志。
基于本发明第一方面的第三种可能的实现方式,在第四种可能的实现方式中,上述通过Utils.Log方法将上述异常信号记录到崩溃日志中,之后还包括:
上报上述崩溃日志。
本发明第二方面提供一种异常信号处理装置,包括:
捕获单元,用于对异常信号进行捕获;
记录单元,用于当上述捕获单元捕获到异常信号时,记录当前捕获到的上述异常信号的位置信息;
激活单元,用于根据上述记录单元记录的上述异常信号的位置信息再次引发上述异常信号。
基于本发明第二方面,在第一种可能的实现方式中,上述捕获单元具体用于:通过signal函数或sigaction函数对异常信号进行捕获;
上述记录单元具体用于:当上述捕获单元捕获到通过signal函数或sigaction函数捕获到异常信号时,记录当前捕获到的上述异常信号的位置信息。
基于本发明第二方面,或者本发明第二方面的第一种可能的实现方式,在第二种可能的实现方式中,上述激活单元具体用于:根据上述记录单元记录的上述异常信号的位置信息,调用raise函数引发上述异常信号。
基于本发明第二方面,或者本发明第二方面的第一种可能的实现方式,在第三种可能的实现方式中,上述异常信号处理装置还包括:
生成单元,用于通过Utils.Log方法并基于上述捕获单元捕获到的异常信号生成崩溃日志。
基于本发明第二方面的第三种可能的实现方式,在第四种可能的实现方式中,上述异常信号处理装置还包括:
上报单元,用于上报上述生成单元生成的上述崩溃日志。
由上可见,本发明在捕获到异常信号时,记录当前捕获到的异常信号的位置信息,之后根据记录的异常信号的位置信息再次引发该异常信号,从而不影响其他人对该异常信号的捕获,使得已被捕获的异常信号能够被再次捕获。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明提供的一种异常信号处理方法一个实施例流程示意图;
图2为本发明提供的一种异常信号处理装置一个实施例结构示意图。
具体实施方式
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而非全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
本发明实施例提供一种异常信号处理方法,请参阅图1,本发明实施例中的异常信号处理方法,包括:
步骤101、对异常信号进行捕获;
本发明实施例中提及的异常信号主要是指野指针、除零、内存访问异常等系统底层的异常信号。
可选的,通过signal函数或sigaction函数对异常信号进行捕获。下面分别对通过signal函数或sigaction函数进行说明:
1、对于signal函数,在<signal.h>这个头文件中,其函数格式如下:
signal(参数1,参数2);
其中,参数1表示待处理的信号,参数2表示处理的方式(例如系统默认操作、忽略还是捕获)。
在本发明实施例中,通过将上述参数1设置为待捕获的异常信号(例如系统底层的异常信号),将参数2设置为捕获,以此实现通过signal函数对异常信号进行捕获。
2、sigaction函数的接口头文件及原型如下:
#include<signal.h>
int sigaction(int signum,const struct sigaction*act,struct sigaction*oldact);
其中,signum表示待处理的信号;act表示对待处理的信号的新处理方式;oldact表示对待处理的信号的原处理方式。
在本发明实施例中,通过将signum设置为待捕获的异常信号(例如系统底层的异常信号),将act设置为捕获,即可实现通过sigaction函数对异常信号进行捕获。
当然,本发明实施例中也可以通过其它方式对异常信号进行捕获,此处不作限定。
步骤102、当捕获到异常信号时,记录当前捕获到的上述异常信号的位置信息;
本发明实施例中,当步骤101捕获到异常信号时,记录当前捕获到的上述异常信号的位置信息。由于此时异常信号多是位于内存中,因此,当捕获到异常信号时,上述记录当前捕获到的上述异常信号的位置信息实质上是为记录当前捕获到的上述异常信号在内存中的位置信息。
可选的,只在通过signal函数或sigaction函数捕获到异常信号时,才记录当前捕获到的上述异常信号的位置信息。则步骤102具体表现为:当通过signal函数或sigaction函数捕获到异常信号时,记录当前捕获到的上述异常信号的位置信息。
步骤103、根据记录的上述异常信号的位置信息再次引发上述异常信号;
本发明实施例中,根据步骤102记录的上述异常信号的位置信息激活上述异常信息,以便再次引发上述异常信号。
具体地,可以根据记录的上述异常信号的位置信息,调用raise函数引发步骤102记录的异常信号。下面对raise函数进行说明:
raise函数所需头文件:
#include<signal.h>
#include<sys/types.h>
函数原型
Int raise(int sig)
其中,sig表示待发送的信号,本发明实施例中,通过将sig设置为捕获到的异常信号,即可实现通过raise函数再次引发捕获到的异常信号。
进一步,当捕获到异常信号之后,基于捕获到的异常信号生成崩溃日志。具体地,可通过Utils.Log方法并基于步骤101捕获到的异常信号生成崩溃日志。
进一步,在生成崩溃日志之后,上报该崩溃日志,以便工程人员基于该崩溃日志进行异常的分析和解决。
需要说明的是,本发明实施例中的异常信号处理方法具体可以由异常信号处理装置实现,该异常信号处理装置可以为智能终端(例如智能手机、平板电脑等),具体地,该异常信号处理装置可以搭载iOS操作系统、Andorid操作系统或其它底层为unix系统(或类unix系统)的操作系统的智能终端中。
由上可见,本发明在捕获到异常信号时,记录当前捕获到的异常信号的位置信息,之后根据记录的异常信号的位置信息再次引发该异常信号,从而不影响其他人对该异常信号的捕获,使得已被捕获的异常信号能够被再次捕获。
实施例二
本发明实施例提供一种异常信号处理装置。请参阅图2,本发明实施例中的异常信号处理装置200,包括:
捕获单元201,用于对异常信号进行捕获;
记录单元202,用于当捕获单元201捕获到异常信号时,记录当前捕获到的上述异常信号的位置信息;
激活单元203,用于根据记录单元202记录的上述异常信号的位置信息再次引发上述异常信号。
可选的,捕获单元201具体用于:通过signal函数或sigaction函数对异常信号进行捕获;记录单元202具体用于:当捕获单元201捕获到通过signal函数或sigaction函数捕获到异常信号时,记录当前捕获到的上述异常信号的位置信息。
可选的,激活单元203具体用于:根据记录单元202记录的上述异常信号的位置信息,调用raise函数引发上述异常信号。
可选的,本发明实施例中的异常信号处理装置还包括:
生成单元,用于通过Utils.Log方法并基于上述捕获单元捕获到的异常信号生成崩溃日志。
进一步,本发明实施例中的异常信号处理装置还包括:
上报单元,用于上报上述生成单元生成的上述崩溃日志。
需要说明的是,本发明实施例中的异常信号处理装置可以为智能终端(例如智能手机、平板电脑等),具体地,该异常信号处理装置可以搭载iOS操作系统、Andorid操作系统或其它底层为unix系统(或类unix系统)的操作系统的智能终端中。
应理解,本发明实施例中的异常信号处理装置的各个功能模块的功能可以根据上述方法实施例中的方法具体实现,其具体实现过程可参照上述方法实施例中的相关描述,此处不再赘述。
由上可见,本发明在捕获到异常信号时,记录当前捕获到的异常信号的位置信息,之后根据记录的异常信号的位置信息再次引发该异常信号,从而不影响其他人对该异常信号的捕获,使得已被捕获的异常信号能够被再次捕获。
需要说明的是,在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,上述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本发明所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
以上为对本发明所提供的一种异常信号处理方法及装置的描述,对于本领域的一般技术人员,依据本发明实施例的思想,在具体实施方式及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本发明的限制。