CN105446806B - 一种应用程序无响应的处理方法及装置 - Google Patents

一种应用程序无响应的处理方法及装置 Download PDF

Info

Publication number
CN105446806B
CN105446806B CN201410509724.9A CN201410509724A CN105446806B CN 105446806 B CN105446806 B CN 105446806B CN 201410509724 A CN201410509724 A CN 201410509724A CN 105446806 B CN105446806 B CN 105446806B
Authority
CN
China
Prior art keywords
thread
signal
signal catcher
current process
application program
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.)
Active
Application number
CN201410509724.9A
Other languages
English (en)
Other versions
CN105446806A (zh
Inventor
梁捷
林作健
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Alibaba China Co Ltd
Original Assignee
Guangzhou Dongjing Computer Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Guangzhou Dongjing Computer Technology Co Ltd filed Critical Guangzhou Dongjing Computer Technology Co Ltd
Priority to CN201410509724.9A priority Critical patent/CN105446806B/zh
Publication of CN105446806A publication Critical patent/CN105446806A/zh
Application granted granted Critical
Publication of CN105446806B publication Critical patent/CN105446806B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明实施例公开了一种应用程序无响应的处理方法及装置,通过建立一个新的进程,使其跟踪应用程序所在的当前进程的signal catcher线程,并在新进程中修改signal catcher线程的内存代码,以使在出现ANR时,signal catcher线程能够跳转至应用程序的开发人员预先编写的处理函数,由处理函数对ANR进行处理,从而使应用程序有机会中断耗时的线程,停止I/O操作,以及记录ANR的详细信息以对应用程序做出改进。

Description

一种应用程序无响应的处理方法及装置
技术领域
本发明涉及计算机技术领域,特别是涉及一种应用程序无响应的处理方法及装置。
背景技术
随着智能终端的广泛普及,安装在终端上的应用程序所实现的功能越来越完善,相应的,这些应用程序本身的结构也越来越复杂,因此运行起来也更加耗费系统资源。以安卓(Android)操作系统系统为例,经常会出现应用程序无响应(Application NotResponding,简称ANR)的情况。由于Android应用程序通常是运行在一个单独的线程例如main线程里,如果应用程序所执行的操作占用了主线程的太多资源,主线程就没有能力再处理用户的I/O操作或接收Intent广播,应用程序经过预定的一段时间后仍未响应,系统就会默认该应用程序已经挂起,这时终端通常就会显示一个ANR对话框提供给用户,由用户选择结束该应用程序或继续等待系统响应。
现有技术中,系统会在ANR发生时向引起ANR的应用程序所在进程的signalcatcher线程发送一个POSIX(Portable Operating System Interface of Unix)标准信号,用于唤醒signal catcher线程,该线程主要用于处理ANR事件,并打印ANR日志,以供用户后续查阅ANR发生时系统的相关信息。然而,这一系列操作通常是由系统在后台执行,对于应用程序的开发者来说,并不能获知ANR的发生,更没有权限读取ANR日志,因此,就不能对ANR事件做出处理,例如中断耗时的线程,停止I/O操作,记录ANR的详细信息以对应用程序做出改进等。因此,现有的处理ANR的方法只能依赖用户处理,稳定性差,影响用户体验。
发明内容
本发明实施例中提供了一种应用程序无响应ANR的处理方法及装置,以解决现有技术处理ANR的方法只能依赖用户处理,稳定性差,影响用户体验的问题。
为了解决上述技术问题,本发明实施例公开了如下技术方案:
一方面,提供一种应用程序无响应ANR的处理方法,所述方法包括:
设置应用程序所在的当前进程的可跟踪属性,以使所述当前进程能够被非root权限的进程跟踪;
建立一个新进程,使所述新进程跟踪所述当前进程的signal catcher线程;
在所述新进程中,修改所述当前进程的signal catcher线程的内存代码,以使所述应用程序出现ANR时,所述应用程序所在的当前进程的signal catcher线程在执行过程中跳转至预设的处理函数,由所述处理函数对ANR进行处理。
可选的,修改所述当前进程的signal catcher线程的内存代码可包括如下步骤:
保存目标地址,所述目标地址为signal catcher线程的pc寄存器的值索引的地址;
将所述目标地址开始的第一地址长度范围内的指令复制到位于所述当前进程内存中的模板函数的第一指定位置;
将所述处理函数的地址写入到所述模板函数的第二指定位置;将所述模板函数的返回地址指向所述目标地址加上所述第一地址长度的地址;
在所述目标地址的位置写入跳转代码,以使出现ANR时,所述signal catcher线程的代码执行至所述目标地址时跳转至所述模板函数。
可选的,使所述新进程跟踪所述当前进程包括:查找所述当前进程的signalcatcher线程ID;根据所述signal catcher线程ID跟踪所述当前进程的signal catcher线程。
可选的,所述方法还可以包括,判断所述signal catcher线程是否处于非唤醒状态;当所述signal catcher线程处于非唤醒状态时,执行所述修改所述当前进程的signalcatcher线程的内存代码的步骤。
优选的,判断所述signal catcher线程是否处于非唤醒状态之前,还可以包括:等待所述signal catcher线程被暂停。
另一方面,提供一种应用程序无响应的处理装置,所述装置包括:
设置单元,用于设置应用程序所在的当前进程的可跟踪属性,以使所述当前进程能够被非root权限的进程跟踪;
跟踪单元,用于建立一个新进程,使所述新进程跟踪所述当前进程的signalcatcher线程;
修改单元,用于在所述新进程中,修改所述当前进程的signal catcher线程的内存代码,以使所述应用程序出现ANR时,所述应用程序所在的当前进程的signal catcher线程在执行过程中跳转至预设的处理函数,由所述处理函数对ANR进行处理。
可选的,所述修改单元包括:
保存子单元,用于保存目标地址,所述目标地址为signal catcher线程的pc寄存器的值索引的地址;
复制子单元,用于将所述目标地址开始的第一地址长度范围内的指令复制到位于所述当前进程内存中的模板函数的第一指定位置;
第一写入子单元,用于将处理函数的地址写入到所述模板函数的第二指定位置;
返回地址子单元,用于将所述模板函数的返回地址指向所述目标地址加上所述第一地址长度的地址;
第二写入子单元,用于在所述目标地址的位置写入跳转代码,以使出现ANR时,所述signal catcher线程的代码执行至所述目标地址时跳转至所述模板函数。
可选的,所述跟踪单元包括:查找子单元,用于查找所述当前进程的signalcatcher线程ID;跟踪子单元,用于根据所述查找子单元查找的所述signal catcher线程ID跟踪所述当前进程的signal catcher线程。
可选的,所述装置还包括:判断单元,用于判断所述signal catcher线程是否处于非唤醒状态,如果所述signal catcher线程处于非唤醒状态时,执行所述修改所述当前进程的signal catcher线程的内存代码的步骤。
可选的,所述装置还包括:等待单元,用于在所述判断单元判断所述signalcatcher线程是否处于非唤醒状态之前,等待所述signal catcher线程被暂停。
由以上技术方案可知,本发明实施例提供的一种应用程序无响应ANR的处理方法及装置,通过建立一个新的进程,使其跟踪应用程序所在的当前进程的signal catcher进程,并在该新进程中修改signal catcher线程的内存代码,以使在出现ANR时,signalcatcher线程能够跳转至应用程序的开发人员预先编写的处理函数,由所述处理函数对ANR进行处理,从而使应用程序有机会中断耗时的线程,停止I/O操作,以及记录ANR的详细信息以对应用程序做出改进。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种应用程序无响应的处理方法的流程示意图;
图2为本发明另一个实施例提供的一种应用程序无响应的处理方法的流程示意图;
图3为对signal catcher线程的内存代码进行修改的具体流程图;
图4为本发明实施例提供的一种应用程序无响应的处理装置的流程示意图;
图5为修改单元的结构示意图;
图6为本发明另一个实施例提供的一种应用程序无响应的处理装置的流程示意图。
具体实施方式
首先对本发明应用程序无响应的处理方法的第一个实施例进行说明,参见图1,本实施例包括如下步骤:
步骤101:设置应用程序所在的当前进程的可跟踪属性,以使所述当前进程能够被非root权限的进程跟踪;
本申请以ARM架构为例进行描述,其他架构只需要修改为对应的指令即可。
首先设置当前进程的dumpable flag,将其值设置为true,使得应用程序的当前进程能够被非root权限的进程跟踪,以便为步骤102中跟踪signal catcher线程及步骤103中修改signal catcher线程的内存代码做好准备。
signal catcher线程是用来捕获linux信号和做一些后续处理的。其源代码在dalvik/vm/SignalCatcher.*部分。在ANR发生时,signal catcher线程会收到一个其所在进程退出信号SIGQUIT,并将当前进程的所有线程中的函数堆栈信息输出到trace.txt文件中,即打印ANR日志。
root权限为根用户权限,也是系统中权限最高的用户权限。将当前进程的dumpable flag的值设置为true后,可以使非root权限的进程(即步骤102中新建的进程)跟踪并修改当前应用程序的内存代码。这里“跟踪”进程使用ptrace attach命令,相应的ARM代码为:
prctl(PR_SET_DUMPABLE,1,0,0,0);
步骤102:建立一个新进程,使所述新进程跟踪所述当前进程的signal catcher线程;
可选择使用fork或者clone命令建立一个新进程,用ptrace attach跟踪signalcatcher线程,使该新进程成为signal catcher的子进程,从而可以对父进程的signalcatcher进行访问及修改其内存代码。即本实施例中,当前进程为父进程,新建的进程为当前进程的子进程。
这里需要预先查找当前进程的signal catcher的线程ID,并使用该线程ID来跟踪signal catcher线程。
查找signal catcher线程ID的方法为:
遍历/proc/self/task目录,里面的子目录的名字为数字,这些数字就是当前进程内所有线程的ID。对于每一个线程的ID,做如下操作:
打开文件/proc/当前线程ID/comm。
读取该文件的内容,比较是否为“signal catcher”,如果是,则当前线程ID即为signal catcher的线程ID。
在跟踪signal catcher线程后,还需要使用wait命令等待当前进程的signalcatcher线程被暂停。
当前进程的signal catcher线程在新建进程调用ptrace发送ptrace attach请求的时候被暂停。ptrace attach请求是在Linux内核里面发送SIGSTOP信号给被attach的线程。必须暂停该线程才能调用其他ptrace请求。
步骤103:在所述新进程中,修改所述当前进程的signal catcher线程的内存代码,以使所述应用程序出现ANR时,signal catcher线程在执行过程中跳转至预设的处理函数,由所述处理函数对ANR进行处理。
只有当signal catcher线程处于非唤醒状态时,才可以修改其代码,因此,需要预先判断signal catcher线程的状态。可使用ptrace PTRACE_GETREGS命令,获得signalcatcher线程的寄存器信息。即并比较其中的r7寄存器的值是否为__NR_rt_sigtimedwait,如果是,则说明signal catcher线程正处于非唤醒状态,也可以称为正在处于等待系统发送信号的状态。此时才可以修改所述当前进程的signal catcher线程的内存代码。
处理函数由应用程序的开发人员预先编写,从应用程序的角度来处理ANR事件,如结束耗时及耗资源的进程、停止IO操作等,还可以选择将ANR日志打印到开发人员有权限获取的目录中,以使开发人员记录ANR发生时系统的信息,在后续根据该信息对应用程序做出适当的优化。
修改signal catcher线程的内存代码时,所要修改的目标地址为signal catcher线程的pc寄存器的值索引的内存地址。需要在该目标地址处插入跳转代码,该跳转代码的作用是,使signal catcher线程执行时能跳转到预先编写的处理函数。在处理函数中,还需要指定该处理函数的返回地址,使其返回地址指向signal catcher线程的原有代码,以使在执行完处理函数后,返回signal catcher线程的原有代码的地址,使signal catcher线程继续执行其自身原有的代码。
这里需要注意的是,系统依然可以利用signal catcher线程的原有代码来处理ANR事件及打印ANR日志,处理函数并不改变signal catcher线程原有的功能。
由以上技术方案可知,本实施例提供的应用程序无响应ANR的处理方法,通过建立一个新的进程,使其跟踪应用程序所在的当前进程的signal catcher线程,并在新进程中修改signal catcher线程的内存代码,以使在出现ANR时,signal catcher线程能够跳转至预先编写的处理函数,由处理函数对ANR进行处理,从而使应用程序有机会中断耗时的线程,停止I/O操作,以及记录ANR的详细信息以对应用程序做出改进。
参见图2,为本发明应用程序无响应ANR的处理方法提供的另一个实施例的流程图,该实施例包括如下步骤:
步骤201:设置应用程序所在的当前进程的可跟踪属性,以使所述当前进程能够被非root权限的进程跟踪;
相应的ARM代码为:
prctl(PR_SET_DUMPABLE,1,0,0,0);
步骤202:查找应用程序所在的当前进程的signal catcher线程ID;
查找signal catcher线程ID的方法为:
遍历/proc/self/task目录,里面的子目录的名字为数字,这些数字是当前进程内所有线程的ID。对于每一个线程的ID,做如下操作:
打开文件/proc/当前线程ID/comm。
读取该文件的内容,比较是否为“signal catcher”,如果是,则当前线程ID即为signal catcher的线程ID。
步骤203:使用wait命令等待signal catcher线程被暂停。
步骤204:判断所述signal catcher线程是否处于非唤醒状态,如果是,执行步骤205,否则结束流程。
查看signal catcher线程的r7寄存器的值是否为_NR_rt_sigtimedwait,如果是,则说明signal catcher线程正处于非唤醒状态,也可以称为正在处于等待系统发送信号的状态。
步骤205:在所述新进程中,修改所述当前进程的signal catcher线程的内存代码,以使所述应用程序出现ANR时,signal catcher线程在执行过程中跳转至预设的处理函数,由所述处理函数对ANR进行处理。
参见图3,为对signal catcher线程的内存代码进行修改的具体流程图。
在本实施例中,可以借助模板函数来实现对signal catcher线程内存代码的修改。模板函数是一类通用函数,在模板函数中,有一些参数或语句代码是不具体指定的,比如某些参数类型可用虚拟的类型来代替,某些特定的代码可用占位符来代替。当调用模板函数时,根据当前功能需求,将不确定的参数和代码部分填充为具体的内容,使其变成一个具体的功能函数来正常执行。
具体到本发明中使用的模板函数,其位于signal catcher线程的内存中,其作用一方面是执行signal catcher线程中被跳转代码覆写的原代码,另一方面是执行预先编写的处理函数的代码。
如图3所示,步骤205可以具体包括如下的子步骤:
步骤2051:保存目标地址,所述目标地址为signal catcher线程的pc寄存器的值索引的内存地址;
步骤2052:将所述目标地址开始的第一地址长度范围内的指令复制到位于所述当前进程内存中的模板函数的第一指定位置;
将目标地址开始的3条ARM指令的代码,即12个字节的数据复制到模板函数中的第一指定位置,以使模板函数在执行到该第一指定位置时能执行这3条被覆写的ARM代码。空出来的这3条指令的位置将被用于写入跳转代码。
步骤2053:将处理函数的地址写入到所述模板函数的第二指定位置;
处理函数由开发人员预先编写,从应用程序的角度来处理ANR事件,如结束耗时及耗资源的进程、停止IO操作等,还可以选择将ANR日志打印到开发人员有权限获取的目录中,以使开发人员记录ANR发生时系统的信息,在后续根据该信息对应用程序做出适当的优化。将处理函数的地址写入到模板函数的第二指定位置,以使模板函数在执行到该指定位置时能执行处理函数的代码。
步骤2054:将所述模板函数的返回地址指向所述目标地址加上所述第一地址长度的地址;
将模板函数的返回地址指向目标地址+12字节的位置,以使模板函数在执行完成后,能继续返回signal catcher线程的原有代码处继续执行signal catcher线程的其他代码。
步骤2051至2054的ARM架构的模板函数代码如下:
push{r0-fp,lr}
ldr ip,.Ltarget_method
blx ip
pop{r0-fp,lr}
#下面是占位符,用于代替被覆写为目标地址的3条ARM指令。
mov r0,r0
mov r0,r0
mov r0,r0
ldr ip,.Lreturn_addr
bx ip
.Ltarget_method:#被修改为处理函数的位置。
.word 0
.Lreturn_addr:#被修改为返回signal catcher线程原有代码的位置。
.word 0
步骤2055:在所述目标地址的位置写入跳转代码,以使出现ANR时,所述signalcatcher线程的代码执行至所述目标地址时跳转至所述模板函数。
对应的跳转代码如下:
ldr ip,[pc]
bx ip
<填入模板函数的地址>
由以上技术方案可知,本实施例提供的应用程序无响应ANR的处理方法,通过建立一个新的进程,使其跟踪应用程序所在的当前进程的signal catcher线程,并在新进程中修改signal catcher线程的内存代码,以使在出现ANR时,signal catcher线程能够跳转至应用程序的开发人员预先编写的处理函数,由处理函数对ANR进行处理,从而使应用程序有机会中断耗时的线程,停止I/O操作,以及记录ANR的详细信息以对应用程序做出改进。
与本发明应用程序无响应ANR的处理方法的实施例相对应,本说明书还提供了程序无响应ANR的处理装置的实施例。
为了描述的方便,描述本申请的装置时以功能分为各种单元分别描述。当然,在实施本发明时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
参见图4,为本发明实施例提供的一种应用程序无响应的处理装置的流程示意图,所述装置包括:设置单元401、跟踪单元402、修改单元403。
所述设置单元401,用于设置应用程序所在的当前进程的可跟踪属性,以使所述当前进程能够被非root权限的进程跟踪。
相应的ARM代码为:
prctl(PR_SET_DUMPABLE,1,0,0,0);
所述跟踪单元402,用于建立一个新进程,使所述新进程跟踪所述当前进程的signal catcher线程。
详细的建立及跟踪过程见上述应用程序无响应ANR的处理方法的第一和第二实施例的对应部分,在本实施例中不再赘述。
所述修改单元403,用于在所述跟踪单元402建立的所述新进程中,修改所述当前进程的signal catcher线程的内存代码,以使所述应用程序出现ANR时,所述signalcatcher线程在执行过程中跳转至预设的处理函数,由所述处理函数对ANR进行处理。
参见图5,可选的,所述修改单元403包括:
保存子单元4031,用于保存目标地址,所述目标地址为signal catcher线程的pc寄存器的值索引的地址;
复制子单元4032,用于将所述目标地址开始的第一地址长度范围内的指令复制到位于所述当前进程内存中的模板函数的第一指定位置;
第一写入子单元4033,用于将处理函数的地址写入到所述模板函数的第二指定位置;
返回地址子单元4034,用于将所述模板函数的返回地址指向所述目标地址加上所述第一地址长度的地址;
第二写入子单元4035,用于在所述目标地址的位置写入跳转代码,以使出现ANR时,所述signal catcher线程的代码执行至所述目标地址时跳转至所述模板函数。
可选的,所述跟踪单元402包括:
查找子单元,用于查找所述当前进程的signal catcher线程ID。
查找signal catcher线程ID的方法见上述程序无响应ANR的处理方法的第一和第二实施例,本实施例中不再赘述。
跟踪子单元,用于根据所述查找子单元查找的所述signal catcher线程ID跟踪所述当前进程的signal catcher线程。
图6为本发明另一个实施例提供的一种应用程序无响应的处理装置的流程示意图。
见图6所示,优选的,所述应用程序无响应的处理装置还包括:
判断单元404,用于判断所述signal catcher线程是否处于非唤醒状态,如果所述signal catcher线程处于非唤醒状态时,执行所述修改所述当前进程的signal catcher线程的内存代码的步骤。
只有当signal catcher线程处于非唤醒状态时,才可以修改其内存代码,因此,判断单元404需要预先判断signal catcher线程的状态。可使用ptrace PTRACE_GETREGS命令,获得signal catcher线程的寄存器信息,并比较其中的r7寄存器的值是否为__NR_rt_sigtimedwait,如果是,则说明signal catcher线程正处于非唤醒状态,也可以称为正在处于等待系统发送信号的状态。
见图6所示,优选的,所述应用程序无响应的处理装置还包括:
等待单元405,用于在所述判断单元404判断所述signal catcher线程是否处于非唤醒状态之前,等待所述signal catcher线程被暂停。
由以上技术方案可知,本实施例提供的应用程序无响应ANR的处理装置,通过建立一个新的进程,使其跟踪系统的signal catcher线程,并在新进程中修改signal catcher线程的内存代码,以使在出现ANR时,signal catcher线程能够跳转至应用程序的开发人员预先编写的处理函数,由处理函数对ANR进行处理,从而使应用程序有机会中断耗时的线程,停止I/O操作,以及记录ANR的详细信息以对应用程序做出改进。
本发明可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本发明,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
以上所述仅是本发明的具体实施方式,使本领域技术人员能够理解或实现本发明。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

Claims (8)

1.一种应用程序无响应ANR的处理方法,其特征在于,所述方法包括:
设置应用程序所在的当前进程的可跟踪属性,以使所述当前进程能够被非root权限的进程跟踪;
建立一个新进程,使所述新进程跟踪所述当前进程的signal catcher线程,其中,所述新进程是当前进程的子进程;
在所述新进程中,修改所述当前进程的signal catcher线程的内存代码,以使所述应用程序出现ANR时,所述应用程序所在的当前进程的signal catcher线程在执行过程中跳转至预设的处理函数,由所述处理函数对ANR进行处理,
其中,修改所述当前进程的signal catcher线程的内存代码包括如下步骤:
保存目标地址,所述目标地址为signal catcher线程的pc寄存器的值索引的地址;
将从所述目标地址开始的第一地址长度范围内的指令复制到位于所述当前进程内存中的模板函数的第一指定位置;
将所述处理函数的地址写入到所述模板函数的第二指定位置;
将所述模板函数的返回地址指向所述目标地址加上所述第一地址长度的地址;
在所述目标地址的位置写入跳转代码,以使出现ANR时,所述signal catcher线程的代码执行至所述目标地址时跳转至所述模板函数。
2.根据权利要求1所述的方法,其特征在于,使所述新进程跟踪所述当前进程包括:
查找所述当前进程的signal catcher线程ID;
根据所述signal catcher线程ID跟踪所述当前进程的signal catcher线程。
3.根据权利要求2所述的方法,其特征在于,还包括:
判断所述signal catcher线程是否处于非唤醒状态;
当所述signal catcher线程处于非唤醒状态时,执行所述修改所述当前进程的signalcatcher线程的内存代码的步骤。
4.根据权利要求3所述的方法,其特征在于,判断所述signal catcher线程是否处于非唤醒状态之前,还包括:
等待所述signal catcher线程被暂停。
5.一种应用程序无响应的处理装置,其特征在于,所述装置包括:
设置单元,用于设置应用程序所在的当前进程的可跟踪属性,以使所述当前进程能够被非root权限的进程跟踪;
跟踪单元,用于建立一个新进程,使所述新进程跟踪所述当前进程的signal catcher线程,其中,所述新进程是当前进程的子进程;
修改单元,用于在所述新进程中,修改所述当前进程的signal catcher线程的内存代码,以使所述应用程序出现ANR时,所述应用程序所在的当前进程的signal catcher线程在执行过程中跳转至预设的处理函数,由所述处理函数对ANR进行处理,
其中,所述修改单元包括:
保存子单元,用于保存目标地址,所述目标地址为signal catcher线程的pc寄存器的值索引的地址;
复制子单元,用于将所述目标地址开始的第一地址长度范围内的指令复制到位于所述当前进程内存中的模板函数的第一指定位置;
第一写入子单元,用于将处理函数的地址写入到所述模板函数的第二指定位置;
返回地址子单元,用于将所述模板函数的返回地址指向所述目标地址加上所述第一地址长度的地址;
第二写入子单元,用于在所述目标地址的位置写入跳转代码,以使出现ANR时,所述signal catcher线程的代码执行至所述目标地址时跳转至所述模板函数。
6.根据权利要求5所述的装置,其特征在于,所述跟踪单元包括:
查找子单元,用于查找所述当前进程的signal catcher线程ID;
跟踪子单元,用于根据所述查找子单元查找的所述signal catcher线程ID跟踪所述当前进程的signal catcher线程。
7.根据权利要求6所述的装置,其特征在于,还包括:
判断单元,用于判断所述signal catcher线程是否处于非唤醒状态,如果所述signalcatcher线程处于非唤醒状态时,执行所述修改所述当前进程的signal catcher线程的内存代码的步骤。
8.根据权利要求7所述的装置,其特征在于,还包括:
等待单元,用于在所述判断单元判断所述signal catcher线程是否处于非唤醒状态之前,等待所述signal catcher线程被暂停。
CN201410509724.9A 2014-09-28 2014-09-28 一种应用程序无响应的处理方法及装置 Active CN105446806B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410509724.9A CN105446806B (zh) 2014-09-28 2014-09-28 一种应用程序无响应的处理方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410509724.9A CN105446806B (zh) 2014-09-28 2014-09-28 一种应用程序无响应的处理方法及装置

Publications (2)

Publication Number Publication Date
CN105446806A CN105446806A (zh) 2016-03-30
CN105446806B true CN105446806B (zh) 2019-03-15

Family

ID=55557042

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410509724.9A Active CN105446806B (zh) 2014-09-28 2014-09-28 一种应用程序无响应的处理方法及装置

Country Status (1)

Country Link
CN (1) CN105446806B (zh)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106155741B (zh) * 2016-06-30 2019-10-08 努比亚技术有限公司 一种避免应用程序无响应的处理装置及方法
CN106484507B (zh) * 2016-09-18 2019-11-29 天脉聚源(北京)传媒科技有限公司 一种应用线程的处理方法及装置
CN106708563B (zh) * 2016-11-28 2019-11-26 努比亚技术有限公司 一种应用程序无响应处理方法及终端
CN106681913A (zh) * 2016-12-08 2017-05-17 武汉斗鱼网络科技有限公司 一种应用卡顿定位系统及方法
CN108062257A (zh) * 2017-12-28 2018-05-22 北京奇虎科技有限公司 一种处理堆栈信息的方法及系统
CN108647078A (zh) * 2018-05-16 2018-10-12 深圳市德名利电子有限公司 一种基于内存映射到软件界面的方法、系统及存储介质
CN110673899B (zh) * 2018-07-03 2022-06-21 武汉斗鱼网络科技有限公司 一种程序处理方法及相关设备
CN109165114B (zh) * 2018-09-14 2022-07-12 Oppo广东移动通信有限公司 应用程序无响应的处理方法、装置、存储介质及智能终端
CN109918145B (zh) * 2019-01-10 2022-05-20 北京字节跳动网络技术有限公司 一种应用程序冷启动的加速方法、装置、电子设备
CN110377341B (zh) * 2019-06-10 2022-05-03 北京字节跳动网络技术有限公司 一种监听无响应异常的方法、装置、介质和电子设备
CN110489318B (zh) * 2019-08-20 2023-04-28 Oppo(重庆)智能科技有限公司 systrace信息的抓取方法、装置、存储介质及终端
CN112486712A (zh) * 2019-09-11 2021-03-12 北京简约纳电子有限公司 一种嵌入式系统中诊断设备无响应的方法
CN111522764B (zh) * 2020-04-07 2023-02-28 Oppo(重庆)智能科技有限公司 插拔操作的处理方法、终端及存储介质
CN111625425A (zh) * 2020-05-28 2020-09-04 北京达佳互联信息技术有限公司 一种数据监控方法、装置及系统

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1477505A (zh) * 2002-08-24 2004-02-25 深圳市中兴通讯股份有限公司 嵌入式操作系统中异常故障定位方法
CN100388195C (zh) * 2006-02-22 2008-05-14 北京金山软件有限公司 一种64位视窗操作系统下获取函数参数的方法及系统
CN102222015A (zh) * 2010-04-13 2011-10-19 三星电子(中国)研发中心 检测多线程程序中的死锁的方法及系统
CN103049707A (zh) * 2012-12-21 2013-04-17 武汉大学 一种基于Android平台的GPS数据拦截控制方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1477505A (zh) * 2002-08-24 2004-02-25 深圳市中兴通讯股份有限公司 嵌入式操作系统中异常故障定位方法
CN100388195C (zh) * 2006-02-22 2008-05-14 北京金山软件有限公司 一种64位视窗操作系统下获取函数参数的方法及系统
CN102222015A (zh) * 2010-04-13 2011-10-19 三星电子(中国)研发中心 检测多线程程序中的死锁的方法及系统
CN103049707A (zh) * 2012-12-21 2013-04-17 武汉大学 一种基于Android平台的GPS数据拦截控制方法

Also Published As

Publication number Publication date
CN105446806A (zh) 2016-03-30

Similar Documents

Publication Publication Date Title
CN105446806B (zh) 一种应用程序无响应的处理方法及装置
US20200233660A1 (en) Distributed parallel build system
EP3667496B1 (en) Distributed computing system, data transmission method and device in distributed computing system
US9787706B1 (en) Modular architecture for analysis database
CN110620712B (zh) Window平台的实时EtherCAT主站实现方法
US10198343B2 (en) Method for debugging a computer program
US8904386B2 (en) Running a plurality of instances of an application
CN107171825B (zh) 一种终端的重复日志过滤方法
US10462261B2 (en) System and method for configuring a data access system
KR20030086311A (ko) 이동식 저장 장치를 이용한 사용자 환경 데이터 수집 및복원
US8078914B2 (en) Open error-handling system
US11620215B2 (en) Multi-threaded pause-less replicating garbage collection
US9373093B2 (en) Gateway service manager for business object applications
CN109740765A (zh) 一种基于亚马逊网络服务器的机器学习系统搭建方法
CN115280283A (zh) 在kubernets中运行pbs作业
CN110554998A (zh) 一种通过替换函数内部指令的钩子方法、装置、终端及存储介质
CN109828759B (zh) 代码编译方法、装置、计算机装置及存储介质
CN106446064A (zh) 一种数据转换方法及装置
CN110941422B (zh) 代码自动生成方法、代码生成器及可读存储介质
WO2017076244A1 (zh) 一种动态修复应用程序的方法、装置及相关系统
CN107844360B (zh) 一种硬盘执行应用代码的方法及装置
US20150212799A1 (en) Migration between model elements of different types in a modeling environment
EP4318211A1 (en) Method for inspecting code under weak memory order architecture, and corresponding device
WO2022223038A1 (zh) 一种键名称生成方法、装置和计算机可读存储介质
KR20130020135A (ko) 통합 개발 환경에서의 코드 동시 개발자 리스트 제공 시스템 및 방법

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right

Effective date of registration: 20200710

Address after: 310052 room 508, floor 5, building 4, No. 699, Wangshang Road, Changhe street, Binjiang District, Hangzhou City, Zhejiang Province

Patentee after: Alibaba (China) Co.,Ltd.

Address before: 510627 Guangdong city of Guangzhou province Whampoa Tianhe District Road No. 163 Xiping Yun Lu Yun Ping B radio 16 floor tower square

Patentee before: Guangzhou Dongjing Computer Technology Co.,Ltd.

TR01 Transfer of patent right