发明内容
本公开实施例至少提供一种卡顿监控方法、装置、电子设备及存储介质。
第一方面,本公开实施例提供了一种卡顿监控方法,包括:
响应于接收到的垂直同步信号,通过创建的检测线程生成请求信号;通过显示链接对象的方式获取所述垂直同步信号,所述垂直同步信号用于指示前一帧画面的结束以及新一帧画面的开始;
通过所述检测线程将所述请求信号发送至目标线程;所述目标线程用于响应所述请求信号,并产生反馈信号发送至所述检测线程;
根据所述检测线程发出所述请求信号的发出时间以及所述检测线程接收到所述反馈信号的情况,确定所述目标线程是否发生卡顿。
本公开实施例中,通过创建的检测线程来对目标线程进行卡顿监测,如此,通过程序自身即可识别处于卡顿状态的目标线程,而无需依赖专门的检测工具,降低了卡顿监测成本,使得卡顿监测操作简单、易于实现。另外,本公开实施例中,在卡顿监测的过程中,由于在获取到垂直同步信号后,通过创建的检测线程生成请求信号,基于该垂直同步信号的特性,进而可以提高卡顿检测的精度。
根据第一方面,在一种可能的实施方式中,所述根据所述检测线程发出所述请求信号的发出时间以及所述检测线程接收到所述反馈信号的情况,确定所述目标线程是否发生卡顿,包括:
在确定所述检测线程发出所述请求信号的情况下,开始计时;
若在计时时间达到预设时间的情况下,所述检测线程未收到所述反馈信号,确定所述目标线程发生卡顿。
本公开实施例中,在检测线程发出请求信号后开始计时,根据在预设时间内是否收到反馈信号来确定目标线程是否发生卡顿,简化了卡顿确定的过程,方便处理,进而提高了卡顿确定的效率。
根据第一方面,在一种可能的实施方式中,所述目标线程包括至少一个函数调用栈;在确定所述目标线程发生卡顿之后,所述方法还包括:
确定所述目标线程中发生卡顿的目标函数调用栈,并确定所述目标函数调用栈中发生卡顿的至少一个目标函数。
本公开实施例中,在确定卡顿发生之后,进一步确定发生卡顿的目标函数,如此不仅可以监测到是否发生了卡顿,还可以定位到引起卡顿发生的目标函数,进而为解决卡顿问题提供了依据。
根据第一方面,在一种可能的实施方式中,所述确定所述目标线程中发生卡顿的目标函数调用栈,并确定所述目标函数调用栈中发生卡顿的至少一个目标函数,包括:
获取所述目标线程的线程状态对象;所述线程状态对象包括程序计数器指针及链接寄存器指针;所述程序计数器指针用于存放所述至少一个函数调用栈的地址;所述链接寄存器指针用于存放所述函数调用栈的函数调用信息;
根据所述程序计数器指针确定所述目标函数调用栈;
基于所述目标函数调用栈以及所述链接寄存器指针,确定所述目标函数。
本公开实施例中,根据程序计数器指针及链接寄存器指针来确定目标函数,可以提高目标函数确定的准确率。
根据第一方面,在一种可能的实施方式中,所述确定生卡顿的至少一个目标函数之后,所述方法还包括:
基于接收到的所述垂直同步信号的次数,对所述至少一个目标函数的卡顿时间进行分析。
本公开实施例中,通过对导致卡顿的至少一个目标函数进行卡顿时间分析,可以为开发者提供相应的分析指示,有利于开发者后续对目标函数进行优化。
根据第一方面,在一种可能的实施方式中,所述基于接收到的所述垂直同步信号的次数,对所述至少一个目标函数的卡顿时间进行分析,包括:
在再次获取到所述垂直同步信号的情况下,判断所述卡顿是否结束;其中,在所述检测线程收到所述反馈信号的情况下,确定所述卡顿结束;
在所述卡顿结束的情况下,确定所述至少一个目标函数分别对应的所述垂直信号的次数;
根据每个所述目标函数所对应的所述垂直信号的次数,以及在所述目标线程发生卡顿期间所接收到的所述垂直信号的总次数,确定每个所述目标函数的卡顿时间。
本公开实施例中,通过每个所述目标函数所对应的所述垂直信号的次数,以及在所述目标线程发生卡顿期间所接收到的所述垂直信号的总次数,来确定每个所述目标函数的卡顿时间,简单、方便,有利于提升卡顿时间的确定效率。
根据第一方面,在一种可能的实施方式中,所述方法还包括:
根据每个所述目标函数的卡顿时间,确定修改每个所述目标函数的优先级;其中,所述卡顿时间越短,所述优先级越高;
基于所述优先级以及符号文件,确定所述目标函数发生卡顿的目标代码,并对所述目标代码进行修改。
本公开实施例中,由于卡顿时间越短,优先级越高,进而可以优先对卡顿时间较少的目标函数进行代码修改,如此,可以提高卡顿问题的解决效率。
根据第一方面,在一种可能的实施方式中,所述目标线程包括多个,所述确定所述目标函数调用栈中发生卡顿的至少一个目标函数之后,所述方法还包括:
判断所述目标函数所对应的任务是否属于预设的目标任务;所述目标任务由所述目标线程的运行循环确定;
在所述目标函数所对应的任务属于所述目标任务的情况下,对所述目标函数不进行耗时分析。
本公开实施例中,由于对属于所述目标任务的目标函数不进行耗时分析,进而可以将卡顿和原本执行的耗时任务进行区分,提升了系统资源利用率。
第二方面,本公开实施例提供了一种卡顿监控装置,包括:
信号生成模块,用于响应于接收到的垂直同步信号,通过创建的检测线程生成请求信号;通过显示链接对象的方式获取所述垂直同步信号,所述垂直同步信号用于指示前一帧画面的结束以及新一帧画面的开始;
信号发送模块,用于通过所述检测线程将所述请求信号发送至目标线程;所述目标线程用于响应所述请求信号,并产生反馈信号发送至所述检测线程;
卡顿判断模块,用于根据所述检测线程发出所述请求信号的发出时间以及所述检测线程接收到所述反馈信号的情况,确定所述目标线程是否发生卡顿。
根据第二方面,在一种可能的实施方式中,卡顿判断模块具体用于:
在确定所述检测线程发出所述请求信号的情况下,开始计时;
若在计时时间达到预设时间的情况下,所述检测线程未收到所述反馈信号,确定所述目标线程发生卡顿。
根据第二方面,在一种可能的实施方式中,所述卡顿监控装置还包括目标函数确定模块,该目标函数确定模块用于:
确定所述目标线程中发生卡顿的目标函数调用栈,并确定所述目标函数调用栈中发生卡顿的至少一个目标函数。
根据第二方面,在一种可能的实施方式中,该目标函数确定模块具体用于:
获取所述目标线程的线程状态对象;所述线程状态对象包括程序计数器指针及链接寄存器指针;所述程序计数器指针用于存放所述至少一个函数调用栈的地址;所述链接寄存器指针用于存放所述函数调用栈的函数调用信息;
根据所述程序计数器指针确定所述目标函数调用栈;
基于所述目标函数调用栈以及所述链接寄存器指针,确定所述目标函数。
根据第二方面,在一种可能的实施方式中,所述卡顿监控装置还包括卡顿时间分析模块,该卡顿时间分析模块用于:
基于接收到的所述垂直同步信号的次数,对所述至少一个目标函数的卡顿时间进行分析。
根据第二方面,在一种可能的实施方式中,该卡顿时间分析模块具体用于:
在再次获取到所述垂直同步信号的情况下,判断所述卡顿是否结束;其中,在所述检测线程收到所述反馈信号的情况下,确定所述卡顿结束;
在所述卡顿结束的情况下,确定所述至少一个目标函数分别对应的所述垂直信号的次数;
根据每个所述目标函数所对应的所述垂直信号的次数,以及在所述目标线程发生卡顿期间所接收到的所述垂直信号的总次数,确定每个所述目标函数的卡顿时间。
根据第二方面,在一种可能的实施方式中,所述卡顿监控装置还包括代码修改模块,该代码修改模块用于:
根据每个所述目标函数的卡顿时间,确定修改每个所述目标函数的优先级;其中,所述卡顿时间越短,所述优先级越高;
基于所述优先级以及符号文件,确定所述目标函数发生卡顿的目标代码,并对所述目标代码进行修改。
根据第二方面,在一种可能的实施方式中,所述目标线程包括多个,所述卡顿判断模块具体用于:
断所述目标函数所对应的任务是否属于预设的目标任务;所述目标任务由所述目标线程的运行循环确定;
在所述目标函数所对应的任务属于所述目标任务的情况下,对所述目标函数不进行耗时分析。
第三方面,本公开实施例提供了一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行如第一方面所述的卡顿监控方法。
第四方面,本公开实施例提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行如第一方面所述的卡顿监控方法。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。
在移动设备上,应用程序运行的流畅性是衡量移动设备性能的核心指标之一,是否流畅运行取决于应用程序的帧率。当应用程序主线线程出现耗时操作时,主界面刷新的帧率会降低,此时用户会感知到明显的不流畅,也即应用程序界面出现卡顿现象。现有的卡顿检测方法,通常需要额外的检测工具进行卡顿检测,导致卡顿检测成本较高。
基于上述研究,本公开提供了一种卡顿监控方法,包括:响应于接收到的垂直同步信号,通过创建的检测线程生成请求信号;通过显示链接对象的方式获取所述垂直同步信号,所述垂直同步信号用于指示前一帧画面的结束以及新一帧画面的开始;通过所述检测线程将所述请求信号发送至目标线程;所述目标线程用于响应所述请求信号,并产生反馈信号发送至所述检测线程;根据所述检测线程发出所述请求信号的发出时间以及所述检测线程接收到所述反馈信号的情况,确定所述目标线程是否发生卡顿。如此,实现了程序自身识别处于卡顿状态的线程,无需依赖专门的卡顿检测工具,进而降低了卡顿检测成本。
请参阅图1,为本公开实施例所提供的卡顿监控方法的执行主体的示意图,该方法的执行主体为电子设备100,其中电子设备100可以包括终端和服务器。例如,该方法可应用于终端中,终端可以是图1中所示智能手机10、台式计算机20、笔记本电脑30等,还可以是图1中未示出的智能音箱、智能手表、平板电脑等,并不限定。该方法还可应用于服务器40,或者可应用于由终端和服务器40所组成的实施环境中。服务器40可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云存储、大数据和人工智能平台等基础云计算服务的云服务器。
在一些实施方式中,服务器40可以通网络50分别与智能手机10、台式计算机20及笔记本电脑30进行通信。网络50可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
需要说明的是,所述电子设备的种类仅为举例,其他现有的或今后可能出现的电子设备,比如,AR(Augmented Reality,增强现实)设备、VR(Virtual Reality,虚拟现实)设备、MR(Mixed Reality,混合现实)设备等如可适用于本申请,也应包含在本申请保护范围以内,并以引用方式包含于此。
此外,该卡顿监控方法还可以是运行于终端或服务器中的软体,例如具有卡顿监控功能的应用程序等。在一些可能的实现方式中,该卡顿监控方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
为了便于对本公开实施例中的卡顿方法的理解,下面对程序、进程与线程的关系进行介绍说明。
进程(Process)是程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程(thread)是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。同一进程中的多个线程之间可以并发执行。线程是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和线程栈组成。一个线程可以创建和撤消另一个线程。每一个程序都至少有一个线程,若程序只有一个线程,那该线程就是程序本身。
线程包括就绪、卡顿(阻塞)和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;卡顿状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。线程处于卡顿状态将直接影响整个程序的运行效果,因此需识别出处于卡顿状态的线程,以便找出使线程处于卡顿状态的原因,从而解决卡顿问题。
参见图2所示,为本公开实施例提供的卡顿监控方法的流程图,该卡顿监控方法包括以下S101~S103:
S101,响应于接收到的垂直同步信号,通过创建的检测线程生成请求信号;通过显示链接对象的方式获取所述垂直同步信号,所述垂直同步信号用于指示前一帧画面的结束以及新一帧画面的开始。
垂直同步信号,也称垂直同步脉冲(Vertical synchronization,Vsync)是加在两帧之间,用于指示着前一帧的结束,和新一帧的开始。垂直同步脉冲是一个持续时间比较长的脉冲,可能持续一行或几行的扫描时间,但在这段时间内,没有像素信号出现。
所述的检测线程是为识别目标线程是否处于卡顿状态而建立的线程。该监控线程可以在目标线程执行前或执行过程中建立,且该检测线程可以由目标线程建立,也可以由第三方建立,本实施例对此不做具体限制。
本实施方式中,检测线程在收到V-Sync信号的时候,会生成请求信号,例如,该请求信号可以是一个ping信号给主线程,其中ping是一个DOS(Disk Operating System,磁盘操作系统)命令,一般用于检测网络通或不通。
在一些实施方式中,可以通过显示链接对象(CADisplayLink)获取系所述垂直同步信号,如此,可以避免遗漏系统所发出的V-Sync信号,进一步提高卡顿检测的精度。
S102,通过所述检测线程将所述请求信号发送至目标线程;所述目标线程用于响应所述请求信号,并产生反馈信号发送至所述检测线程。
目标线程可以为任意程序的线程,且其可以为主线程也可以为子线程。主线程是当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行。因为主线程是程序开始时就执行的,如果需要再创建线程,那么创建的线程就是这个主线程的子线程。因此,每个进程至少都有一个主线程。
例如,被监控线程可以为UI(User Interface,用户界面)线程。需要说明的是,在iOS平台的应用程序开发中,对UI的操作只能在主线程中进行,因此该场景下主线程即为目标线程。正常情况下,在Vsync信号来临时,主线程应能够响应绘制;而若在Vsync信号来临时,主线程未能及时响应绘制,表现出来的就是掉帧,也即出现卡顿现象。
所述目标线程在接收到请求信号的情况下,需要生成一个反馈信号,并将该反馈信号回传至检测线程。例如,该反馈信号可以是pong信号,该目标线程在接收到请求信号的情况下,可以产生一pong信号并发送至所述检测线程。
S103,根据所述检测线程发出所述请求信号的发出时间以及所述检测线程接收到所述反馈信号的情况,确定所述目标线程是否发生卡顿。
可以理解,如果目标线程没有发生卡顿,那么必然有时间响应ping信号,并及时生成相应的pong信号。而如果没有及时响应,则可以推测目标线程必然在执行其他耗时任务,因此,通过对比检测线程发出ping信号的时间,以及检测线程接收到pong信号的时间,可以得到目标线程的耗时任务的执行时长,从而判断是否达到卡顿阈值。
示例性地,参见图3所示,为本公开实施例提供的一种判断目标线程是否发生卡顿的过程示意图。在一些实施方式中,在获取到垂直同步信号后,通过检测线程生成请求信号,然后通过检测线程将该请求信号发送至目标线程,目标线程接收到该请求信号后,若未发生卡顿,则能够响应该请求信号并产生反馈信号,而若目标线程因执行耗时任务而发生卡顿,则不能及时的响应该请求信号,因此若检测线程在预设设时间内未收到反馈信号,则可以判断此时目标线程发生卡顿,其中该预设时间为前述的发生卡顿的时间阈值。具体地,可以在确定所述检测线程发出所述请求信号的情况下,开始计时,若在计时时间达到预设时间的情况下,所述检测线程未收到所述反馈信号,确定所述目标线程发生卡顿,直到检测线程接收到反馈信号后,确定卡顿结束。
本公开实施例中,通过创建的检测线程来对目标线程进行卡顿监测,如此,通过程序自身即可识别处于卡顿状态的目标线程,而无需依赖专门的检测工具,降低了卡顿监测成本,使得卡顿监测操作简单、易于实现。另外,本公开实施例中,在卡顿监测的过程中,由于在获取到垂直同步信号后,通过创建的检测线程生成请求信号,基于该垂直同步信号的特性,进而可以提高卡顿检测的精度。
在一些实施方式中,所述目标线程包括至少一个函数调用栈;在确定发生卡顿之后,所述卡顿监控方法还包括:确定所述目标线程中发生卡顿的目标函数调用栈,并确定所述目标函数调用栈中发生卡顿的至少一个目标函数,如此不仅可以监测到是否发生了卡顿,还可以定位到引起卡顿发生的目标函数,进而为解决卡顿问题提供了依据。
示例性地,参见图4所示,在确定所述目标线程中发生卡顿的目标函数调用栈,并确定所述目标函数调用栈中发生卡顿的至少一个目标函数时,可以包括以下S104~106:
S104,获取所述目标线程的线程状态对象;所述线程状态对象包括程序计数器(program counter,PC)指针及链接寄存器(link Register,IR)指针;所述程序计数器指针用于存放所述至少一个函数调用栈的地址;所述链接寄存器指针用于存放所述函数调用栈的函数调用信息。
S105,根据所述程序计数器指针确定所述目标函数调用栈。
S106,基于所述目标函数调用栈以及所述链接寄存器指针,确定所述目标函数。
可以理解,目标线程需要在硬件架构下运行,而不同的硬件架构的运行栈帧的结构不同。其中iOS系统的程序运行在ARM架构之下,因此,本实施例中的栈帧结构为ARM架构运行的栈帧结构。也即,所述获取的目标线程的线程状态对象与该ARM架构下的栈帧结构相对应。因此,在获取到程序计数器指针之后,即可根据所述程序计数器指针确定所述目标线程运行的当前函数栈的地址,根据所述当前函数栈的地址,确定发生卡顿的目标函数栈,然后根据链接寄存器指针确定该目标函数栈中发生卡顿的目标函数。
需要说明的是,其他实施方式中,线程状态对象还可以包括栈帧(frame pointer,fp)指针以及堆栈(stack pointer,sp)指针。其中,fp指针用于指向当前函数栈帧的栈底,sp指针用于指向当前函数栈帧的栈顶。
可以理解,卡顿发生之后并不会立刻消失,可能会存在一段时间,而在在卡顿持续发生的过程中,目标线程可能持续运行了目标函数栈中的多个目标函数,因此,为了对导致发生卡顿的不同的目标函数的卡顿时间进行分析,以为后续对导致卡顿的目标函数进行修改提供依据,一些实施方式中,在确定所述目标函数之后,该卡顿监控方法还包括:
基于接收到的所述垂直同步信号的次数,对所述至少一个目标函数的卡顿时间进行分析,如此,通过对所述至少一个目标函数的卡顿时间进行分析,可以为开发者提供相应的分析指示,有利于开发者后续对目标函数进行优化。
示例性地,参见图5所示,在基于接收到的所述垂直同步信号的次数,对所述至少一个目标函数的卡顿时间进行分析时,可以包括以下S107~109:
S107,在再次获取到所述垂直同步信号的情况下,判断所述卡顿是否结束;若是,则执行步骤S202;若否,则继续执行步骤S107。
其中,在所述检测线程收到所述反馈信号的情况下,确定所述卡顿结束。
需要说明的是,在判断所述卡顿未结束的情况下,还记录当前目标函数所对应的垂直同步信号的次数。
S108,确定所述至少一个目标函数分别对应的所述垂直信号的次数。
S109,根据每个所述目标函数所对应的所述垂直信号的次数,以及在所述目标线程发生卡顿期间所接收到的所述垂直信号的总次数,确定每个所述目标函数的卡顿时间。
参见图6所示,在确定发生卡顿且定位到目标函数栈之后,若再次获取到所述垂直同步信号,会再次通过检测线程生成相应的请求信号并发送至目标线程,此时通过目标线程的线程状态对象可以确定导致当前卡顿的目标函数(具体过程参前述方法),例如,若通过PC指针和IR指针确定在获取到X次垂直同步信号时,目标线程都是运行第一目标函数,也即在执行第一目标函数所对应的耗时任务A,此时则记录第一目标函数对应垂直同步信号X次,同理,所通过PC指针和IR指针确定在获取到Y次垂直同步信号时,目标线程都是运行第二目标函数,也即在执行第二目标函数所对应的耗时任务B,此时则记录第二目标函数对应垂直同步信号Y次。因此,若卡顿持续总时间为T,则第一目标函数占用的卡顿时间为T*X/(X+Y)*100%,第二目标函数占用的卡顿时间为T*Y/(X+Y)*100%。
需要说明的是,在卡顿持续的过程中,目标线程还可能运行第三目标函数甚至第四目标函数,在此不做限定,对应的耗时分析方法和第一目标函数和第二目标函数类似,在此不再赘述。
另外,在对目标函数的卡顿时间进行分析之后,所述卡顿监控方法还可以包括以下(a)和(b):
(a)根据每个所述目标函数的卡顿时间,确定修改每个所述目标函数的优先级;其中,所述卡顿时间越短,所述优先级越高;
(b)基于所述优先级以及符号文件,确定所述目标函数发生卡顿的目标代码,并对所述目标代码进行修改。
本公开实施例中,由于卡顿时间越短,优先级越高,进而可以优先对卡顿时间较少的目标函数进行代码修改,如此,可以根据具体的卡顿时间占比,合理安排修复的先后顺序,进而提高目标代码的修复效率。
其中,符号文件(Symbol Files)是一个数据信息文件,它包含了应用程序二进制文件(比如:EXE、DLL等)调试信息,专门用于调试,最终生成的可执行文件在运行时并不需要这个符号文件,但程序中所有的变量信息都记录在该文件中。
在一些实施方式中,所述目标线程包括多个,在目标线程为子线程的情况下,以消息处理的子线程为例,子线程收到消息后往往需要经过解析原始数据、存储模型、建立索引,才能用于主线程的展示。若子线程的处理流程过长,也将影响用户的体验,因此也需要对子线程进行卡顿监测,但是由于子线程本来就存在耗时任务,例如,执行磁盘输入输出的任务,进而导致对子线程进行卡顿监控的过程中可能会将卡顿和原本执行正常的耗时任务之间进行混淆。
因此,为了避免对原本耗时的任务进行卡顿时间分析而浪费资源,在一些实施方式中,参见图7所示,在确定发生卡顿的目标函数之后,所述卡顿监控方法还包括以下S111~112:
S111,判断所述目标函数所对应的任务是否属于预设的目标任务;所述目标任务由所述目标线程的运行循环确定。
S112,在所述目标函数所对应的任务属于所述目标任务的情况下,对所述目标函数不进行耗时分析。
可以理解,由于每个子线程都有唯一一个与之对应的运行循环(Run Loop)对象,因此,可以获取子线程的Run Loop,并基于Run Loop确定目标任务。其中,目标任务也即上述子线程需要处理的耗时任务。基于前述方法,在确定目标函数后,需要进一步确定目标函数所对应的任务是否是目标任务。例如,若目标函数对应的是执行磁盘IO的任务,但对于该子线程,执行磁盘IO是正常的任务,而不是出现了真正的卡顿,此时可以对所述目标函数不进行耗时分析。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一技术构思,本公开实施例中还提供了与卡顿监控方法对应的卡顿监控装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述卡顿监控方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
参照图8所示,为本公开实施例提供的一种卡顿监控装置500的示意图,该卡顿监控装置500包括:
信号生成模块501,用于响应于接收到的垂直同步信号,通过创建的检测线程生成请求信号;通过显示链接对象的方式获取所述垂直同步信号,所述垂直同步信号用于指示前一帧画面的结束以及新一帧画面的开始;
信号发送模块502,用于通过所述检测线程将所述请求信号发送至目标线程;所述目标线程用于响应所述请求信号,并产生反馈信号发送至所述检测线程;
卡顿判断模块503,用于根据所述检测线程发出所述请求信号的发出时间以及所述检测线程接收到所述反馈信号的情况,确定所述目标线程是否发生卡顿。
在一种可能的实施方式中,卡顿判断模块503具体用于:
在确定所述检测线程发出所述请求信号的情况下,开始计时;
若在计时时间达到预设时间的情况下,所述检测线程未收到所述反馈信号,确定所述目标线程发生卡顿。
参见图9所示,在一种可能的实施方式中,所述卡顿监控装置还包括目标函数确定模块504,该目标函数确定模块504用于:
确定所述目标线程中发生卡顿的目标函数调用栈,并确定所述目标函数调用栈中发生卡顿的至少一个目标函数。
在一种可能的实施方式中,该目标函数确定模块504具体用于:
获取所述目标线程的线程状态对象;所述线程状态对象包括程序计数器指针及链接寄存器指针;所述程序计数器指针用于存放所述至少一个函数调用栈的地址;所述链接寄存器指针用于存放所述函数调用栈的函数调用信息;
根据所述程序计数器指针确定所述目标函数调用栈;
基于所述目标函数调用栈以及所述链接寄存器指针,确定所述目标函数。
在一种可能的实施方式中,所述卡顿监控装置还包括卡顿时间分析模块505,该卡顿时间分析模块505用于:
基于接收到的所述垂直同步信号的次数,对所述至少一个目标函数的卡顿时间进行分析。
在一种可能的实施方式中,该卡顿时间分析模块505具体用于:
在再次获取到所述垂直同步信号的情况下,判断所述卡顿是否结束;其中,在所述检测线程收到所述反馈信号的情况下,确定所述卡顿结束;
在所述卡顿结束的情况下,确定所述至少一个目标函数分别对应的所述垂直信号的次数;
根据每个所述目标函数所对应的所述垂直信号的次数,以及在所述目标线程发生卡顿期间所接收到的所述垂直信号的总次数,确定每个所述目标函数的卡顿时间。
根据第二方面,在一种可能的实施方式中,所述卡顿监控装置还包括代码修改模块506,该代码修改模块506用于:
根据每个所述目标函数的卡顿时间,确定修改每个所述目标函数的优先级;其中,所述卡顿时间越短,所述优先级越高;
基于所述优先级以及符号文件,确定所述目标函数发生卡顿的目标代码,并对所述目标代码进行修改。
在一种可能的实施方式中,所述目标线程包括多个,所述卡顿判断模块503具体用于:
断所述目标函数所对应的任务是否属于预设的目标任务;所述目标任务由所述目标线程的运行循环确定;
在所述目标函数所对应的任务属于所述目标任务的情况下,对所述目标函数不进行耗时分析。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
基于同一技术构思,本公开实施例还提供了一种电子设备。参照图10所示,为本公开实施例提供的电子设备700的结构示意图,包括处理器701、存储器702、和总线703。其中,存储器702用于存储执行指令,包括内存7021和外部存储器7022;这里的内存7021也称内存储器,用于暂时存放处理器701中的运算数据,以及与硬盘等外部存储器7022交换的数据,处理器701通过内存7021与外部存储器7022进行数据交换。
本申请实施例中,存储器702具体用于存储执行本申请方案的应用程序代码,并由处理器701来控制执行。也即,当电子设备700运行时,处理器701与存储器702之间通过总线703通信,使得处理器701执行存储器702中存储的应用程序代码,进而执行前述任一实施例中所述的方法。
其中,存储器702可以是,但不限于,随机存取存储器(Random Access Memory,RAM),只读存储器(Read Only Memory,ROM),可编程只读存储器(Programmable Read-Only Memory,PROM),可擦除只读存储器(Erasable Programmable Read-Only Memory,EPROM),电可擦除只读存储器(Electric Erasable Programmable Read-Only Memory,EEPROM)等。
处理器701可能是一种集成电路芯片,具有信号的处理能力。上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(NetworkProcessor,NP)等;还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
可以理解的是,本申请实施例示意的结构并不构成对电子设备700的具体限定。在本申请另一些实施例中,电子设备700可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中的卡顿监控方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中的卡顿监控方法的步骤,具体可参见上述方法实施例,在此不再赘述。
其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。