CN108763060A - Android系统中Native层崩溃溯源方法、装置、存储介质及终端 - Google Patents
Android系统中Native层崩溃溯源方法、装置、存储介质及终端 Download PDFInfo
- Publication number
- CN108763060A CN108763060A CN201810392846.2A CN201810392846A CN108763060A CN 108763060 A CN108763060 A CN 108763060A CN 201810392846 A CN201810392846 A CN 201810392846A CN 108763060 A CN108763060 A CN 108763060A
- Authority
- CN
- China
- Prior art keywords
- layers
- signal event
- java
- application program
- native
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及软件维护领域,具体涉及一种Android系统中Native层崩溃溯源方法、装置、存储介质及终端,所述方法包括:捕获应用程序出现的在Native层崩溃的信号事件,检测所述信号事件是否已被所述应用程序注册;若所述信号事件已被所述应用程序注册,调用应用程序进程预置的该信号事件对应的处理函数,执行所述处理函数:在Native层中调用Java层的函数接口,获取接收到所述信号事件的线程的JNIEnv变量;通过所述JNIEnv变量调用FindClass函数获取各个Java类;反射调用getStackTrace函数,获取所述各个Java类的调用栈信息,得到整个Java层调用栈的全部信息;根据所述整个Java层调用栈的全部信息追溯Native层崩溃产生的原因。本发明解决目前无法很好地追溯Android系统中Native层崩溃的原因的问题。
Description
技术领域
本发明涉及软件维护领域,具体涉及一种Android系统中Native层崩溃溯源方法、装置、存储介质及终端。
背景技术
由于Android设备品牌多、系统版本杂,所以在Android系统中会因为兼容性等问题,造成应用程序的各种崩溃(Crash),而且在这些Crash中,Native层崩溃(Native Crash)一直是Crash里的大头,Native Crash具有上下文不全、出错信息模糊、难以捕捉等特点,比Java Crash更难修复,当应用程序的Crash是发生在Native层的时候,大部分都是很难定位到具体的问题的,因为在很多时候,在这些Crash的信息中,只能看到当前崩溃点的一些有限的信息,很多都是崩溃在系统库中,看不到Java层的相关逻辑或是调用栈等可用信息,所以此类问题的解决,一直都是解决应用程序性能和稳定性中最大的难点。
发明内容
为克服以上技术问题,特别是现有技术无法很好地追溯的Android系统中Native层崩溃的原因问题,特提出以下技术方案:
第一方面,本发明提供了一种Android系统中Native层崩溃溯源方法,包括:
捕获应用程序出现的在Native层崩溃的信号事件,检测所述信号事件是否已被所述应用程序注册;
若所述信号事件已被所述应用程序注册,调用应用程序进程预置的该信号事件对应的处理函数,执行所述处理函数:在Native层中调用Java层的函数接口,获取接收到所述信号事件的线程的JNIEnv变量;通过所述JNIEnv变量调用FindClass函数获取各个Java类;反射调用getStackTrace函数,获取所述各个Java类的调用栈信息,得到整个Java层调用栈的全部信息;
根据所述整个Java层调用栈的全部信息追溯Native层崩溃产生的原因。
进一步的,所述信号事件包括SIGSEGV、SIGABRT、SIGFPE、SIGILL、SIGBUS、SIGSTKFLT,所述应用程序通过调用Sigaction函数对所述信号事件进行注册。
进一步的,所述检测所述信号事件是否已被所述应用程序注册之后,还包括:
若所述信号事件没有被所述应用程序注册,对该信号事件的处理保留系统的默认值或忽略该信号事件。
具体的,所述在Native层中调用Java层的函数接口获取接收到所述信号事件的线程的JNIEnv变量,包括:
在Native层中调用AttachCurrentThread函数获取接收到所述信号事件的当前线程的JNIEnv变量。
进一步的,所述获取整个Java层调用栈的全部信息之后,还包括:
将所述应用程序出现的在Native层崩溃的信号事件及所述整个Java调用栈的全部信息生成dump文件后上报到服务器。
第二方面,本发明还提供一种Android系统中Native层崩溃溯源装置,其特征在于,包括:
捕获模块:用于捕获应用程序出现的在Native层崩溃的信号事件,检测所述信号事件是否已被所述应用程序注册;
获取模块:用于若所述信号事件已被所述应用程序注册,调用应用程序进程预置的该信号事件对应的处理函数,执行所述处理函数:在Native层中调用Java层的函数接口,获取接收到所述信号事件的线程的JNIEnv变量;通过所述JNIEnv变量调用FindClass函数获取各个Java类;反射调用getStackTrace函数,获取所述各个Java类的调用栈信息,得到整个Java层调用栈的全部信息;
分析模块:用于根据所述整个Java层调用栈的全部信息追溯Native层崩溃产生的原因。
进一步的,所述信号事件包括SIGSEGV、SIGABRT、SIGFPE、SIGILL、SIGBUS、SIGSTKFLT,所述应用程序通过调用Sigaction函数对所述信号事件进行注册。
进一步的,所述获取模块执行在Native层中调用Java层的函数接口获取接收到所述信号事件的线程的JNIEnv变量,包括:
在Native层中调用AttachCurrentThread函数获取接收到所述信号事件的当前线程的JNIEnv变量。
第三方面,本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现上述的Android系统中Native层崩溃溯源方法。
第四方面,本发明还提供了一种终端,所述终端包括一个或多个处理器、存储器、一个或多个计算机程序,其中所述一个或多个计算机程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个计算机程序配置用于执行上述的Android系统中Native层崩溃溯源方法。
本发明与现有技术相比,具有以下有益效果:
本发明提出了一种从Android系统的Native层溯源Java层的调用栈的功能,通过捕获应用程序出现的在Native层崩溃的信号事件,调用应用程序进程预置的该信号事件对应的处理函数,使用了Native层和Java层的反射调用相结合获取接收到所述信号事件的线程的Java层中的调用栈信息,找到整个崩溃产生的调用链,进而找到整个代码的相关调用逻辑,从而追溯出Native层崩溃是由应用程序中哪个动作引起的,帮助开发人员快速定位应用程序出现的问题,解决目前应用程序出现Native层崩溃而难以定位、难以修复的问题,从而有利于提高应用程序的性能稳定性。
本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为本发明Android系统中Native层崩溃溯源方法的一实施例流程示意图;
图2为本发明Android系统中Native层崩溃溯源方法的另一实施例流程示意图;
图3为本发明Android系统中Native层崩溃溯源装置的一实施例示意图;
图4为本发明终端的一实施例结构示意图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
本领域技术人员可以理解,这里所使用的服务器、云端、远端网络设备等概念,具有等同效果,其包括但不限于计算机、网络主机、单个网络服务器、多个网络服务器集或多个服务器构成的云。在此,云由基于云计算(Cloud Computing)的大量计算机或网络服务器构成,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。本发明的实施例中,远端网络设备、终端设备与WNS服务器之间可通过任何通信方式实现通信,包括但不限于,基于3GPP、LTE、WIMAX的移动通信、基于TCP/IP、UDP协议的计算机网络通信以及基于蓝牙、红外传输标准的近距无线传输方式。
本领域技术人员应当理解,本发明所称的“应用”、“应用程序”、“应用软件”以及类似表述的概念,是业内技术人员所公知的相同概念,是指由一系列计算机指令及相关数据资源有机构造的适于电子运行的计算机软件。除非特别指定,这种命名本身不受编程语言种类、级别,也不受其赖以运行的操作系统或平台所限制。理所当然地,此类概念也不受任何形式的终端所限制。
在一种实施例中,本发明提供一种Android应用程序Native层崩溃溯源方法,如图1所示,所述方法包括以下步骤:
S100:捕获应用程序出现的在Native层崩溃的信号事件,检测所述信号事件是否已被所述应用程序注册。
Android系统底层内核使用的是Linux内核,Android系统是基于Linux内核实现的操作系统,在所有基于Linux内核实现的系统中,出现崩溃异常均是由软件错误或硬件错误引发,称为中断,比如硬件输入、时钟、除零错误、非法内存地址访问错误等都会出现崩溃异常,产生对应的中断信号;当异常发生时,系统会触发中断处理流程,在不同的处理器上有不同的中断类型和中断处理方式,Linux将在中断处的处理统一为信号事件。由于Android的碎片化造成崩溃异常出现频繁,包括Java层崩溃和Native层崩溃,由于Native层代码只能开发系统动态链接库,若动态链接库发生崩溃,则会发生Native层崩溃,此时就会产生Native层的信号事件。本实施例中,当应用程序出现在Native层崩溃的信号事件时(如无效的内存引用、无效的硬件输入),进入Android系统内核空间,利用CPU捕获当前所述信号事件,然后检测当前的信号事件是否被该应用程序所注册。
S200:若所述信号事件已被所述应用程序注册,调用应用程序进程预置的该信号事件对应的处理函数,执行所述处理函数:在Native层中调用Java层的函数接口,获取接收到所述信号事件的线程的JNIEnv变量;通过所述JNIEnv变量调用FindClass函数获取各个Java类;反射调用getStackTrace函数,获取所述各个Java类的调用栈信息,得到整个Java层调用栈的全部信息。
若所述信号事件已被所述应用程序注册,则应用程序进程可以指定处理函数对信号事件进行处理,即调用应用程序进程预置的该信号事件对应的处理函数,具体的,所述处理函数执行:
在Native层中调用Java层的函数接口获取接收到所述信号事件的线程的JNIEnv变量;一般地,处理函数会收到系统传进来的siginfo和线程context信息,即接收到信号事件对应的线程的栈上下文信息和信号事件类型封装成结构体作为参数传入所述处理函数,进而可以获取到当前崩溃的CPU寄存器中的值和线程环境数据,但是在Android系统中,Java栈和Native栈是二个不同的环境,而且Java层的线程结构和Native中的线程结构也是完全不同的,在Java层中,线程的的ID只是一个计数器而已,所以这二个数据是不能通用的,因此,本实施例中通过在Native层中调用Java层的函数接口获取接收到所述信号事件的线程的JNIEnv变量,再通过JNIEnv变量调用JNI函数,访问Java虚拟机,进而操作Java对象,即通过所述JNIEnv变量调用FindClass函数获取各个Java类,包括Thread、Throwable、StackTraceElement、currentThread、getStackTrace等各个Java类,该些Java类能够囊括大部分Java层的调用函数;进而,再反射调用getStackTrace函数获取所述各个Java类的调用栈信息,从而获取整个Java层调用栈的全部信息。
S300:根据所述整个Java层调用栈的全部信息追溯Native层崩溃产生的原因。
通过所述Java层调用栈的全部信息,就能看到Native层崩溃产生的整个调用链,进而找到整个代码的相关调用逻辑,从而追溯出Native层崩溃是由应用程序中哪个动作引起的,帮助开发人员快速定位应用程序出现的问题。例如通过所述Java调用栈的全部信息知道崩溃产生的CPU相关的上下文,包括当前线程的寄存器信息和崩溃时的pc值(pc指针,pc值表示下一条指令的地址),通过崩溃时的pc值就能知道崩溃时执行的是应用程序的哪条指令,从而追溯了崩溃产生的原因。
本实施例提出了一种从Android系统的Native层溯源Java层的调用栈的功能,通过捕获应用程序出现的在Native层崩溃的信号事件,调用应用程序进程预置的该信号事件对应的处理函数,使用了Native层和Java层的反射调用相结合获取接收到所述信号事件的线程的Java层中的调用栈信息,找到整个崩溃产生的调用链,进而找到整个代码的相关调用逻辑,从而追溯出Native层崩溃是由应用程序中哪个动作引起的,帮助开发人员快速定位应用程序出现的问题,解决目前应用程序出现Native层崩溃而难以定位、难以修复的问题,从而有利于提高应用程序的性能稳定性。
本发明实施例中,所述信号事件包括SIGSEGV、SIGABRT、SIGFPE、SIGILL、SIGBUS、SIGSTKFLT,应用程序通过调用Sigaction函数对所述信号事件进行注册。
本发明实施例中,所述信号事件包括SIGSEGV,表示段地址错误,出现该信号事件的原因如访问不存在的地址空间、数组越界、栈溢出;所述信号事件包括SIGABRT,表示进程发现错误或者进程调用了abort();所述信号事件包括SIGFPE,表示浮点数运算错误,出现该信号事件的原因如除0操作;所述信号事件包括SIGILL,表示非法指令,出现该信号事件的原因如损坏的可执行文件或代码区损坏;所述信号事件包括SIGBUS,表示不存在的物理地址,硬件有误,出现该信号事件的原因如硬件或系统引起的错误;所述信号事件包括SIGSTKFLT,表示数学协处理器的栈异常。
进一步,本发明的一种实施例,所述检测所述信号事件是否已被所述应用程序注册之后,还包括:
若所述信号事件没有被所述应用程序注册,对该信号事件的处理保留系统的默认值或忽略该信号事件。
本实施例中,接收到信号事件的应用程序进程对各种信号事件有不同的处理方法,若所述信号事件已被所述应用程序注册,则按照上述实施例根据信号事件的指定处理函数处理所述信号事件,而若所述信号事件没有被所述应用程序注册,第一种实施方式是对该信号事件的处理保留系统的默认值,这种缺省操作,对大部分的信号事件的缺省操作是使得对应的进程终止;另一种实施方式是忽略该信号事件,对该信号事件不做任何处理,就像未发生过一样。
具体的,本发明的一种实施例,所述在Native层中调用Java层的函数接口获取接收到所述信号事件的线程的JNIEnv变量,包括:
在Native层中调用AttachCurrentThread函数获取接收到所述信号事件的当前线程的JNIEnv变量。
由于处理函数是由Linux的崩溃系统从内核调用过来的,无法直接获取到接收到所述信号事件的当前线程的数据,本实施例中,通过在Native层中调用AttachCurrentThread函数获取接收到所述信号事件的当前线程的JNIEnv变量。
本发明的一种实施例,如图2所示,所述获取整个Java层调用栈的全部信息之后,还包括:
将所述应用程序出现的在Native层崩溃的信号事件及所述整个Java调用栈的全部信息生成dump文件后上报到服务器。
在获取整个Java层调用栈的全部信息之后,除了让应用程序重启之外,还需要将出现的崩溃打生成dump文件上传到服务器,Dump文件是进程的内存镜像,可以把程序的执行状态通过调试器保存到dump文件中,让开发人员能够从该dump文件中定位应用程序出现的问题,进而修复应用程序的BUG。
进一步的,上述Android系统中Native层崩溃溯源方法的所有实施例囊括的技术方案可以作为一个独立的SDK,接入到所有Android应用中,Android应用的开发人员只需要按照本方案开发文档规范接入到应用中,即可快速地实现自动捕获程序中出现的在Native层崩溃的信号事件,并上报到服务器,为开发人员发现问题、解决问题提供数据基础。
如图3所示,在另一种实施例中,本发明提供了一种Android系统中Native层崩溃溯源装置,包括:
捕获模块100:用于捕获应用程序出现的在Native层崩溃的信号事件,检测所述信号事件是否已被所述应用程序注册;
获取模块200:用于若所述信号事件已被所述应用程序注册,调用应用程序进程预置的该信号事件对应的处理函数,执行所述处理函数:在Native层中调用Java层的函数接口,获取接收到所述信号事件的线程的JNIEnv变量;通过所述JNIEnv变量调用FindClass函数获取各个Java类;反射调用getStackTrace函数,获取所述各个Java类的调用栈信息,得到整个Java层调用栈的全部信息;
分析模块300:用于根据所述整个Java层调用栈的全部信息追溯Native层崩溃产生的原因。
本实施例中,当应用程序出现在Native层崩溃的信号事件时(如无效的内存引用、无效的硬件输入),进入Android系统内核空间,捕获模块100利用CPU捕获当前所述信号事件,然后检测当前的信号事件是否被该应用程序所注册。若所述信号事件已被所述应用程序注册,则应用程序进程可以指定处理函数对信号事件进行处理,即获取模块200调用应用程序进程预置的该信号事件对应的处理函数。分析模块300通过所述Java调用栈的全部信息,就能看到Native层崩溃产生的整个调用链,进而找到整个代码的相关调用逻辑,从而追溯出Native层崩溃是由应用程序中哪个动作引起的,帮助开发人员快速定位应用程序出现的问题。
本发明实施例中,所述信号事件包括SIGSEGV、SIGABRT、SIGFPE、SIGILL、SIGBUS、SIGSTKFLT,所述应用程序通过调用Sigaction函数对所述信号事件进行注册。
进一步,本发明的一种实施例,所述装置还包括:
默认处理模块:用于检测所述信号事件是否已被所述应用程序注册之后,若所述信号事件没有被所述应用程序注册,对该信号事件的处理保留系统的默认值或忽略该信号事件。
本发明的一种实施例,所述获取模块200执行在Native层中调用Java层的函数接口获取接收到所述信号事件的线程的JNIEnv变量,包括:
在Native层中调用AttachCurrentThread函数获取接收到所述信号事件的当前线程的JNIEnv变量。
本发明的一种实施例,所示装置还包括:
上报模块:用于在获取整个Java层调用栈的全部信息之后,将所述应用程序出现的在Native层崩溃的信号事件及所述整个Java调用栈的全部信息生成dump文件后上报到服务器。
进一步的,上述Android系统中Native层崩溃溯源装置的所有实施例囊括的技术方案可以作为一个独立的SDK,接入到所有Android应用中,Android应用的开发人员只需要按照本方案开发文档规范接入到应用中,即可快速地实现自动捕获程序中出现的在Native层崩溃的信号事件,并上报到服务器,为开发人员发现问题、解决问题提供数据基础。
在另一种实施例中,本发明提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现上述实施例所述的视频处理方法。其中,所述计算机可读存储介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、CD-ROM、和磁光盘)、ROM(Read-Only Memory,只读存储器)、RAM(Random AcceSS Memory,随即存储器)、EPROM(EraSable Programmable Read-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically EraSable Programmable Read-Only Memory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,存储设备包括由设备(例如,计算机、手机)以能够读的形式存储或传输信息的任何介质,可以是只读存储器,磁盘或光盘等。
本发明实施例提供的一种计算机可读存储介质可实现捕获应用程序出现的在Native层崩溃的信号事件,检测所述信号事件是否已被所述应用程序注册;若所述信号事件已被所述应用程序注册,调用应用程序进程预置的该信号事件对应的处理函数,所述处理函数执行:在Native层中调用Java层的函数接口获取接收到所述信号事件的线程的JNIEnv变量,通过所述JNIEnv变量调用FindClass函数获取各个Java类,反射调用getStackTrace函数获取所述各个Java类的调用栈信息以获取整个Java层调用栈的全部信息;根据所述整个Java调用栈的全部信息追溯Native层崩溃产生的原因。通过提出了一种从Android系统的Native层溯源Java层的调用栈的功能,通过捕获应用程序出现的在Native层崩溃的信号事件,调用应用程序进程预置的该信号事件对应的处理函数,使用了Native层和Java层的反射调用相结合获取接收到所述信号事件的线程的Java层中的调用栈信息,找到整个崩溃产生的调用链,进而找到整个代码的相关调用逻辑,从而追溯出Native层崩溃是由应用程序中哪个动作引起的,帮助开发人员快速定位应用程序出现的问题,解决目前应用程序出现Native层崩溃而难以定位、难以修复的问题,从而有利于提高应用程序的性能稳定性。
本发明实施例提供的计算机可读存储介质可以实现上述Android系统中Native层崩溃溯源方法的实施例,具体功能实现请参见方法实施例中的说明,在此不再赘述。
此外,在又一种实施例中,本发明还提供一种终端,如图4所示,所述终端可以包括一个或者一个以上的处理器401,还包括存储器402、WiFi(wireless fidelity,无线保真)电路403、RF(Radio Frequency,射频)电路404、音频电路405、传感器406、输出设备407、输入设备408、电源409,处理器401是终端的控制中心,利用各种接口和线路连接以上各部分。本领域技术人员可以理解,图4中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
WiFi电路403可为用户提供无线局域网或互联网访问;其可包括天线、WiFi模块等。RF电路404可收发信息,或在通话过程中信号的接收和发送;其可包括天线、至少一个放大器、调谐器、一个或多个振荡器、耦合器、双工器等。音频电路405可将接收到的音频数据转换成电信号,传输到扬声器,也可将传声器收集的声音信号转换为音频数据,发给处理器401处理;其可设置扬声器、传声器、耳机接口等。传感器406可用于感应外界信号,并发给处理器401处理;其可包括运动传感器、光传感器等。输出设备407可用于显示各种信号;其可为采用LCD(Liquid Crystal Display,液晶显示器)、OLED(Organic Light-EmittingDiode,有机发光二极管)等形式来配置显示面板。输入设备404可用于输入数字和字符等信息;其可为物理按键、触控面板等。电源409可为终端各部分供电,通过电源管理系统与处理器409逻辑连接;其可包括一个或一个以上的直流或交流电源、充电系统、电源状态指示器等组件。存储器402可用于存储软件程序以及模块;其可为计算机可读存储介质,具体的为硬盘、闪存等。处理器是终端的控制中心,通过运行或执行存储在存储器402内的软件程序和/或模块,以及调用存储在存储器402的数据,执行终端各种功能、处理终端数据。
作为一个实施例,终端包括:一个或多个处理器401,存储器402,一个或多个计算机程序,其中所述一个或多个计算机程序被存储在存储器402中并被配置为由所述一个或多个处理器401执行,所述一个或多个计算机程序配置用于执行以上实施例所述的Android系统中Native层崩溃溯源方法。图4中所示的一个或多个处理器403能够执行、实现图3中所示的捕获模块100、获取模块200、分析模块300的功能。
本发明实施例提供的一种终端,可实现捕获应用程序出现的在Native层崩溃的信号事件,检测所述信号事件是否已被所述应用程序注册;若所述信号事件已被所述应用程序注册,调用应用程序进程预置的该信号事件对应的处理函数,所述处理函数执行:在Native层中调用Java层的函数接口获取接收到所述信号事件的线程的JNIEnv变量,通过所述JNIEnv变量调用FindClass函数获取各个Java类,反射调用getStackTrace函数获取所述各个Java类的调用栈信息以获取整个Java层调用栈的全部信息;根据所述整个Java调用栈的全部信息追溯Native层崩溃产生的原因。通过提出了一种从Android系统的Native层溯源Java层的调用栈的功能,通过捕获应用程序出现的在Native层崩溃的信号事件,调用应用程序进程预置的该信号事件对应的处理函数,使用了Native层和Java层的反射调用相结合获取接收到所述信号事件的线程的Java层中的调用栈信息,找到整个崩溃产生的调用链,进而找到整个代码的相关调用逻辑,从而追溯出Native层崩溃是由应用程序中哪个动作引起的,帮助开发人员快速定位应用程序出现的问题,解决目前应用程序出现Native层崩溃而难以定位、难以修复的问题,从而有利于提高应用程序的性能稳定性。
本发明实施例提供的终端可以实现上述提供的Android系统中Native层崩溃溯源方法的实施例,具体功能实现请参见方法实施例中的说明,在此不再赘述。
以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1.一种Android系统中Native层崩溃溯源方法,其特征在于,包括:
捕获应用程序出现的在Native层崩溃的信号事件;检测所述信号事件是否已被所述应用程序注册;
若所述信号事件已被所述应用程序注册,调用应用程序进程预置的该信号事件对应的处理函数,执行所述处理函数:在Native层中调用Java层的函数接口,获取接收到所述信号事件的线程的JNIEnv变量;通过所述JNIEnv变量调用FindClass函数获取各个Java类;反射调用getStackTrace函数,获取所述各个Java类的调用栈信息,得到整个Java层调用栈的全部信息;
根据所述整个Java层调用栈的全部信息追溯Native层崩溃产生的原因。
2.根据权利要求1所述的方法,其特征在于,所述信号事件包括SIGSEGV、SIGABRT、SIGFPE、SIGILL、SIGBUS、SIGSTKFLT,所述应用程序通过调用Sigaction函数对所述信号事件进行注册。
3.根据权利要求2所述的方法,其特征在于,所述检测所述信号事件是否已被所述应用程序注册之后,还包括:
若所述信号事件没有被所述应用程序注册,对该信号事件的处理保留系统的默认值或忽略该信号事件。
4.根据权利要求1所述的方法,其特征在于,所述在Native层中调用Java层的函数接口获取接收到所述信号事件的线程的JNIEnv变量,包括:
在Native层中调用AttachCurrentThread函数获取接收到所述信号事件的当前线程的JNIEnv变量。
5.根据权利要求1所述的方法,其特征在于,所述获取整个Java层调用栈的全部信息之后,还包括:
将所述应用程序出现的在Native层崩溃的信号事件及所述整个Java层调用栈的全部信息生成dump文件后上报到服务器。
6.一种Android系统中Native层崩溃溯源装置,其特征在于,包括:
捕获模块:用于捕获应用程序出现的在Native层崩溃的信号事件,检测所述信号事件是否已被所述应用程序注册;
获取模块:用于若所述信号事件已被所述应用程序注册,调用应用程序进程预置的该信号事件对应的处理函数,执行所述处理函数:在Native层中调用Java层的函数接口,获取接收到所述信号事件的线程的JNIEnv变量;通过所述JNIEnv变量调用FindClass函数获取各个Java类;反射调用getStackTrace函数,获取所述各个Java类的调用栈信息,得到整个Java层调用栈的全部信息;
分析模块:用于根据所述整个Java层调用栈的全部信息追溯Native层崩溃产生的原因。
7.根据权利要求6所述的装置,其特征在于,所述信号事件包括SIGSEGV、SIGABRT、SIGFPE、SIGILL、SIGBUS、SIGSTKFLT,所述应用程序通过调用Sigaction函数对所述信号事件进行注册。
8.根据权利要求6所述的装置,其特征在于,所述获取模块执行在Native层中调用Java层的函数接口获取接收到所述信号事件的线程的JNIEnv变量,包括:
在Native层中调用AttachCurrentThread函数获取接收到所述信号事件的当前线程的JNIEnv变量。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现权利要求1至5任一项所述的Android系统中Native层崩溃溯源方法。
10.一种终端,其特征在于,包括:
一个或多个处理器;
存储器;
一个或多个计算机程序,其中所述一个或多个计算机程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个计算机程序配置用于执行根据权利要求1至5任一项所述的Android系统中Native层崩溃溯源方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810392846.2A CN108763060A (zh) | 2018-04-27 | 2018-04-27 | Android系统中Native层崩溃溯源方法、装置、存储介质及终端 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810392846.2A CN108763060A (zh) | 2018-04-27 | 2018-04-27 | Android系统中Native层崩溃溯源方法、装置、存储介质及终端 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108763060A true CN108763060A (zh) | 2018-11-06 |
Family
ID=64012408
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810392846.2A Pending CN108763060A (zh) | 2018-04-27 | 2018-04-27 | Android系统中Native层崩溃溯源方法、装置、存储介质及终端 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108763060A (zh) |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110109770A (zh) * | 2019-05-06 | 2019-08-09 | Oppo广东移动通信有限公司 | 调试方法、装置、电子设备及介质 |
CN110147294A (zh) * | 2019-05-23 | 2019-08-20 | Oppo广东移动通信有限公司 | 调试信息的获取方法、装置、终端及计算机可读存储介质 |
CN110413432A (zh) * | 2019-07-02 | 2019-11-05 | Oppo广东移动通信有限公司 | 一种信息处理方法、电子设备及存储介质 |
CN110489165A (zh) * | 2019-08-02 | 2019-11-22 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN110502440A (zh) * | 2019-08-09 | 2019-11-26 | 北京达佳互联信息技术有限公司 | 调试定位信息的获取方法、装置、电子设备及存储介质 |
CN110727581A (zh) * | 2019-09-06 | 2020-01-24 | 网宿科技股份有限公司 | 崩溃定位方法与电子设备 |
CN110727566A (zh) * | 2019-09-05 | 2020-01-24 | 北京字节跳动网络技术有限公司 | 一种获取进程崩溃信息的方法、装置、介质和电子设备 |
CN110764941A (zh) * | 2019-09-05 | 2020-02-07 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN110865898A (zh) * | 2019-10-12 | 2020-03-06 | 北京字节跳动网络技术有限公司 | 崩溃调用栈聚合的方法、装置、介质和设备 |
CN110908860A (zh) * | 2019-10-28 | 2020-03-24 | 北京字节跳动网络技术有限公司 | 一种Java线程的获取方法、装置、介质和电子设备 |
CN110928779A (zh) * | 2019-11-19 | 2020-03-27 | 北京字节跳动网络技术有限公司 | 文件处理方法、应用程序运行故障定位方法和设备 |
CN111414270A (zh) * | 2020-03-24 | 2020-07-14 | 北京字节跳动网络技术有限公司 | 一种异常处理方法及装置 |
CN111966427A (zh) * | 2020-08-17 | 2020-11-20 | 四川长虹电器股份有限公司 | 一种Android native调用Java API的实现方法 |
CN114595244A (zh) * | 2022-03-11 | 2022-06-07 | 北京字节跳动网络技术有限公司 | 崩溃数据的聚合方法、装置、电子设备及存储介质 |
WO2022206253A1 (zh) * | 2021-03-29 | 2022-10-06 | 北京字节跳动网络技术有限公司 | 一种异常处理方法、装置、设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9009671B2 (en) * | 2012-12-11 | 2015-04-14 | International Business Machines Corporation | Crash notification between debuggers |
CN104778075A (zh) * | 2015-04-03 | 2015-07-15 | 北京奇虎科技有限公司 | Android系统中native层调用Java层API的方法和装置 |
CN106649114A (zh) * | 2016-12-23 | 2017-05-10 | 北京奇虎科技有限公司 | 对应用程序崩溃进行定位的方法和装置 |
CN107704356A (zh) * | 2017-06-12 | 2018-02-16 | 平安科技(深圳)有限公司 | 异常堆栈信息获取方法、装置及计算机可读存储介质 |
-
2018
- 2018-04-27 CN CN201810392846.2A patent/CN108763060A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9009671B2 (en) * | 2012-12-11 | 2015-04-14 | International Business Machines Corporation | Crash notification between debuggers |
CN104778075A (zh) * | 2015-04-03 | 2015-07-15 | 北京奇虎科技有限公司 | Android系统中native层调用Java层API的方法和装置 |
CN106649114A (zh) * | 2016-12-23 | 2017-05-10 | 北京奇虎科技有限公司 | 对应用程序崩溃进行定位的方法和装置 |
CN107704356A (zh) * | 2017-06-12 | 2018-02-16 | 平安科技(深圳)有限公司 | 异常堆栈信息获取方法、装置及计算机可读存储介质 |
Cited By (27)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110109770A (zh) * | 2019-05-06 | 2019-08-09 | Oppo广东移动通信有限公司 | 调试方法、装置、电子设备及介质 |
CN110147294A (zh) * | 2019-05-23 | 2019-08-20 | Oppo广东移动通信有限公司 | 调试信息的获取方法、装置、终端及计算机可读存储介质 |
CN110147294B (zh) * | 2019-05-23 | 2023-10-03 | Oppo广东移动通信有限公司 | 调试信息的获取方法、装置、终端及计算机可读存储介质 |
CN110413432A (zh) * | 2019-07-02 | 2019-11-05 | Oppo广东移动通信有限公司 | 一种信息处理方法、电子设备及存储介质 |
CN110413432B (zh) * | 2019-07-02 | 2023-09-01 | Oppo广东移动通信有限公司 | 一种信息处理方法、电子设备及存储介质 |
CN110489165A (zh) * | 2019-08-02 | 2019-11-22 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN110489165B (zh) * | 2019-08-02 | 2021-10-15 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN110502440A (zh) * | 2019-08-09 | 2019-11-26 | 北京达佳互联信息技术有限公司 | 调试定位信息的获取方法、装置、电子设备及存储介质 |
CN110727566A (zh) * | 2019-09-05 | 2020-01-24 | 北京字节跳动网络技术有限公司 | 一种获取进程崩溃信息的方法、装置、介质和电子设备 |
CN110764941B (zh) * | 2019-09-05 | 2023-04-18 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN110764941A (zh) * | 2019-09-05 | 2020-02-07 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN110727566B (zh) * | 2019-09-05 | 2023-08-11 | 北京字节跳动网络技术有限公司 | 一种获取进程崩溃信息的方法、装置、介质和电子设备 |
CN110727581B (zh) * | 2019-09-06 | 2024-04-05 | 网宿科技股份有限公司 | 崩溃定位方法与电子设备 |
CN110727581A (zh) * | 2019-09-06 | 2020-01-24 | 网宿科技股份有限公司 | 崩溃定位方法与电子设备 |
CN110865898A (zh) * | 2019-10-12 | 2020-03-06 | 北京字节跳动网络技术有限公司 | 崩溃调用栈聚合的方法、装置、介质和设备 |
CN110865898B (zh) * | 2019-10-12 | 2023-09-05 | 北京字节跳动网络技术有限公司 | 崩溃调用栈聚合的方法、装置、介质和设备 |
CN110908860B (zh) * | 2019-10-28 | 2023-06-09 | 北京字节跳动网络技术有限公司 | 一种Java线程的获取方法、装置、介质和电子设备 |
CN110908860A (zh) * | 2019-10-28 | 2020-03-24 | 北京字节跳动网络技术有限公司 | 一种Java线程的获取方法、装置、介质和电子设备 |
CN110928779B (zh) * | 2019-11-19 | 2023-04-25 | 抖音视界有限公司 | 文件处理方法、应用程序运行故障定位方法和设备 |
CN110928779A (zh) * | 2019-11-19 | 2020-03-27 | 北京字节跳动网络技术有限公司 | 文件处理方法、应用程序运行故障定位方法和设备 |
CN111414270B (zh) * | 2020-03-24 | 2023-05-09 | 北京字节跳动网络技术有限公司 | 一种异常处理方法及装置 |
CN111414270A (zh) * | 2020-03-24 | 2020-07-14 | 北京字节跳动网络技术有限公司 | 一种异常处理方法及装置 |
CN111966427B (zh) * | 2020-08-17 | 2022-06-21 | 四川长虹电器股份有限公司 | 一种Android native调用Java API的实现方法 |
CN111966427A (zh) * | 2020-08-17 | 2020-11-20 | 四川长虹电器股份有限公司 | 一种Android native调用Java API的实现方法 |
WO2022206253A1 (zh) * | 2021-03-29 | 2022-10-06 | 北京字节跳动网络技术有限公司 | 一种异常处理方法、装置、设备及存储介质 |
CN114595244A (zh) * | 2022-03-11 | 2022-06-07 | 北京字节跳动网络技术有限公司 | 崩溃数据的聚合方法、装置、电子设备及存储介质 |
CN114595244B (zh) * | 2022-03-11 | 2023-10-17 | 抖音视界有限公司 | 崩溃数据的聚合方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108763060A (zh) | Android系统中Native层崩溃溯源方法、装置、存储介质及终端 | |
US7937624B2 (en) | Method for handling a detected error in a script-based application | |
CN108830720B (zh) | 智能合约运行方法、装置、系统和计算机可读存储介质 | |
CN108182131B (zh) | 监控应用运行状态的方法、装置、存储介质及电子设备 | |
US9940187B2 (en) | Nexus determination in a computing device | |
US10176327B2 (en) | Method and device for preventing application in an operating system from being uninstalled | |
CN106502703B (zh) | 一种函数调用方法和装置 | |
CN111475164B (zh) | 组件依赖关系检测方法、装置以及电子设备 | |
CN107203465A (zh) | 系统接口测试方法及装置 | |
CN105094910A (zh) | 一种驱动函数用户态调试系统和方法 | |
US8914815B2 (en) | Automated framework for tracking and maintaining kernel symbol list types | |
CN107016262A (zh) | 应用程序权限管理方法及客户端 | |
WO2021057411A1 (zh) | 一种组件加载方法、装置及系统 | |
US10909025B2 (en) | System and method for automating functional testing | |
CN108874381B (zh) | 一种输出页面视图控制器的方法、装置及电子设备 | |
CN111897726B (zh) | 异常定位方法、装置、存储介质及移动终端 | |
CN111385661A (zh) | 语音控制全屏播放的方法及终端 | |
EP3872630A2 (en) | Request processing method and apparatus, electronic device, and computer storage medium | |
CN112148596B (zh) | 生成深度学习框架的报错内容的方法、装置 | |
CN112711602B (zh) | 一种存储过程的运行方法、装置,数据库系统及存储介质 | |
CN109947420B (zh) | 一种代码编辑器的快捷键机制实现方法及电子设备 | |
CN112199270B (zh) | 一种程序测试方法、装置、设备及介质 | |
CN112612474A (zh) | 产品移植方法、装置、存储介质和电子设备 | |
CN110968566A (zh) | 基于迁移工具的国产化应用系统迁移方法 | |
CN113051122A (zh) | 性能数据获取方法、装置、电子设备和介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |