异常堆栈信息获取方法、装置及计算机可读存储介质与流程

文档序号:13735898阅读:353来源:国知局
异常堆栈信息获取方法、装置及计算机可读存储介质与流程

本发明涉及计算机技术领域,尤其涉及一种异常堆栈信息获取方法、装置及计算机可读存储介质。



背景技术:

目前,如果app在程序设计中存在异常,则用户在使用app的过程中,会出现因app的运行异常而发生崩溃闪退的现象,导致app不能正常使用。因此,对于app开发者来说,需要获取到应用程序在发生异常时产生的异常堆栈信息,及时地对应用程序中产生的异常问题的代码进行定位并分析。

而现有的获取异常堆栈信息的方式一般是,在应用程序发生异常并崩溃后,程序再次启动时,会从本地获取异常堆栈信息并上传。但是这种处理方式存在一定的缺陷,如果应用程发生异常并崩溃后,用户没有再次启动应用,则无法上传。



技术实现要素:

本发明提供一种异常堆栈信息获取方法、装置及计算机可读存储介质,其主要目的在于解决现有技术中难以及时地获取应用程序中的异常堆栈信息并上传的技术问题。

为实现上述目的,本发明提供一种异常堆栈信息获取方法,该方法包括:

在项目的运行过程中,当侦测到预设的异常信号时,调用并执行异常信号处理函数,以获取native层的第一异常堆栈信息;

读取侦测到所述异常信号时应用层记录的第二异常堆栈信息;

将所述第一异常堆栈信息和所述第二异常堆栈信息进行组装后上报至服务器,并在上报完成后退出所述项目。

可选地,所述在项目的运行过程中,当侦测到预设的异常信号时,调用并执行异常信号处理函数,以获取native层的第一异常堆栈信息的步骤包括:

在所述项目的运行过程中,当侦测到预设的异常信号时,确定运行所述项目的操作系统的版本信息;

调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息,并根据所述地址信息生成第一异常堆栈信息。

可选地,所述调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息,并根据所述地址信息生成第一异常堆栈信息的步骤包括:

调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息;

根据所述地址信息获取异常堆栈数据,获取侦测到的所述异常信号的信号类型;

将所述信号类型与所述异常堆栈数据组装后生成所述第一异常堆栈信息。

可选地,所述第一异常堆栈信息和所述第二异常堆栈信息进行组装后上报至服务器,并在上报完成后退出所述项目的步骤包括:

读取存储的符号表,并基于所述符号表对获取到的第一异常堆栈信息进行还原处理,以将所述第一异常堆栈信息转换为所述服务器可读的第三异常堆栈信息;

将所述第三异常堆栈信息与所述第二异常堆栈信息进行组装后上报至所述服务器,并在上报完成后退出所述项目。

此外,为实现上述目的,本发明还提供一种异常堆栈信息获取装置,该装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的异常堆栈信息获取程序,所述异常堆栈信息获取程序被所述处理器执行时实现如下步骤:

在项目的运行过程中,当侦测到预设的异常信号时,调用并执行异常信号处理函数,以获取native层的第一异常堆栈信息;

读取侦测到所述异常信号时应用层记录的第二异常堆栈信息;

将所述第一异常堆栈信息和所述第二异常堆栈信息进行组装后上报至服务器,并在上报完成后退出所述项目。

可选地,所述在项目的运行过程中,当侦测到预设的异常信号时,调用并执行异常信号处理函数,以获取native层的第一异常堆栈信息的步骤包括:

在所述项目的运行过程中,当侦测到预设的异常信号时,确定运行所述项目的操作系统的版本信息;

调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息,并根据所述地址信息生成第一异常堆栈信息。

可选地,所述调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息,并根据所述地址信息生成第一异常堆栈信息的步骤包括:

调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息;

根据所述地址信息获取异常堆栈数据,获取侦测到的所述异常信号的信号类型;

将所述信号类型与所述异常堆栈数据组装后生成所述第一异常堆栈信息。

可选地,所述第一异常堆栈信息和所述第二异常堆栈信息进行组装后上报至服务器,并在上报完成后退出所述项目的步骤包括:

读取存储的符号表,并基于所述符号表对获取到的第一异常堆栈信息进行还原处理,以将所述第一异常堆栈信息转换为所述服务器可读的第三异常堆栈信息;

将所述第三异常堆栈信息与所述第二异常堆栈信息进行组装后上报至所述服务器,并在上报完成后退出所述项目。

可选地,所述读取存储的符号表,并基于所述符号表对获取到的第一异常堆栈信息进行还原处理,以将所述第一异常堆栈信息转换为所述服务器可读的第三异常堆栈信息的步骤包括:

启动信息还原脚本,基于所述信息还原脚本,将所述第一异常堆栈信息中的函数名依次与所述符号表中的函数名进行一一匹配,获取到所述第一异常堆栈信息中的函数名对应的文件名和行号;

将获取的文件名和行号添加至原始的第一异常堆栈信息,生成所述服务器可读的第三异常堆栈信息。

此外,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有异常堆栈信息获取程序,所述异常堆栈信息获取程序被处理器执行时实现上述异常堆栈信息获取方法的步骤。

本发明提出的异常堆栈信息获取方法、装置及计算机可读存储介质,在项目的运行过程中侦测到预设的异常信号时,调用并执行异常信号处理函数获取native层的第一异常堆栈信息,并且读取侦测到异常信号时应用层记录的第二异常堆栈信息,将上述native层和应用层的异常堆栈信息进行组装后上报至服务器,并且在上报完成后退出该项目,避免在检测到异常后,直接强制关闭项目,并且该发明能够通过预先定义的异常信号处理函数及时获取native层的第一异常堆栈信息在内的完整异常堆栈信息上传至服务器,能够全面的监控异常的发生,实时上报异常堆栈信息,对于开发人员来说,可以及时发现应用的异常,以便于快速进行异常定位和解决问题。

附图说明

图1为本发明异常堆栈信息获取方法第一实施例的流程图;

图2为本发明异常堆栈信息获取方法第二实施例中步骤s30的细化流程示意图;

图3为本发明异常堆栈信息获取装置较佳实施例的示意图;

图4为本发明异常堆栈信息获取装置中的异常堆栈信息获取程序的功能模块示意图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

本发明提供一种异常堆栈信息获取方法。参照图1所示,为本发明异常堆栈信息获取方法第一实施例的流程图。该方法可以由一个装置执行,该装置可以由软件和/或硬件实现。

在本实施例中,该异常堆栈信息获取方法包括:

步骤s10,在项目的运行过程中,当侦测到预设的异常信号时,调用并执行异常信号处理函数,以获取native层的第一异常堆栈信息。

本发明实施例中,项目是由代码构成的应用程序。终端可以从服务器下载项目,并安装运行。项目在终端上的运行过程中,对项目的运行情况进行实时检测。预先设置各种预设类型的异常信号,例如,</br>

_sigabrt:由调用abort函数产生,进程非正常退出</br>_

_sigill:非法指令异常</br>_

_sigbus:某种特定的硬件异常,通常有内存访问引起</br>_

_sigfpe:数学相关异常,如被除0、浮点移除等</br>_

_sigsegv:非法内存访问</br>_

在项目的运行过程中,当项目发生相关异常时,会触发对应的异常信号,来通知进程发生了异步事件。当终端侦测到的异常信号属于预设的异常信号时,调用并执行预设的异常信号处理函数,以获取native层的第一异常堆栈信息。异常信号处理函数需要预先配置,以供调用。

作为一种实施方式,异常信号处理函数可以通过以下代码实现:

其中,函数_skn\_signal\_handler_就是检测到异常信号后执行的函数,异常堆栈信息的获取就是在这个函数中进行的。

由于终端使用的操作系统的版本不同,配置的异常信号处理函数也不相同。因此,步骤s10可以包括以下细化步骤:

在所述项目的运行过程中,当侦测到预设的异常信号时,确定运行所述项目的操作系统的版本信息;调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息,并根据所述地址信息生成第一异常堆栈信息。

具体地,若操作系统的版本低于预设版本,则调用第一预设函数获取发生异常的地址信息,通过dladdr函数获取与地址信息对应的函数名以及so库信息;若操作系统的版本高于或等于预设版本,则通过dlopen函数从预设路径中调用第二预设函数获取发生异常的地址信息,通过dladdr函数获取与地址信息对应的函数名以及so库信息。其中,第一预设函数为预先配置的异常信号处理函数,第二预设函数为操作系统定义的函数,不需要用户预先配置,只需在侦测到的异常信号时,从特定的路径中调用即可。在本实施例中,异常堆栈信息主要包括发生异常的函数名以及so库信息。

以下以android系统为例,预设版本为android5.0,由于android5.0开始android采用art虚拟机,所以异常信息的获取在android5.0以上和android5.0以下需要两种方案,android5.0以上使用unwind方法,android5.0以下使用libcorkscrew.so方法。具体的,关于unwind方法的使用,可以在代码中引入unwind.h头文件,通过\_unwind\_backtrace函数获取到产生异常的地址信息后,再通过dladdr函数获取到地址信息对应的函数名和so库信息。关于libcorkscrew.so方法的使用,上述预设路径可以是android4.x版本的/system/lib/路径,通过dlopen函数打开对应的库,从而调用libcorkscrew.so方法,基于该方法查询到产生异常的地址信息,在基于该地址信息查找对应的函数名和so库信息。

优选地,作为一种实施方式,为了使开发人员能够了解到异常信号的具体信息,第一异常堆栈信息还包括侦测到的异常信号的信号类型。

调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息,并根据所述地址信息生成第一异常堆栈信息的步骤包括:调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息;根据所述地址信息获取异常堆栈数据,获取侦测到的所述异常信号的信号类型;将所述信号类型与所述异常堆栈数据组装后生成所述第一异常堆栈信息。

根据发生异常的地址信息获取到对应的有异常堆栈数据后,获取侦测到异常信号时记录的该异常信号所述的信号类型,将该信号类型与上述异常堆栈数据组装以生成第一异常堆栈信息,异常堆栈数据包括上述查找到的异常的函数名和so库信息。其中,第一异常堆栈信息可以在native层获取并保存在本地后,由native层向应用层发送通知信息,通知应用层读取,对于android系统老说,应用层即java层。在native层组装信号类型与异常堆栈数据时,使用预设的分隔符进行分隔,以便于应用层区分。

步骤s20,读取侦测到所述异常信号时应用层记录的第二异常堆栈信息。

步骤s30,将所述第一异常堆栈信息和所述第二异常堆栈信息进行组装后上报至服务器,并在上报完成后退出所述项目。

一般情况下,终端在侦测到异常信号时,其应用层会对其异常堆栈信息进行记录。一般根据系统的设置会存储在固定的路径中,因此,可以在检测到异常信号时,直接从设定的路径中读取存储的异常信息,作为上述第二异常堆栈信息。

将获取到的native层的第一异常堆栈信息和读取到的记录的应用层的第二异常堆栈信息进行封装处理,并上报到服务器,以供开发人员及时对应用程序中产生异常的代码进行定位并非分析,进而及时地对应用程序进行维护并更新。在上报完成后,退出当前的项目。

现有技术中获取native层异常堆栈的方式,一般代码量大,如googlebreakpad,或者需要系统root权限,如tombstone,才能够读取相关堆栈信息,且过程过于繁琐。

本实施例提出的异常堆栈信息获取方法,在项目的运行过程中侦测到预设的异常信号时,通过预先定义的函数获取到native层的异常堆栈信息,代码量小,且不需要root权限并且读取侦测到异常信号时应用层记录的第二异常堆栈信息,将两个异常堆栈信息封装后上传到服务器,再退出应用,避免在检测到异常后,直接强制关闭应用。因此能够及时的获取到包括native层在内的完整异常堆栈信息上传至服务器,能够全面的监控异常的发生,实时上报异常堆栈信息,对于开发人员来说,可以及时发现应用的异常,以便于快速定位和解决问题。

基于第一实施例提出本发明异常堆栈信息获取方法的第二实施例。参照图2所示,在本实施例中,步骤s30包括以下细化步骤:

步骤s31,读取存储的符号表,并基于所述符号表对获取到的第一异常堆栈信息进行还原处理,以将所述第一异常堆栈信息转换为所述服务器可读的第三异常堆栈信息;

步骤s32,将所述第三异常堆栈信息与所述第二异常堆栈信息进行组装后上报至所述服务器,并在上报完成后退出所述项目。

一般情况下,通过上述方式获取到的第一异常堆栈信息,对于开发者来说,可读性比较低,从第一异常信息中只能简单的看出其函数名,无法直接了解到异常所在的文件名以及所在的行号。为了提高其可读性,在获取到第一异常堆栈信息后,通过该应用匹配的符号表来对第一异常堆栈信息进行还原处理,以得到包含有函数名、该函数名对应的文件名以及行号的第三异常堆栈信息。其中,符号表是一种用于语言翻译器的数据结构,在符号表中,程序源代码中每个标识符都和它的声明或者使用信息绑定在一起,在该实施例中,在项目的符号表中,每一个函数名都有其对应的文件名及所在的行号。每一个版本的项目对应一个符号表,若项目升级,则需要对其符号表进行更新。

优选地,在其他实施例中,为了提高项目信息的安全性,可以将符号表存放在服务器,服务器接收到终端上报的异常堆栈信息后,根据存储的符号表对第一异常堆栈信息进行还原处理。

本实施例中,预先配置有信息还原脚本,获取到第一异常堆栈信息后,启动信息还原脚本,基于所述信息还原脚本,将所述第一异常堆栈信息中的函数名依次与所述符号表中的函数名进行一一匹配,获取到所述第一异常堆栈信息中的函数名对应的文件名和行号;将获取的文件名和行号添加至原始的第一异常堆栈信息,生成所述服务器可读的第三异常堆栈信息。

信息还原脚本可以是:

<code><pre>

./sknsymbol.shcrash.txtsymbol.txt>result.txt

</code></pre>

其中,crash.txt为未还原的异常信息,即第一异常堆栈信息;symbol.txt为符号表;result.txt为还原后的异常信息,即第三异常堆栈信息。

例如,若获取到的异常信息为:

<code><pre>

\_z2aav/data/app/com.pingan.pad_demo-2/lib/arm/libcrash.so

</code></pre>

经过上述信息还原脚本还原后的异常信息为:

<code><pre>

z2aav

/users/duyuan797/workspace/sky-eye/sky-eye/src/main/cpp/./src/skncrash.cp

p:72/data/app/com.pingan.pad_demo-2/lib/arm/libcrash.so

</code></pre>

本实施例提出的方法,通过对获取到的native层的第一异常堆栈信息进行还原处理,以提高服务器对其的可读性,便于开发者获取到更加完整的异常信息。

参照图3所示,为本发明异常堆栈信息获取装置较佳实施例的示意图。

在本实施例中,异常堆栈信息获取装置可以是智能手机、平板电脑、电子书阅读器、mp3(movingpictureexpertsgroupaudiolayeriii,动态影像专家压缩标准音频层面3)播放器、mp4(movingpictureexpertsgroupaudiolayeriv,动态影像专家压缩标准音频层面4)播放器、便携计算机等具有显示功能的可移动式终端设备。

该异常堆栈信息装置包括存储器11、处理器12,通信总线13,以及网络接口14。其中,通信总线13用于实现这些组件之间的连接通信。网络接口14可选的可以包括标准的有线接口、无线接口(如wi-fi接口)。存储器11可以是高速ram存储器,也可以是稳定的存储器(non-volatilememory),例如磁盘存储器。

存储器11在一些实施例中可以是异常堆栈信息获取装置的内部存储单元,例如该异常堆栈信息获取装置的硬盘。存储器11在另一些实施例中也可以是异常堆栈信息获取装置的外部存储设备,例如异常堆栈信息获取装置上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。进一步地,存储器11还可以既包括异常堆栈信息获取装置的内部存储单元也包括外部存储设备。存储器11不仅可以用于存储安装于异常堆栈信息获取装置的应用软件及各类数据,例如异常堆栈信息获取程序的代码等,还可以用于暂时地存储已经输出或者将要输出的数据。

处理器12在一些实施例中可以是一中央处理器(centralprocessingunit,cpu),微处理器或其他数据处理芯片,用于运行存储器11中存储的程序代码或处理数据,例如执行异常堆栈信息获取程序等。

图3仅示出了具有组件11-14以及异常堆栈信息获取程序的异常堆栈信息获取装置,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。

可选地,该装置还可以包括用户接口,用户接口可以包括显示器(display)、输入单元比如键盘(keyboard),可选的用户接口还可以包括标准的有线接口、无线接口。在一些实施例中,显示器可以是led显示器、液晶显示器、触控式液晶显示器以及oled(organiclight-emittingdiode,有机发光二极管)触摸器等。显示器用于显示在异常堆栈信息获取装置中处理的信息以及用于显示可视化的用户界面。

可选地,该装置还可以包括摄像头、rf(radiofrequency,射频)电路,传感器、音频电路、wifi模块等等。其中,传感器比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,若该装置为移动终端,环境光传感器可根据环境光线的明暗来调节显示屏的亮度,接近传感器可在移动终端移动到耳边时,关闭显示屏和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别移动终端姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;当然,移动终端还可配置陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。

在图3所示的装置实施例中,作为一种计算机存储介质的存储器11中可以包括操作系统、以及异常堆栈信息获取程序;网络接口14主要用于连接服务器,与服务器进行数据通信;处理器12执行存储器11中存储的异常堆栈信息获取程序时实现如下步骤:

在项目的运行过程中,当侦测到预设的异常信号时,调用并执行异常信号处理函数,以获取native层的第一异常堆栈信息;

读取侦测到所述异常信号时应用层记录的第二异常堆栈信息;

将所述第一异常堆栈信息和所述第二异常堆栈信息进行组装后上报至服务器,并在上报完成后退出所述项目。

本发明实施例中,项目是由代码构成的应用程序。终端可以从服务器下载项目,并安装运行。项目在终端上的运行过程中,对项目的运行情况进行实时检测。预先设置各种预设类型的异常信号,例如,</br>

_sigabrt:由调用abort函数产生,进程非正常退出</br>_

_sigill:非法指令异常</br>_

_sigbus:某种特定的硬件异常,通常有内存访问引起</br>_

_sigfpe:数学相关异常,如被除0、浮点移除等</br>_

_sigsegv:非法内存访问</br>_

在项目的运行过程中,当项目发生相关异常时,会触发对应的异常信号,来通知进程发生了异步事件。当终端侦测到的异常信号属于预设的异常信号时,调用并执行预设的异常信号处理函数,以获取native层的第一异常堆栈信息。异常信号处理函数需要预先配置,以供调用。

作为一种实施方式,异常信号处理函数可以通过以下代码实现:

其中,函数_skn\_signal\_handler_就是检测到异常信号后执行的函数,异常堆栈信息的获取就是在这个函数中进行的。

由于终端使用的操作系统的版本不同,配置的异常信号处理函数也不相同。因此,异常堆栈信息获取程序被处理器12执行时还实现如下步骤:

在所述项目的运行过程中,当侦测到预设的异常信号时,确定运行所述项目的操作系统的版本信息;调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息,并根据所述地址信息生成第一异常堆栈信息。

具体地,异常堆栈信息获取程序被处理器12执行时还实现如下步骤:

若操作系统的版本低于预设版本,则调用第一预设函数获取发生异常的地址信息,通过dladdr函数获取与地址信息对应的函数名以及so库信息;若操作系统的版本高于或等于预设版本,则通过dlopen函数从预设路径中调用第二预设函数获取发生异常的地址信息,通过dladdr函数获取与地址信息对应的函数名以及so库信息。

其中,第一预设函数为预先配置的异常信号处理函数,第二预设函数为操作系统定义的函数,不需要用户预先配置,只需在侦测到的异常信号时,从特定的路径中调用即可。在本实施例中,异常堆栈信息主要包括发生异常的函数名以及so库信息。

以下以android系统为例,预设版本为android5.0,由于android5.0开始android采用art虚拟机,所以异常信息的获取在android5.0以上和android5.0以下需要两种方案,android5.0以上使用unwind方法,android5.0以下使用libcorkscrew.so方法。具体的,关于unwind方法的使用,可以在代码中引入unwind.h头文件,通过\_unwind\_backtrace函数获取到产生异常的地址信息后,再通过dladdr函数获取到地址信息对应的函数名和so库信息。关于libcorkscrew.so方法的使用,上述预设路径可以是android4.x版本的/system/lib/路径,通过dlopen函数打开对应的库,从而调用libcorkscrew.so方法,基于该方法查询到产生异常的地址信息,在基于该地址信息查找对应的函数名和so库信息。

优选地,作为一种实施方式,为了使开发人员能够了解到异常信号的具体信息,第一异常堆栈信息还包括侦测到的异常信号的信号类型。

异常堆栈信息获取程序被处理器12执行时还实现如下步骤:

调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息,并根据所述地址信息生成第一异常堆栈信息的步骤包括:调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息;根据所述地址信息获取异常堆栈数据,获取侦测到的所述异常信号的信号类型;将所述信号类型与所述异常堆栈数据组装后生成所述第一异常堆栈信息。

根据发生异常的地址信息获取到对应的有异常堆栈数据后,获取侦测到异常信号时记录的该异常信号所述的信号类型,将该信号类型与上述异常堆栈数据组装以生成第一异常堆栈信息,异常堆栈数据包括上述查找到的异常的函数名和so库信息。其中,第一异常堆栈信息可以在native层获取并保存在本地后,由native层向应用层发送通知信息,通知应用层读取,对于android系统老说,应用层即java层。在native层组装信号类型与异常堆栈数据时,使用预设的分隔符进行分隔,以便于应用层区分。

一般情况下,终端在侦测到异常信号时,其应用层会对其异常堆栈信息进行记录。一般根据系统的设置会存储在固定的路径中,因此,可以在检测到异常信号时,直接从设定的路径中读取存储的异常信息,作为上述第二异常堆栈信息。

将获取到的native层的第一异常堆栈信息和读取到的记录的应用层的第二异常堆栈信息进行封装处理,并上报到服务器,以供开发人员及时对应用程序中产生异常的代码进行定位并非分析,进而及时地对应用程序进行维护并更新。在上报完成后,退出当前的项目。

现有技术中获取native层异常堆栈的方式,一般代码量大,如googlebreakpad,或者需要系统root权限,如tombstone,才能够读取相关堆栈信息,且过程过于繁琐。

本实施例提出的异常堆栈信息获取装置,在项目的运行过程中侦测到预设的异常信号时,通过预先定义的函数获取到native层的异常堆栈信息,代码量小,且不需要root权限并且读取侦测到异常信号时应用层记录的第二异常堆栈信息,将两个异常堆栈信息封装后上传到服务器,再退出应用,避免在检测到异常后,直接强制关闭应用。因此能够及时的获取到包括native层在内的完整异常堆栈信息上传至服务器,能够全面的监控异常的发生,实时上报异常堆栈信息,对于开发人员来说,可以及时发现应用的异常,以便于快速定位和解决问题。

基于第一实施例提出本发明异常堆栈信息获取装置的第二实施例。在本实施例中,异常堆栈信息获取程序被处理器12执行时还实现如下步骤:

读取存储的符号表,并基于所述符号表对获取到的第一异常堆栈信息进行还原处理,以将所述第一异常堆栈信息转换为所述服务器可读的第三异常堆栈信息;

将所述第三异常堆栈信息与所述第二异常堆栈信息进行组装后上报至所述服务器,并在上报完成后退出所述项目。

一般情况下,通过上述方式获取到的第一异常堆栈信息,对于开发者来说,可读性比较低,从第一异常信息中只能简单的看出其函数名,无法直接了解到异常所在的文件名以及所在的行号。为了提高其可读性,在获取到第一异常堆栈信息后,通过该应用匹配的符号表来对第一异常堆栈信息进行还原处理,以得到包含有函数名、该函数名对应的文件名以及行号的第三异常堆栈信息。其中,符号表是一种用于语言翻译器的数据结构,在符号表中,程序源代码中每个标识符都和它的声明或者使用信息绑定在一起,在该实施例中,在项目的符号表中,每一个函数名都有其对应的文件名及所在的行号。每一个版本的项目对应一个符号表,若项目升级,则需要对其符号表进行更新。

优选地,在其他实施例中,为了提高项目信息的安全性,可以将符号表存放在服务器,服务器接收到终端上报的异常堆栈信息后,根据存储的符号表对第一异常堆栈信息进行还原处理。

本实施例中,预先配置有信息还原脚本,获取到第一异常堆栈信息后,处理器12执行异常堆栈信息获取程序,实现如下步骤:

启动信息还原脚本,基于所述信息还原脚本,将所述第一异常堆栈信息中的函数名依次与所述符号表中的函数名进行一一匹配,获取到所述第一异常堆栈信息中的函数名对应的文件名和行号;将获取的文件名和行号添加至原始的第一异常堆栈信息,生成所述服务器可读的第三异常堆栈信息。

信息还原脚本可以是:

<code><pre>

./sknsymbol.shcrash.txtsymbol.txt>result.txt

</code></pre>

其中,crash.txt为未还原的异常信息,即第一异常堆栈信息;symbol.txt为符号表;result.txt为还原后的异常信息,即第三异常堆栈信息。

例如,若获取到的异常信息为:

<code><pre>

\_z2aav/data/app/com.pingan.pad_demo-2/lib/arm/libcrash.so

</code></pre>

经过上述信息还原脚本还原后的异常信息为:

<code><pre>

z2aav

/users/duyuan797/workspace/sky-eye/sky-eye/src/main/cpp/./src/skncrash.cpp:72/data/app/com.pingan.pad_demo-2/lib/arm/libcrash.so

</code></pre>

本实施例提出的装置,通过异常堆栈信息获取程序获取到的native层的第一异常堆栈信息进行还原处理,以提高服务器对其的可读性,便于开发者获取到更加完整的异常信息。

可选地,在其他的实施例中,异常堆栈信息获取程序还可以被分割为一个或者多个模块,一个或者多个模块被存储于存储器11中,并由一个或多个处理器(本实施例为处理器12)所执行,以完成本发明。本发明所称的模块是指能够完成特定功能的一系列计算机程序指令段,用于描述异常堆栈信息获取程序在异常堆栈信息获取装置中的执行过程。

例如,在一实施例中,异常堆栈信息获取程序可以被分割为获取模块10和上报模块20,参照图4所示,为本发明异常堆栈信息获取装置中的异常堆栈信息获取程序的功能模块示意图,其中:

获取模块10,用于在项目的运行过程中,当侦测到预设的异常信号时,调用并执行异常信号处理函数,以获取native层的第一异常堆栈信息,以及读取侦测到所述异常信号时应用层记录的第二异常堆栈信息;

上报模块20,用于将所述第一异常堆栈信息和所述第二异常堆栈信息进行组装后上报至服务器,并在上报完成后退出所述项目。

此外,本发明实施例还提出一种计算机可读存储介质,所述计算机可读存储介质上存储有异常堆栈信息获取程序,所述异常堆栈信息获取程序被处理器执行时实现如下操作:

在项目的运行过程中,当侦测到预设的异常信号时,调用并执行异常信号处理函数,以获取native层的第一异常堆栈信息;

读取侦测到所述异常信号时应用层记录的第二异常堆栈信息;

将所述第一异常堆栈信息和所述第二异常堆栈信息进行组装后上报至服务器,并在上报完成后退出所述项目。

进一步地,所述异常堆栈信息获取程序被处理器执行时还实现如下操作:

在所述项目的运行过程中,当侦测到预设的异常信号时,确定运行所述项目的操作系统的版本信息;

调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息,并根据所述地址信息生成第一异常堆栈信息。

进一步地,所述异常堆栈信息获取程序被处理器执行时还实现如下操作:

调用并执行与所述操作系统的版本信息对应的异常信号处理函数,获取发生异常的地址信息;

根据所述地址信息获取异常堆栈数据,获取侦测到的所述异常信号的信号类型;

将所述信号类型与所述异常堆栈数据组装后生成所述第一异常堆栈信息。

进一步地,所述异常堆栈信息获取程序被处理器执行时还实现如下操作:

读取存储的符号表,并基于所述符号表对获取到的第一异常堆栈信息进行还原处理,以将所述第一异常堆栈信息转换为所述服务器可读的第三异常堆栈信息;

将所述第三异常堆栈信息与所述第二异常堆栈信息进行组装后上报至所述服务器,并在上报完成后退出所述项目。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

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