本公开涉及计算机技术领域,具体而言,涉及一种捕获应用程序崩溃信息的方法、装置、计算机可读存储介质及电子设备。
背景技术:
随着计算机应用的发展,满足用户各种计算机应用程序层出不穷。然而,应用程序运行过程中,有时会发生程序崩溃的现象,无论是指针越界还是非法操作,都将给系统造成巨大的损失。但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事。
因此,亟需一种在应用程序发生崩溃的时候记录下产品崩溃的原因,以方便产品开发人员及时定位到程序的出错的代码,提高代码的质量及产品的稳定性的技术方案。
需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。
技术实现要素:
本公开实施例的目的在于提供一种捕获应用程序崩溃信息的方法、装置、计算机可读存储介质及电子设备,进而至少在一定程度上克服相关技术中存在的定位应用程序崩溃效率较低的问题。
本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本公开的实践而习得。
根据本公开实施例的一方面,提供了一种捕获应用程序崩溃信息的方法,包括:当检测到所述应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件;拦截写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中;根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件;将所述崩溃信息的可读文件上传至服务器,以便于所述服务器根据所述崩溃信息的可读文件定位和分析所述应用程序的本地崩溃。
根据本公开实施例的一方面,提供了一种捕获应用程序崩溃信息的装置,包括:崩溃信息写入单元,用于当检测到所述应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件;崩溃信息拦截单元,用于拦截写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中;可读文件生成单元,用于根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件;可读文件上传单元,用于将所述崩溃信息的可读文件上传至服务器,以便于所述服务器根据所述崩溃信息的可读文件定位和分析所述应用程序的本地崩溃。
根据本公开实施例的一方面,提供了一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现如上述实施例中所述的捕获应用程序崩溃信息的方法。
根据本公开实施例的一方面,提供了一种电子设备,包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如上述实施例中所述的捕获应用程序崩溃信息的方法。
在本公开的一些实施例所提供的技术方案中,提供了一种能够捕获原生(native)层崩溃的方式,通过对本地生成的崩溃文件(当检测到所述应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件)进行拦截,进行本地直接解析(拦截将要写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中;根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件),在本地生成本地崩溃的崩溃信息的可读文件,该可读文件包括的是可读可直接查看的字符串信息,使得上传到服务器的是字符串信息,这样服务器可以直接查看,避免了服务器执行大量的可执行文件来解析转储文件(dump文件),一方面,本地解析一步到位,可以不需要将转储文件上传至服务器;另一方面,可以降低服务器的cpu(centralprocessingunit,中央处理器)和内存空间的消耗量,有利于服务器快速、及时地定位到应用程序的本地崩溃并对其进行分析,以改进应用程序。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1示出了可以应用本公开实施例的捕获应用程序崩溃信息的方法或捕获应用程序崩溃信息的装置的示例性系统架构的示意图;
图2示出了适于用来实现本公开实施例的电子设备的计算机系统的结构示意图;
图3示意性示出了根据本公开的一实施例的捕获应用程序崩溃信息的方法的流程图;
图4示意性示出了根据本公开的一实施例的捕获应用程序崩溃信息的方法的示意图;
图5示意性示出了根据本公开的一实施例的捕获应用程序崩溃信息的方法的流程图;
图6示意性示出了根据本公开的一实施例的捕获应用程序崩溃信息的方法的流程图;
图7示意性示出了根据本公开的一个实施例的捕获应用程序崩溃信息的装置的框图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本公开的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本公开的各方面。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
图1示出了可以应用本公开实施例的捕获应用程序崩溃信息的方法或捕获应用程序崩溃信息的装置的示例性系统架构100的示意图。
如图1所示,系统架构100可以包括终端设备101、102、103中的一种或多种,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。比如服务器105可以是多个服务器组成的服务器集群、云端服务器等。
用户可以使用终端设备101、102、103通过网络104与服务器105交互,以接收或发送消息等。终端设备101、102、103可以是具有显示屏的各种电子设备,包括但不限于智能手机、平板电脑、便携式计算机、可穿戴智能设备、智能家居设备和台式计算机等等。
当终端设备101(也可以是终端设备102或者103)检测到其上安装的应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件;拦截写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中;根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件;终端设备101还可以将所述崩溃信息的可读文件上传至服务器105,服务器105可以根据所述崩溃信息的可读文件定位和分析所述应用程序的本地崩溃。服务器105可以是提供各种服务的服务器。
图2示出了适于用来实现本公开实施例的电子设备的计算机系统的结构示意图。
需要说明的是,图2示出的电子设备的计算机系统200仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图2所示,计算机系统200包括中央处理单元(cpu)201,其可以根据存储在只读存储器(rom)202中的程序或者从存储部分208加载到随机访问存储器(ram)203中的程序而执行各种适当的动作和处理。在ram203中,还存储有系统操作所需的各种程序和数据。cpu201、rom202以及ram203通过总线204彼此相连。输入/输出(i/o)接口205也连接至总线204。
以下部件连接至i/o接口205:包括键盘、鼠标等的输入部分206;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分207;包括硬盘等的存储部分208;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分209。通信部分209经由诸如因特网的网络执行通信处理。驱动器210也根据需要连接至i/o接口205。可拆卸介质211,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器210上,以便于从其上读出的计算机程序根据需要被安装入存储部分208。
特别地,根据本公开的实施例,下文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读存储介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分209从网络上被下载和安装,和/或从可拆卸介质211被安装。在该计算机程序被中央处理单元(cpu)201执行时,执行本申请的系统中限定的各种功能。
需要说明的是,本公开所示的计算机可读存储介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读存储介质,该计算机可读存储介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读存储介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、rf等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现,所描述的单元也可以设置在处理器中。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定。
作为另一方面,本申请还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中描述的电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或者多个程序被一个该电子设备执行时,使得该电子设备实现如下述实施例中所述的方法。例如,所述的电子设备可以实现如图3或图4或图5所示的各个步骤。
android分4层:java应用程序,java框架,本地框架(native层)和java运行环境,linux内核空间。这些层大致如此区分:
java应用程序基本可以理解为各个app(application,应用程序),由java语言实现。java框架层就是常说的framework,编写android代码之所以能够正常识别和动作,都要依赖这一层的支持。
native层这部分常见一些本地服务和一些链接库等。这一层的一个特点就是通过c和c 语言实现。比如我们现在要执行一个复杂运算,如果通过java代码去实现,那么效率会非常低,此时可以选择通过c或c 代码去实现,然后和上层的java代码通信(这部分在android中称为jni(javanativeinterface,java本地接口)机制)。这是因为java是一种解释性语言,意味着其在执行时会被“翻译”为二进制形式,而c和c 语言是编译语言,意味着程序只能在特定操作系统上编译并在特定系统上运行,也就是说一步到位成机器语言的,因此其软件运行速度更快且能够直接与计算机内存、磁盘、cpu或者其它设备进行协作。又比如设备需要运行,那么必然要和底层的硬件驱动交互,也要通过native层。
linux内核空间这部分顾名思义,就是kernel部分。
程序在运行时,难免会有一些异常情况发生,特别是在条件不容许去挂调试器的时候,如何快速的定位错误的方法就显得很重要。
android上的crash(崩溃)可以分两种:
1、javacrash
java代码导致jvm(javavirtualmachine,java虚拟机)退出,弹出“程序已经崩溃”的对话框,最终用户点击关闭后进程退出。logcat(是android中的一个命令行工具,可以用于得到应用程序的log信息)会在“androidruntime”tag下输出java的调用栈。
2、nativecrash(本地崩溃)
在c和c 编程实践中,通常都会遇到内存访问无效、无效对象、堆栈溢出、空指针调用等常见的c/c 问题,而这些问题最后常会导致:系统崩溃,这种称之为本地崩溃。
在android平台,在开发过程中androidjni层的crash(崩溃)问题是个比较头疼的问题。相对java层来说,由于c/c 造成的crash没有输出如同java的exceptionstrace,所以定位问题是个比较艰难的事情。同时,由于nativecrash具有上下文不全、出错信息模糊、难以捕捉等特点,比javacrash更难修复。
此外,android应用程序开发完成后,经常会发生崩溃,但是这些崩溃是发生在用户移动终端例如手机端,需要收集这些信息来分析应用程序发生崩溃的代码片段来改进应用程序,但是手机崩溃信息通常是崩溃输出在logcat中,而且这些信息系统没有提供相应的api(applicationprogramminginterface,应用程序接口)来获取,所以需要一种来收集崩溃的日志信息的方法,并且将这些信息上传到服务器,以方便开发人员进行分析。
相关技术中,至少存在以下技术问题:第一,在客户端不能分析日志,而是把一个不能直接查看的本地生成的崩溃信息文件(例如一个16进制的dump文件,转储文件)上传到服务器端分析,因此,服务器端需要先编译后生成可执行文件,然后执行可执行文件将该崩溃信息文件再解析一次,才可以看到异常的明文信息,服务器端每解析一次需要运行一个进程,这样会非常消耗服务器端的内存和cpu资源,且由此导致服务器端分析定位效率低下,无法及时定位出发生问题的代码位置,也就无法及时改进应用程序;第二,通过自己定义拦截崩溃信号来实现,兼容性差。如果程序发生异常,会向系统发送一个信号,也就是linux的signal,类似的方法是拦截这个linux信号来处理异常信息,虽然也能收集信息,但是拦截系统信号会导致应用程序稳定性降低。
基于上述问题,在本公开的一个实施例中提出了一种捕获应用程序崩溃信息的方法,以对上述问题进行优化处理。具体参照图3所示,该捕获应用程序崩溃信息的方法适用于前述实施例中所述的电子设备,并可以包括步骤s310至步骤s340:
在步骤s310中,当检测到所述应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件。
本公开实施例中的应用程序使用了c/c 来开发app的部分模块。当遇到该应用程序发生nativecash时,生成.dmp文件作为转储文件,以将发生nativecash时的崩溃信息写入转储文件中,存储至转储文件中的通常是16进制的不可读数据。
在步骤s320中,拦截写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中。
本公开实施例中,可以通过拦截将要写入上述转储文件中的崩溃信息,将崩溃信息中的字符串保存到预先定义的全局变量中。
在步骤s330中,根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件。
本公开实施例中,可以根据上述保存到预定义全局变量中的字符串,来生成崩溃信息的可读文件。
在步骤s340中,将所述崩溃信息的可读文件上传至服务器,以便于所述服务器根据所述崩溃信息的可读文件定位和分析所述应用程序的本地崩溃。
app运行期间,有大量的崩溃信息是保存在本地的,但是通常需要这部分信息来分析代码出错的地方。本公开实施例中可以收集崩溃信息的可读文件上传至服务器后台进行分析。
根据本公开实施方式提供的捕获应用程序崩溃信息的方法,提供了一种能够捕获原生(native)层崩溃的方式,通过对本地生成的崩溃文件(当检测到所述应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件)进行拦截,进行本地直接解析(拦截将要写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中;根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件),在本地生成本地崩溃的崩溃信息的可读文件,该可读文件包括的是可读可直接查看的字符串信息,使得上传到服务器的是字符串信息,这样服务器可以直接查看,避免了服务器执行大量的可执行文件来解析转储文件(dump文件),一方面,本地解析一步到位,可以不需要将转储文件上传至服务器;另一方面,可以降低服务器的cpu(centralprocessingunit,中央处理器)和内存空间的消耗量,有利于服务器快速、及时地定位到应用程序的本地崩溃并对其进行分析,以改进应用程序。
图4示意性示出了根据本公开的一实施例的捕获应用程序崩溃信息的方法的示意图。
在应用程序被开发好上架之后,通常会有各种崩溃发生,这些信息对于分析改进app非常重要,所以需要捕获这些信息。如图4所示,这里以利用breakpad为例,来举例说明如何达到获取native层崩溃信息的目的,可以包括以下步骤:首先,将breakpad源码集成到app应用程序中;第二步,移植breakpad的解析器到android应用程序中;第三步,当app应用程序发生崩溃时,利用breakpad在客户端本地解析崩溃文件,以生成崩溃信息的可读文件;第四步,然后将解析的文件内容上传到服务器。
其中,breakpad是一个跨平台的开源库,可以利用breakpad开源库来采集native的crash日志。breakpad是一套完整的工具集,从crash的捕获到crash的dump,都提供了相对应的工具。
在集成breakpad的时候,相关技术的做法是崩溃信息的dump文件在客户端生成,然后上传到服务器,在服务器再解析一次,总共需要3个步骤才能完成查看崩溃信息的目的。采用本公开实施例提供的方法,直接可以在本地解析好,省略了上传到服务器后再在服务器解析一次的过程,而且服务器执行大量可执行程序去解析文件不能一步到位,需要耗费大量的服务器资源。
下面结合图5和6的实施例进行举例说明。
图5示意性示出了根据本公开的一实施例的捕获应用程序崩溃信息的方法的流程图。
如图5所示,与上述实施例相比,本公开实施例提供的方法还可以进一步包括以下步骤。
在步骤s510中,获取崩溃捕获工具(这里均以breakpad举例说明)的源码文件,其包括客户端(client)文件夹、通用(common)文件夹、解析器(processor)文件夹和崩溃捕获工具(google_breakpad)文件夹。
breakpad是一个跨平台的崩溃转储和分析框架工具集合。client文件夹是breakpad源码中的一个目录,主要作用是接收异常信号,获取崩溃的堆栈信息。common文件夹也是breakpad中的一个目录,是用于转换字符串和内存读写的工具。processor可以用于生成可读的c/c stacktrace(堆栈轨迹)。
在步骤s520中,将所述客户端文件夹、所述通用文件夹、所述解析器文件夹和所述崩溃捕获工具文件夹复制至所述应用程序的java本地接口(jni)目录下,所述解析器文件夹中包括解析器的移植文件。
当需要使用jni的时候,需要创建一个native工程。创建的方式有两种:在工程根目录里手动创建一个目录叫jni,在里面新建一个android.mk,然后创建c,cpp文件,把他们配置到android.mk里;右键工程,选择androidtools->addnativesupport自动生成。
在步骤s530中,在构建配置文件(例如,android.mk)中加入所述java本地接口目录中的文件。
在开发过程中,在android.mk中配置需要编译的文件。android.mk是一个makefile配置文件(构建配置文件)。一个工程中的源文件按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个shell脚本一样,也可以执行操作系统的命令。
下载breakpad源码,把client,common,processor,google_breakpad4个文件夹复制到源码路径下,然后在android.mk中加入breakpad源码文件。本公开实施例与相关技术不同,相关技术只需要在android.mk中加入收集异常信息文件,而本公开实施例需要加入上述4个目录下的文件。
图6示意性示出了根据本公开的一实施例的捕获应用程序崩溃信息的方法的流程图。
如图6所示,与上述实施例相比,本公开实施例提供的方法还可以进一步包括以下步骤。
在步骤s610中,调用所述崩溃捕获工具文件夹中定义的初始化类(minidumpdescriptor,这是一个c 的类,用来初始化运行程序的)进行初始化,编写所述应用程序发生本地崩溃时的回调函数,以用于当检测到所述应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件中。
在app启动的时候初始化breakpad,经过初始化配置后,可以捕获native层的崩溃信息。
第一步,首先根据上述图5的实施例将breakpad源码集成到android应用程序,然后在app初始化的时候进行初始化,设置保存dump文件的路径(预定义dump文件存放的目录),可以调用google_breakpad::minidumpdescriptor的构造函数进行设置。
例如,可以使用如下代码,在app初始化的地方调用进行初始化:
google_breakpad::minidumpdescriptordescriptor(path);
staticgoogle_breakpad::exceptionhandlereh(descriptor,null,dumpcallback,null,true,-1);
至此集成breakpad完成。
第二步,当应用程序发生崩溃的时候,会产生一个dump文件,并且写入到第一步中设置的目录下,这个文件是16进制的不可读文件,是不能查看信息的,在以往的情况下,需要上传到服务器上,由服务器执行一个可执行文件才可以转换成字符串,然后才可以查看。本公开实施例中,改进之后生成的dump文件不用上传服务器,继续执行下一步。
在步骤s620中,利用所述解析器的移植文件将所述解析器的目录复制到所述java本地接口目录下。
之后,移植解析dump的代码至jni目录下,原本这个模块编译之后会生成一个可执行文件,需要在服务器上运行。这部分代码存在于breakpad中,实际上就是processor目录下的文件
在步骤s630中,在所述构建配置文件中加入所述解析器的目录中的文件。
在步骤s640中,在所述解析器的目录下的异常信息存储处理文件(stackwalk_common.cc文件)中查找到打印函数。
在步骤s650中,对所述打印函数进行修改,以用于拦截写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中。
具体操作是把解析dump的这部分代码加到android.mk中进行编译,然后在dump生成文件信息的时候,调用解析器的setupoptions和printminidumpdump来解析dump文件,就可以在客户端生成并且解析出报错的调用栈信息,可以具体到某个函数的名称,这里可以用一个std::vector<std::string>来保存,这是一个预定义全局变量。
在步骤s660中,编写拼接函数,以用于根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件。
把上述步骤中的全局变量通过遍历的方式,全部解析成字符串,然后传递给服务器。
例如,具体的移植步骤可以包括:在app中集成好breakpad之后:
首先,将processor复制到源码目录下,然后在android.mk中加入源码文件。
然后,在processor目录下的stackwalk_common.cc文件中找到printprocessstate、printprocessstatemachinereadable、printmodulesmachinereadable、printmodule、printstackmachinereadable、printstackcontents和printregister这8个打印函数,分别对这些打印函数进行改造,因为breakpad在转换dump文件的时候,都是取自这些printf输出信息,所以在printf函数调用的时候,将字符串格式化保存在预定义全局变量中。
接着,添加一个拼接函数,将这些预定义全局变量拼接起来,得到崩溃的异常信息作为最终输出结果。修改后的打印函数会对崩溃信息的明文字符串进行收集,通过调用编写的拼接函数,来获取到崩溃信息的可读文件。
在示例性实施例中,所述方法还可以包括:去掉所述解析器框架中的单元测试文件(googletest)。这里去掉processor中的googletest代码,大概10多个googletset相关的文件,文件名称带有unittest。
最后,将得到的解析后的字符串上传到服务器,在相关技术中需要上传一整个dump文件,而这里只需要上传一个字符串就可以,可以降低客户端和服务器之间的数据传输量,从而可以加快崩溃信息的上传速度,有利于服务器更快的定位到问题所在位置及原因。
根据本公开实施方式提供的捕获应用程序崩溃信息的方法,通过对breakpad的源码进行修改,并增加函数调用功能,能够实现在客户端直接解析崩溃信息,不需要开发专门用于上传转储文件的模块来上传转储文件到服务器,也不需要在服务器对转储文件再次解析,可以比较方便的就能找到产生崩溃的原因了,也能够及时的分析、及早的发现问题。
以下介绍本公开的装置实施例,可以用于执行本公开上述的捕获应用程序崩溃信息的方法。对于本公开装置实施例中未披露的细节,请参照本公开上述的捕获应用程序崩溃信息的方法的实施例。
图7示意性示出了根据本公开的一个实施例的捕获应用程序崩溃信息的装置的框图。
参照图7所示,根据本公开的一个实施例的捕获应用程序崩溃信息的装置700可以包括:崩溃信息写入单元710、崩溃信息拦截单元720、可读文件生成单元730以及可读文件上传单元740。
具体地,崩溃信息写入单元710可以用于当检测到所述应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件。
崩溃信息拦截单元720可以用于拦截写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中。
可读文件生成单元730可以用于根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件。
可读文件上传单元740可以用于将所述崩溃信息的可读文件上传至服务器,以便于所述服务器根据所述崩溃信息的可读文件定位和分析所述应用程序的本地崩溃。
在示例性实施例中,捕获应用程序崩溃信息的装置700还可以包括:源码文件获取单元,可以用于获取崩溃捕获工具的源码文件,其包括客户端文件夹、通用文件夹、解析器文件夹和崩溃捕获工具文件夹;文件夹复制单元,可以用于将所述客户端文件夹、所述通用文件夹、所述解析器文件夹和所述崩溃捕获工具文件夹复制至所述应用程序的java本地接口目录下,所述解析器文件夹中包括解析器的移植文件;文件加入配置单元,可以用于在构建配置文件中加入所述java本地接口目录中的文件。
在示例性实施例中,捕获应用程序崩溃信息的装置700还可以包括:初始化单元,可以用于调用所述崩溃捕获工具文件夹中定义的初始化类进行初始化,编写所述应用程序发生本地崩溃时的回调函数,以用于当检测到所述应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件中。
在示例性实施例中,捕获应用程序崩溃信息的装置700还可以包括:解析器目录复制单元,可以用于利用所述解析器的移植文件将所述解析器的目录复制到所述java本地接口目录下;解析器文件加入配置单元,可以用于在所述构建配置文件中加入所述解析器的目录中的文件。
在示例性实施例中,捕获应用程序崩溃信息的装置700还可以包括:打印函数查找单元,可以用于在所述解析器的目录下的异常信息存储处理文件中查找到打印函数;打印函数修改单元,可以用于对所述打印函数进行修改,以用于拦截写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中;拼接函数编写单元,可以用于编写拼接函数,以用于根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件。
在示例性实施例中,捕获应用程序崩溃信息的装置700还可以包括:测试文件去掉单元,可以用于去掉所述解析器框架中的单元测试文件。
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多单元的特征和功能可以在一个单元中具体化。反之,上文描述的一个单元的特征和功能可以进一步划分为由多个单元来具体化。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是cd-rom,u盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、触控终端、或者网络设备等)执行根据本公开实施方式的方法。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
1.一种捕获应用程序崩溃信息的方法,其特征在于,包括:
当检测到所述应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件;
拦截写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中;
根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件;
将所述崩溃信息的可读文件上传至服务器,以便于所述服务器根据所述崩溃信息的可读文件定位和分析所述应用程序的本地崩溃。
2.根据权利要求1所述的方法,其特征在于,还包括:
获取崩溃捕获工具的源码文件,其包括客户端文件夹、通用文件夹、解析器文件夹和崩溃捕获工具文件夹;
将所述客户端文件夹、所述通用文件夹、所述解析器文件夹和所述崩溃捕获工具文件夹复制至所述应用程序的java本地接口目录下,所述解析器文件夹中包括解析器的移植文件;
在构建配置文件中加入所述java本地接口目录中的文件。
3.根据权利要求2所述的方法,其特征在于,还包括:
调用所述崩溃捕获工具文件夹中定义的初始化类进行初始化,编写所述应用程序发生本地崩溃时的回调函数,以用于当检测到所述应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件中。
4.根据权利要求2所述的方法,其特征在于,还包括:
利用所述解析器的移植文件将所述解析器的目录复制到所述java本地接口目录下;
在所述构建配置文件中加入所述解析器的目录中的文件。
5.根据权利要求4所述的方法,其特征在于,还包括:
在所述解析器的目录下的异常信息存储处理文件中查找到打印函数;
对所述打印函数进行修改,以用于拦截写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中;
编写拼接函数,以用于根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件。
6.根据权利要求4所述的方法,其特征在于,还包括:
去掉所述解析器框架中的单元测试文件。
7.一种捕获应用程序崩溃信息的装置,其特征在于,包括:
崩溃信息写入单元,用于当检测到所述应用程序发生本地崩溃时,将发生本地崩溃的崩溃信息写入转储文件;
崩溃信息拦截单元,用于拦截写入所述转储文件的崩溃信息,保存所述崩溃信息的字符串到预定义全局变量中;
可读文件生成单元,用于根据所述预定义全局变量中的字符串,生成所述崩溃信息的可读文件;
可读文件上传单元,用于将所述崩溃信息的可读文件上传至服务器,以便于所述服务器根据所述崩溃信息的可读文件定位和分析所述应用程序的本地崩溃。
8.根据权利要求7所述的装置,其特征在于,还包括:
源码文件获取单元,用于获取崩溃捕获工具的源码文件,其包括客户端文件夹、通用文件夹、解析器文件夹和崩溃捕获工具文件夹;
文件夹复制单元,用于将所述客户端文件夹、所述通用文件夹、所述解析器文件夹和所述崩溃捕获工具文件夹复制至所述应用程序的java本地接口目录下,所述解析器文件夹中包括解析器的移植文件;
文件加入配置单元,用于在构建配置文件中加入所述java本地接口目录中的文件。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1至6中任一项所述的捕获应用程序崩溃信息的方法。
10.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如权利要求1至6中任一项所述的捕获应用程序崩溃信息的方法。
技术总结