具体实施方式
为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。
在相关技术中,对iOS环境中应用程序卡死问题的监测主要是基于卡顿监测方案来实现的,即当用户在使用APP的过程中,如果页面响应时间超过一个卡顿阈值,则判断为一次卡顿。此时APP将主线程的调用栈写入日志并上报到远端服务器进行分析和处理。但是这种监测方案存在如下问题:
1、不能区分卡顿和卡死问题,而在APP一次启动到关闭的过程中可能存在多次卡顿问题,这样就会导致上报问题的数量过多的问题,而远端服务器也很难从这些问题中区分出哪些是卡死问题,哪些是卡顿问题。实际上卡死的定义就是长时间卡住并且最终也没有恢复的那部分卡顿,最终的结果有可能是因为触发iOS系统的保护机制崩溃,也有可能因为用户失去耐心而主动关闭,这部分问题对用户体验的伤害要要远远大于卡顿对用户的伤害。
2、在一些场景中,终端设备上的APP一旦发生了卡顿就有可能在短时间内连续发生多次卡顿,但是调用栈的抓取、日志的写入和上报都会对终端设备的性能造成损失,因此频繁的调用栈抓取,日志写入等操作会导致卡顿加剧。
3、卡顿监测方案一般是以一个时间点的调用栈来描述一段时间的卡顿状态,这种描述方式会对问题分析造成误导,导致问题分析不准确。比如,一次卡顿发生了100ms,前99ms都卡在A方法的执行上,但是最后1ms刚好切换到了B方法,这时候卡顿监测抓到的调用栈是B方法的调用栈,其实B方法并不是造成卡顿的主要原因,这样也就造成了误导。
针对相关技术存在的上述问题,本公开实施例提供了一种应用程序卡死问题的监测方案。示例的,图1是本公开实施例提供的一种应用场景的示意图。如图1所示,该场景中至少包括终端设备11和远端服务器10。其中,终端设备11可以理解为诸如手机、平板电脑、车机等搭载有iOS系统,以及可在iOS系统中运行的APP的设备。远端服务器10可以示例性的理解为一种具有数据收发功能和数据处理功能的云平台服务器。在本公开实施例提供的场景中终端设备11搭载的APP中集成有可用于对APP的卡死问题进行监测的监测模块,该监测模块在监测到APP的卡死问题后,会将APP的卡死问题上报给远端服务器10进行分析和处理。下面结合一些示例性的实施例对该监测模块的执行方法进行示例性说明。
示例的,图2是本公开实施例提供的一种应用程序卡死问题的监测方法的流程图,该方法可以示例性的由图1中的监测模块来执行。如图2所示,该方法包括:
步骤201、监测应用程序第一线程中的Runloop执行任务的耗时。
其中,本实施例所称的应用程序可以理解为搭载在iOS系统中的应用程序。第一线程可以示例性的理解为应用程序的主线程。
示例的,图3是本公开实施例提供的一种Runloop的执行流程的示意图。其中,“通知Runloop Eentry”是指通知Runloop进入任务执行流程;“通知Runloop Before Timers”是指通知Runloop即将处理定时器事件;“通知Runloop Before Sources”是指通知Runloop即将处理Source0事件;“处理Source0事件”是指Runloop对Source0事件进行处理;“如果有Source1事件,跳至9”是指在处理完Source0事件之后,如果有待处理的Source1事件,则跳转到执行过程9,继续执行;“通知Runloop Before Waiting”是指通知Runloop即进入睡眠;“通知Runloop After Waiting”是指通知Runloop结束睡眠,Runloop从睡眠状态中被唤醒;“处理Timer”是指Runloop在唤醒后,对定时器事件进行处理;“处理dispatch block”是指Runloop对调度块进行处理;“处理Source1事件”是指Runloop对Source1事件进行处理;“退出判断,不退出则跳至2”是指Runloop对是否退出任务进行判断,如果是则退出,否则跳到过程2继续处理。其中,Runloop在执行到过程1、2、3、6、8、13时,会将相应的执行状态上报给监测模块,以使监测模块能够获得Runloop实时的执行状态的信息。
参见图3,Runloop执行任务的过程主要是在过程1到过程6,以及过程9到过程2。本实施例中对第一线程中Runloop执行任务的耗时的监测可以示例性的理解为对Runloop从过程1到过程6,以及过程9到过程2的耗时进行监测,也就是说,在本公开中,Runloop执行任务的耗时是指从Runloop进入过程1开始,到Runloop进入休眠状态或者退出任务为止的耗时,该耗时不包括休眠的时间;当Runloop进入睡眠时停止计时,已经积累的计时结果将被清零,当Runloop重新被唤醒时重新从0开始计时。
本实施例对Runloop执行任务的耗时的监测可以基于一个或多个预设的计时器来实现。比如在一种实施方式中,当Runloop所在的应用程序运行时,监测装置为预设的计时器分配资源,使得计时器间隔预设时间对Runloop执行任务的耗时进行累加计时,当监测到Runloop所在的应用程序被挂起时,停止为计时器分配资源,使得计时器暂停计时,当监测到Runloop所在的应用程序重新恢复运行时,再继续为计时器分配资源使得计时器继续对Runloop执行任务的耗时进行计时。这里为了方便理解下面以一个示例进行说明。
示例的,图4是本公开实施例提供的一种计时方式的示意图,其中,图4中的过程1、2、3、4分别对应于图3中的过程1、2、3和4。其中在执行到a时刻时,Runloop所在的应用程序被挂起,并在b时刻时应用程序恢复运行。如图4所示,如果将a时刻到b时刻的这段时间也计入Runloop执行任务的耗时,则会出现实际执行任务的时间和计时时间不匹配的问题,从而导致卡死问题误判的问题。为了避免这一问题,本实施例的计时器被配置为间隔预设时间对Runloop执行任务的耗时进行累加计时,当监测到Runloop所在的应用程序被挂起时,暂停计时,当监测到应用程序重新恢复运行时恢复计时,即在图4中表现为在T1时刻、T2时刻、T3时刻、T4时刻、T5和T6时刻分别对Runloop执行任务的耗时进行累加,在a时刻暂停计时,在b时刻继续计时,直到Runloop进入下一执行状态或者应用程序关闭为止。这样即使出现计时误差也只是一个时间间隔的计时误差,从而提高了本实施例任务耗时监测和卡死问题判断的准确性。
步骤202、在监测到Runloop执行任务的耗时达到预设阈值时,至少获取第一线程的调用栈和Runloop当前的第一执行状态,并将获取到的调用栈写入预设文件。
举例来说,图5是本公开实施例提供的一种获取调用栈和Runloop执行状态的方法的示意图。图5中的过程1、2、3、4、5分别对应图3中的过程1、2、3、4和5。如图5所示,在图5中,第一线程中的Runloop在执行到过程4时,任务的耗时达到了预设阈值,此时至少需要获取第一线程在此时的调用栈和Runloop在此时的第一执行状态(即Runloop正处于处理Source0事件的状态),并将获取到的调用栈写入预设文件(预设文件可以示例性的理解为用于记录卡死问题的日志文件,但不局限于日志文件)中,作为卡死的怀疑对象。也就是说本实施例在监测到Runloop执行任务的耗时达到预设阈值时,只是将第一线程在该时刻的调用栈写入预设文件作为发生卡死问题的怀疑对象,而不是判断一定发生了卡死问题。实际上,在图5中,Runloop只是在执行到过程4的时候出现了卡顿,而不是卡死。
其中,本实施例中的上述预设阈值可以根据需要进行设定,而不必局限于某一个特定的数值。实际上在一些实施例中可以将预设阈值设置成比相关技术的卡顿阈值更大的一个值,以减少误判的发生,提高对卡死问题监测的准确性。
当然上述图5仅是对本公开实施例的一种示例性说明而不是唯一限定,实际上,为了丰富上报数据,使得远端服务器能够有足够的数据分析得到准确的卡死原因。在其他实施例中,在监测到Runloop执行任务的耗时达到预设阈值时,还可以获取应用程序中除第一线程以外的其他线程(即第二线程)的调用栈,并将获取到的调用栈也写入预设文件中。
进一步的,远端服务器在对某个应用程序的卡死问题进行分析处理时,可以对安装有该应用程序的多个终端设备上报的多个预设文件进行综合分析处理,得到该应用程序的卡死原因;或者也可以分别对安装有该应用程序的每个终端设备上报的预设文件进行处理,得到该应用程序在每个终端设备上出现卡死问题的原因。
步骤203、对Runloop在所述耗时达到预设阈值之后的执行状态进行监测。
其中,在监测到Runloop执行任务的耗时超过预设阈值时,本实施例可以基于预设的第二时间间隔对Runloop在任务耗时达到预设阈值之后的执行状态进行监测。其中,第二时间间隔可以根据需要进行设定而不必局限于某一个特定值。其中本实施例对于第二时间间隔的命名仅用于对多个时间间隔进行区分而不具有其他含义。
步骤204、如果直到应用程序关闭,Runloop仍未进入第一执行状态之后的第二执行状态,将预设文件发送给远端服务器。
其中,第二执行状态可以理解为第一执行状态之后的任一执行状态。
实际中,应用程序发生卡顿问题之后的一段时间内,Runloop的执行状态是会发生变化的,即Runloop不会一直停留在发生卡顿时刻的执行状态,而是在一段时间后会进入下一执行状态,而在应用程序发生卡死问题之后,Runloop的执行状态却会一直停留在发生卡死时刻的执行状态而不会进入下一执行状态。基于此,本实施例通过对Runloop在任务耗时达到预设阈值之后的执行状态进行监测来实现对卡死问题的识别和判断,即当监测到直到应用程序关闭(可能是应用程序崩溃导致的关闭,也可能是用户主动关闭),Runloop的执行状态仍旧停留在第一执行状态未改变,则判断应用程序发生了卡死问题,并在预设的上报时机到达(比如应用程序卡死关闭后第一次启动)时,将应用程序的预设文件发送给远端服务器,使得远端服务器根据预设文件中记录的调用栈的信息对卡死问题进行分析和处理。而如果在应用程序未关闭之前,就监测到Runloop的执行状态已经从第一执行状态进入到第二执行状态,则说明本次出现的问题是卡顿问题而不是卡死问题。在本实施例中,出现卡顿问题时,预设文件不会被发送给远端服务器,这样能够防止卡顿问题的数据对卡死问题的分析造成误导。并且在一些实施例中,在确定应用程序出现卡顿问题之后,还可以将本次卡顿问题记录的调用栈从预设文件中删除,以节约存储资源。
另外,考虑到卡死时间的长度也是影响用户体验的一个重要因素,为了能够分析得到用户对卡死问题的容忍程度,在一些实施例中还可以将监测到的Runloop执行任务的耗时也写入预设文件中,并间隔预设时间间隔对Runloop执行任务的耗时进行更新,从而使得Runloop执行任务的耗时能够被携带在预设文件中一起上报给远端服务器。也就是说在一些实施例中,在监测到Runloop执行任务的耗时达到预设阈值之后,还要间隔预设时间间隔对Runloop执行任务的耗时继续进行累加计时,并将Runloop执行任务的总耗时携带在预设文件中上报给远端服务器。
本公开实施例,通过对应用程序中第一线程的Runloop执行任务的耗时进行监测,在监测到Runloop执行任务的耗时超过预设阈值时,对Runloop在任务耗时达到预设阈值之后的执行状态进行监测,并在监测到直到应用程序关闭,Runloop的执行状态仍旧是在任务耗时达到预设阈值时的第一执行状态,未进入第二执行状态时,判断应用程序出现了卡死问题,从而实现了应用程序卡死问题的识别和监测问题。并且只有在应用程序关闭,Runloop仍旧未能够进入第一执行状态之后的第二执行状态时,才判断应用程序出现卡死问题,能够防止将应用程序的卡顿问题误判为卡死问题,提高了卡死问题监测的准确性。另外,应用程序在一次启动到关闭的过程中卡死问题只能出现一次,而卡顿问题可以出现多次,如果不对Runloop在任务耗时达到预设阈值之后的执行状态监控,则容易出现将卡顿问题误判为卡死问题的情况,进而导致上报给远端服务器的问题过多,远端服务器无法聚焦到对用户体验影响更大的卡死问题上的问题,而本公开实施例通过在监测到Runloop执行任务的耗时超过预设阈值时,将第一线程的调用栈写入预设文件,并在监测到应用程序出现卡死问题时才将预设文件发送给远端服务器,能够减少上报问题的数量,使得远端服务器能够聚焦到应用程序卡死问题的分析和处理上,提高解决卡死问题的效率。
图6是本公开实施例提供的另一种应用程序卡死问题的监测方法的流程图,如图6所示,该方法包括:
步骤601、监测应用程序第一线程中的Runloop执行任务的耗时。
步骤602、在监测到Runloop执行任务的耗时达到预设阈值时,至少获取第一线程的调用栈和Runloop当前的第一执行状态,并将获取到的调用栈写入预设文件。
步骤603、对Runloop在所述耗时达到预设阈值之后的执行状态进行监测。
其中对于Runloop在任务耗时达到预设阈值之后的执行状态,可以每隔第二时间间隔获取一次,直到应用程序关闭或者监测到Runloop的执行状态进入到第二执行状态为止。
步骤604、在Runloop执行任务的耗时达到预设阈值之后,基于预设的第一时间间隔定期获取第一线程和/或应用程序中至少一个第二线程的调用栈,并将定期获取到的调用栈写入到预设文件中。
本实施例中,步骤603和步骤604可以在步骤602之后,并行执行。
其中,第一时间间隔与第二时间间隔可以相同,也可以不同。第二线程可以是应用程序中除第一线程以外的任一线程。
本实施例在监测到Runloop执行任务的耗时达到预设阈值之后,可以每隔第一时间间隔获取一次第一线程和/或至少一个第二线程的调用栈,并将定期获取到的调用栈写入预设文件中。这里为了便于理解以一个示例进行说明:
示例的,图7是本公开实施例提供的一种获取调用栈的方法示意图。图7中的过程1、2、3、4分别对应图3中的过程1、2、3和4。如图7所示,在图7中,在第一线程中的Runloop执行任务耗时达到了预设阈值之后,每隔第一时间间隔U获取一次第一线程和/或至少一个第二线程的调用栈,并将获取到的调用栈写入预设文件。当然图7仅是示例说明而不是对本公开的唯一限定。
步骤605、如果直到应用程序关闭,Runloop仍未进入第一执行状态之后的第二执行状态,则在预设的上报时机到达时将预设文件发送给远端服务器。
其中,预设的上报时机例如可以是应用程序卡死关闭后第一次启动,但是不局限于是第一次启动。
仍以图7为例,在图7中,Runloop在执行到过程4时,Runloop执行任务的耗时超过了预设阈值,并且直到应用程序关闭,其执行状态一直保持过程4的执行状态未改变,此时判断应用程序发生了卡死问题,在应用程序下一次启动时将应用程序的预设文件发送到远端服务器。当然图7中仅是示出了卡死问题的情况,实际上,实际中还可能出现卡顿的情况,在这种情况下,图7中Runloop的执行状态在应用程序关闭之前会进入过程4之后的其他过程对应的状态,例如图3中过程5的执行状态等。在这种情况下本实施例会判断出现了卡顿问题而不是卡死问题,预设文件不会被发送到远端服务器。并且为了节约存储空间,步骤602和604中写入到预设文件中的调用栈将被从预设文件中删除。
另外,需要说明的是,预设文件中除了包括调用栈的信息之外还可以包括其他信息,比如iOS版本信息,终端设备的机型和型号信息等。当然这里仅是示例说明而不是对预设文件中信息的唯一限定。
本实施例通过在监测到Runloop执行任务的耗时达到预设阈值之后,每隔第一时间间隔获取一次第一线程和/或至少一个第二线程的调用栈,并在判断应用程序出现卡死问题时,将该些调用栈携带在预设文件中一起发送给远端服务器,能够为远端服务器提供丰富的分析依据,提高卡死问题分析的准确性。
可选的,在本公开实施例提供的又一种应用程序卡死问题的监测方法的实施例中,上述任一实施例还可以包括:判断预设文件中记录的调用栈的数量是否大于预设数量的步骤,以及在判断预设文件中记录的调用栈的数量大于预设数量时,按照调用栈的获取顺序,保留最后获取到的预设数量的调用栈,删除剩余调用栈的步骤。例如,预设数量是10,那么当预设文件中记录的调用栈的数量超过10个时,可以只保留最近获取到的10个调用栈,并删除其他调用栈。当然这里仅是示例说明,实际上,在其他实施例中在Runloop执行任务的耗时达到预设阈值之后,还可以间隔预设时间定期执行一次获取第一线程和/或第二线程的调用栈的操作,获取到的调用栈将被写入预设文件中。当执行获取调用栈的操作的次数超过预设次数时,保留预设文件中在任务耗时达到预设阈值时获取到的调用栈的信息,并删除预设文件中在任务耗时达到预设阈值之后的一次或多次获取操作中获取到的调用栈的信息,使得预设文件中只保留预设次数的获取操作中获取到的调用栈的信息,比如,预设次数为10,那么在将第11次获取操作获取到的调用栈(包括第一线程和/或第二线程的调用栈)的信息写入预设文件之前或之后,还可以将第2次获取到的调用栈(即在任务耗时达到预设阈值之后间隔预设时间第一次执行获取操作得到的调用栈)的信息从预设文件中删除,保留其他的调用栈的信息。在将第12次获取操作获取到的调用栈的信息写入预设文件之前或之后,将第3次获取到的调用栈的信息从预设文件中删除,依次类推,直到应用程序关闭。
另外,需要说明的是上述用于判断预设文件中调用栈的数量是否大于预设数量的步骤,以及从预设文件中删除多余调用栈的步骤,可以在每次有新的调用栈要写入预设文件时执行,也可以在判断应用程序出现卡死问题,在将预设文件上报到远端服务器之前执行,此时上报给远端服务器调用栈为在应用程序关闭前获取的预设数量的调用栈。
本实施例通过对预设文件中调用栈的数量进行判断,并在预设文件中的调用栈的数量大于预设数量时,保留最后获取到的预设数量的调用栈,删除其余调用栈,能够避免卡死时间过长导致的调用栈数量膨胀的问题,节约了存储空间。
图8是本公开实施例提供的一种应用程序卡死问题的监测装置的结构示意图,如图8所示,监测装置80包括:
第一监测模块81,用于监测应用程序第一线程中的Runloop执行任务的耗时,所述应用程序是指搭载在iOS系统中的应用程序;
第一获取模块82,用于在监测到所述耗时达到预设阈值时,至少获取所述第一线程的调用栈和所述Runloop当前的第一执行状态,并将所述调用栈写入预设文件;
第二监测模块83,用于对所述Runloop在所述耗时达到所述预设阈值之后的执行状态进行监测;
发送模块84,用于在直到所述应用程序关闭,所述Runloop仍未进入所述第一执行状态之后的第二执行状态时,将所述预设文件发送给远端服务器。
在一种实施方式中,第一监测模块81,用于:
在监测到所述应用程序被挂起,暂停对所述耗时的计时;
在监测到所述应用程序恢复运行,继续对所述耗时进行计时。
在一种实施方式中,监测装置80还包括:
第二获取模块,用于在监测到所述耗时达到预设阈值时,获取所述应用程序的至少一个第二线程的调用栈,并将所述至少一个第二线程的调用栈写入到所述预设文件。
在一种实施方式中,监测装置80还包括:
第三获取模块,用于在监测到所述耗时达到预设阈值之后,基于预设的第一时间间隔定期获取所述第一线程和/或所述至少一个第二线程的调用栈,并将定期获取到的所述调用栈写入到所述预设文件。
在一种实施方式中,监测装置80还包括:
第一处理模块,用于在所述预设文件中记录的调用栈的数量大于预设数量时,按照所述调用栈的获取顺序,保留最后获取到的所述预设数量的调用栈,删除其余调用栈。
在一种实施方式中,监测装置80还包括:
任务耗时写入模块,用于在直到所述应用程序关闭,所述Runloop仍未进入所述第一执行状态之后的第二执行状态时,将所述Runloop执行任务的耗时写入到所述预设文件。
在一种实施方式中,监测装置80还包括:
第二处理模块,用于在监测到所述Runloop的执行状态进入所述第一执行状态之后的第二执行状态时,删除所述预设文件中记录的调用栈。
本实施例提供的装置能够执行上述图2-图7中任一实施例的方法,其执行方式和有益效果类似,在这里不再赘述。
本公开实施例还提供了一种终端设备,该终端设备包括处理器和存储器,其中,存储器中存储有计算机程序,当该计算机程序被处理器执行时,处理器可以执行上述图2-图7中任一实施例的方法。
示例的,图9是本公开实施例中的一种终端设备的结构示意图。下面具体参考图9,其示出了适于用来实现本公开实施例中的终端设备1000的结构示意图。本公开实施例中的终端设备1000可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。图9示出的终端设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图9所示,终端设备1000可以包括处理装置(例如中央处理器、图形处理器等)1001,其可以根据存储在只读存储器(ROM)1002中的程序或者从存储装置1008加载到随机访问存储器(RAM)1003中的程序而执行各种适当的动作和处理。在RAM 1003中,还存储有终端设备1000操作所需的各种程序和数据。处理装置1001、ROM 1002以及RAM 1003通过总线1004彼此相连。输入/输出(I/O)接口1005也连接至总线1004。
通常,以下装置可以连接至I/O接口1005:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置1006;包括例如液晶显示器(LCD)、扬声器、振动器等的输出装置1007;包括例如磁带、硬盘等的存储装置1008;以及通信装置1009。通信装置1009可以允许终端设备1000与其他设备进行无线或有线通信以交换数据。虽然图9示出了具有各种装置的终端设备1000,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在非暂态计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置1009从网络上被下载和安装,或者从存储装置1008被安装,或者从ROM 1002被安装。在该计算机程序被处理装置1001执行时,执行本公开实施例的方法中限定的上述功能。
需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、RF(射频)等等,或者上述的任意合适的组合。
在一些实施方式中,客户端、服务器可以利用诸如HTTP(HyperText TransferProtocol,超文本传输协议)之类的任何当前已知或未来研发的网络协议进行通信,并且可以与任意形式或介质的数字数据通信(例如,通信网络)互连。通信网络的示例包括局域网(“LAN”),广域网(“WAN”),网际网(例如,互联网)以及端对端网络(例如,ad hoc端对端网络),以及任何当前已知或未来研发的网络。
上述计算机可读介质可以是上述终端设备中所包含的;也可以是单独存在,而未装配入该终端设备中。
上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该终端设备执行时,使得该终端设备:监测应用程序第一线程中的消息循环机制Runloop执行任务的耗时,所述应用程序是指搭载在iOS系统中的应用程序;在监测到所述耗时达到预设阈值时,至少获取所述第一线程的调用栈和所述Runloop当前的第一执行状态,并将所述调用栈写入预设文件;对所述Runloop在所述耗时达到所述预设阈值之后的执行状态进行监测;如果直到所述应用程序关闭,所述Runloop仍未进入所述第一执行状态之后的第二执行状态,将所述预设文件发送给远端服务器。
可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括但不限于面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。其中,单元的名称在某种情况下并不构成对该单元本身的限定。
本文中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑设备(CPLD)等等。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
本公开实施例还提供一种计算机可读存储介质,所述存储介质中存储有计算机程序,当所述计算机程序被处理器执行时可以实现上述图2-图7中任一实施例的方法,其执行方式和有益效果类似,在这里不再赘述。
本公开实施例还提供一种计算机程序产品,该计算机程序产品中包括计算机程序,当所述计算机程序被处理器执行时,处理器可以执行上述图2-图7中任一实施例的方法,其执行方式和有益效果类似,在这里不再赘述。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。