一种应用程序无响应的处理方法及装置的制造方法_2

文档序号:9672979阅读:来源:国知局
al catcher 线程。
[0049]查找signal catcher线程ID的方法为:
[0050]遍历/proc/self/task目录,里面的子目录的名字为数字,这些数字就是当前进程内所有线程的ID。对于每一个线程的ID,做如下操作:
[0051]打开文件/proc/当前线程ID/comm。
[0052]读取该文件的内容,比较是否为“signal catcher”,如果是,贝U当前线程ID即为signal catcher 的线程 ID。
[0053]在跟踪signal catcher线程后,还需要使用wait命令等待当前进程的signalcatcher线程被暂停。
[0054]当前进程的signal catcher线程在新建进程调用ptrace发送ptrace attach请求的时候被暂停。ptrace attach请求是在Linux内核里面发送SIGST0P信号给被attach的线程。必须暂停该线程才能调用其他ptrace请求。
[0055]步骤103:在所述新进程中,修改所述当前进程的signal catcher线程的内存代码,以使所述应用程序出现ANR时,signal catcher线程在执行过程中跳转至预设的处理函数,由所述处理函数对ANR进行处理。
[0056]只有当signal catcher线程处于非唤醒状态时,才可以修改其代码,因此,需要预先判断signal catcher线程的状态。可使用ptrace PTRACE_GETREGS命令,获得signal catcher线程的寄存器信息。即并比较其中的r7寄存器的值是否为—NR_rt_sigtimedwait,如果是,则说明signal catcher线程正处于非唤醒状态,也可以称为正在处于等待系统发送信号的状态。此时才可以修改所述当前进程的signal catcher线程的内存代码。
[0057]处理函数由应用程序的开发人员预先编写,从应用程序的角度来处理ANR事件,如结束耗时及耗资源的进程、停止10操作等,还可以选择将ANR日志打印到开发人员有权限获取的目录中,以使开发人员记录ANR发生时系统的信息,在后续根据该信息对应用程序做出适当的优化。
[0058]修改signal catcher线程的内存代码时,所要修改的目标地址为signal catcher线程的pc寄存器的值索引的内存地址。需要在该目标地址处插入跳转代码,该跳转代码的作用是,使signal catcher线程执行时能跳转到预先编写的处理函数。在处理函数中,还需要指定该处理函数的返回地址,使其返回地址指向signal catcher线程的原有代码,以使在执行完处理函数后,返回signal catcher线程的原有代码的地址,使signal catcher线程继续执行其自身原有的代码。
[0059]这里需要注意的是,系统依然可以利用signal catcher线程的原有代码来处理ANR事件及打印ANR日志,处理函数并不改变signal catcher线程原有的功能。
[0060]由以上技术方案可知,本实施例提供的应用程序无响应ANR的处理方法,通过建立一个新的进程,使其跟踪应用程序所在的当前进程的signal catcher线程,并在新进程中修改signal catcher线程的内存代码,以使在出现ANR时,signal catcher线程能够跳转至预先编写的处理函数,由处理函数对ANR进行处理,从而使应用程序有机会中断耗时的线程,停止I/O操作,以及记录ANR的详细信息以对应用程序做出改进。
[0061]参见图2,为本发明应用程序无响应ANR的处理方法提供的另一个实施例的流程图,该实施例包括如下步骤:
[0062]步骤201:设置应用程序所在的当前进程的可跟踪属性,以使所述当前进程能够被非root权限的进程跟踪;
[0063]相应的ARM代码为:
[0064]prctl (PR_SET_DUMPABLE, 1,0,0,0);
[0065]步骤202:查找应用程序所在的当前进程的signal catcher线程ID ;
[0066]查找signal catcher线程ID的方法为:
[0067]遍历/proc/self/task目录,里面的子目录的名字为数字,这些数字是当前进程内所有线程的ID。对于每一个线程的ID,做如下操作:
[0068]打开文件/proc/当前线程ID/comm。
[0069]读取该文件的内容,比较是否为“signal catcher”,如果是,贝U当前线程ID即为signal catcher 的线程 ID。
[0070]步骤203:使用wait命令等待signal catcher线程被暂停。
[0071]步骤204:判断所述signal catcher线程是否处于非唤醒状态,如果是,执行步骤205,否则结束流程。
[0072]查看signal catcher线程的r7寄存器的值是否为_NR_rt_sigtimedwait,如果是,则说明signal catcher线程正处于非唤醒状态,也可以称为正在处于等待系统发送信号的状态。
[0073]步骤205:在所述新进程中,修改所述当前进程的signal catcher线程的内存代码,以使所述应用程序出现ANR时,signal catcher线程在执行过程中跳转至预设的处理函数,由所述处理函数对ANR进行处理。
[0074]参见图3,为对signal catcher线程的内存代码进行修改的具体流程图。
[0075]在本实施例中,可以借助模板函数来实现对signal catcher线程内存代码的修改。模板函数是一类通用函数,在模板函数中,有一些参数或语句代码是不具体指定的,比如某些参数类型可用虚拟的类型来代替,某些特定的代码可用占位符来代替。当调用模板函数时,根据当前功能需求,将不确定的参数和代码部分填充为具体的内容,使其变成一个具体的功能函数来正常执行。
[0076]具体到本发明中使用的模板函数,其位于signal catcher线程的内存中,其作用一方面是执行signal catcher线程中被跳转代码覆写的原代码,另一方面是执行预先编写的处理函数的代码。
[0077]如图3所示,步骤205可以具体包括如下的子步骤:
[0078]步骤2051:保存目标地址,所述目标地址为signal catcher线程的pc寄存器的值索引的内存地址;
[0079]步骤2052:将所述目标地址开始的第一地址长度范围内的指令复制到位于所述当前进程内存中的模板函数的第一指定位置;
[0080]将目标地址开始的3条ARM指令的代码,即12个字节的数据复制到模板函数中的第一指定位置,以使模板函数在执行到该第一指定位置时能执行这3条被覆写的ARM代码。空出来的这3条指令的位置将被用于写入跳转代码。
[0081]步骤2053:将处理函数的地址写入到所述模板函数的第二指定位置;
[0082]处理函数由开发人员预先编写,从应用程序的角度来处理ANR事件,如结束耗时及耗资源的进程、停止10操作等,还可以选择将ANR日志打印到开发人员有权限获取的目录中,以使开发人员记录ANR发生时系统的信息,在后续根据该信息对应用程序做出适当的优化。将处理函数的地址写入到模板函数的第二指定位置,以使模板函数在执行到该指定位置时能执行处理函数的代码。
[0083]步骤2054:将所述模板函数的返回地址指向所述目标地址加上所述第一地址长度的地址;
[0084]将模板函数的返回地址指向目标地址+12字节的位置,以使模板函数在执行完成后,能继续返回signal catcher线程的原有代码处继续执行signal catcher线程的其他代码。
[0085]步骤2051至2054的ARM架构的模板函数代码如下:
[0086]push {rO-fp, lr}
[0087]ldr ip,.Ltarget_method
[0088]blx ip
[0089]pop {rO-fp, lr}
[0090]#下面是占位符,用于代替被覆写为目标地址的3条ARM指令。
[0091]mov r0, r0
[0092]mov rO, rO
[0093]mov rO, rO
[0094]ldr ip,.Lreturn_addr
[0095]bx ip
[0096].Ltarget_method:#被修改为处理函数的位置。
[0097].word 0
[0098].Lreturn_addr:#被修改为返回signal catcher线程原有代码的位置。
[0099].word 0
[0100]步骤2055:在所述目标地址的位置写入跳转代码,以使出现ANR时,所述signalcatcher线程的代码执行至所述目标地址时跳转至所述模板函数。
[0101]对应的跳转代码如下:
[0102]ldr ip, [pc]
[0103]bx ip
[0104]<填入模板函数的地址>
[0105]由以上技术方案可知,本实施例提供的应用程序无响应ANR的处理方法,通过建立一个新的进程,使其跟踪应用程序所在的当前进程的signal catcher线程,并在新进程中修改signal catcher线程的内存代码,以使在出现ANR时,signal catcher线程能够跳转至应用程序的开发人员预先编写的处理函数,由处理函数对ANR进行处理,从而使应用程序有机会中断耗时的线程,停止I/O操作,以及记录ANR的详细信息以对应用程序做出改进。
[0106]与本发明应用程序无响应ANR的处理方法的实施例相对应,本说明书还提供了程序无响应ANR的处理装置的实施例。
[0107]为了描述的方便,描述本申请的装置时以功能分为各种单元分别描述。当然,在实施本发明时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
[0108]参见图4,为本发明实施例提供
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1