CN110874301A - 程序卡顿信息的获取方法和装置 - Google Patents
程序卡顿信息的获取方法和装置 Download PDFInfo
- Publication number
- CN110874301A CN110874301A CN201811005036.3A CN201811005036A CN110874301A CN 110874301 A CN110874301 A CN 110874301A CN 201811005036 A CN201811005036 A CN 201811005036A CN 110874301 A CN110874301 A CN 110874301A
- Authority
- CN
- China
- Prior art keywords
- stack
- address
- ebp
- main thread
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3051—Monitoring arrangements for monitoring the configuration of the computing system or of the computing system component, e.g. monitoring the presence of processing resources, peripherals, I/O links, software programs
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Financial Or Insurance-Related Operations Such As Payment And Settlement (AREA)
Abstract
本发明公开了一种程序卡顿信息的获取方法和装置。其中,该方法包括:在检测到程序出现卡顿的情况下,获取该程序的主线程的堆栈信息,其中,该堆栈信息包括:该主线程的堆栈中存储的扩展基址指针EBP;根据该EBP获取该主线程的堆栈中存储的目标函数的返回地址,其中,该目标函数的返回地址在该堆栈中的存储地址与该EBP在该堆栈中的存储地址相隔预定值;将该目标函数的返回地址作为卡顿信息发送给网络侧设备。通过本发明,解决了相关技术中在检测到程序出现卡顿的情况下,程序卡顿信息的获取效率较低的技术问题,进而达到了提高程序卡顿信息的获取效率的技术效果。
Description
技术领域
本发明涉及计算机领域,具体而言,涉及一种程序卡顿信息的获取方法和装置。
背景技术
相关技术中通过加载微软提供的dbgHelp.dll,通过其提供的应用程序编程接口(Application Programming Interface,简称为API)获取线程的函数堆栈。
但是通过API获取线程的函数堆栈时,除了获取函数返回地址外,还必然获取了很多无用信息,例如,线程堆栈中的参数信息、线程堆栈中的函数体中的局部变量等,这些信息对分析程序卡顿没有用处,进而导致在检测到程序出现卡顿的情况下,获取程序卡顿信息的效率较低。
针对上述的问题,目前尚未提出有效的解决方案。
发明内容
本发明实施例提供一种程序卡顿信息的获取方法和装置,以至少解决相关技术中在检测到程序出现卡顿的情况下,程序卡顿信息的获取效率较低的技术问题。
根据本发明实施例的一个方面,提供了一种程序卡顿信息的获取方法,包括:在检测到程序出现卡顿的情况下,获取所述程序的主线程的堆栈信息,其中,所述堆栈信息包括:所述主线程的堆栈中存储的扩展基址指针EBP;根据所述EBP获取所述主线程的堆栈中存储的目标函数的返回地址,其中,所述目标函数的返回地址在所述堆栈中的存储地址与所述EBP在所述堆栈中的存储地址相隔预定值;将所述目标函数的返回地址作为卡顿信息发送给网络侧设备。
根据本发明实施例的另一方面,还提供了一种程序卡顿信息的获取装置,包括:第一获取单元,用于在检测到程序出现卡顿的情况下,获取所述程序的主线程的堆栈信息,其中,所述堆栈信息包括:所述主线程的堆栈中存储的扩展基址指针EBP;第二获取单元,用于根据所述EBP获取所述主线程的堆栈中存储的目标函数的返回地址,其中,所述目标函数的返回地址在所述堆栈中的存储地址与所述EBP在所述堆栈中的存储地址相隔预定值;发送单元,用于将所述目标函数的返回地址作为卡顿信息发送给网络侧设备。
根据本发明实施例的又一方面,还提供了一种存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述方法。
根据本发明实施例的又一方面,还提供了一种电子装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,上述处理器通过计算机程序执行上述的方法。
在本发明实施例中,采用在检测到程序出现卡顿的情况下,获取该程序的主线程的堆栈信息,其中,该堆栈信息包括:该主线程的堆栈中存储的扩展基址指针EBP;根据该EBP获取该主线程的堆栈中存储的目标函数的返回地址,其中,该目标函数的返回地址在该堆栈中的存储地址与该EBP在该堆栈中的存储地址相隔预定值;将该目标函数的返回地址作为卡顿信息发送给网络侧设备。
也就是说,根据主线程的堆栈中存储的扩展基址指针EBP和主线程的堆栈中存储的目标函数的返回地址的存储地址的关系,获取目标函数的返回地址作为程序的卡顿信息发送给网络侧设备,而不是依次获取程序的主线程的堆栈中的各个压入参数后,从中获取目标函数的返回地址,进而解决了相关技术中在检测到程序出现卡顿的情况下,程序卡顿信息的获取效率较低的技术问题,进而达到了提高程序卡顿信息的获取效率的技术效果。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的一种程序卡顿信息的获取方法的应用环境的示意图;
图2是根据本发明实施例的一种可选的程序卡顿信息的获取方法的流程示意图;
图3是根据本发明实施例的一种可选的程序卡顿信息的获取方法的示意图;
图4是根据本发明实施例的一种可选的堆栈结构示意图;
图5是根据本发明实施例的另一种可选的堆栈结构示意图;
图6是根据本发明实施例的一种可选的程序卡顿信息的获取的结构示意图;
图7是根据本发明又一种可选实施例的程序卡顿信息的获取装置结构框图;
图8是根据本发明实施例的一种可选的电子装置的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
根据本发明实施例的一个方面,提供了一种程序卡顿信息的获取方法。可选地,上述程序卡顿信息的获取方法可以但不限于应用于如图1所示的应用环境中。
如图1所示,客户端101运行应用(例如社交应用)时,在启动该应用的同时启动卡顿检测线程(例如,卡顿检测线程可以包括:通过获取应用在运行的过程中调用的函数,将调用的函数对应到代码行,以确定是哪一段代码出现问题导致卡顿,其中,在该应用环境中,涉及到的函数调用的方式可以为单个函数的调用,也可以是多个函数的嵌套式调用,可根据运行的应用的功能确定,在此,不做限定),当检测到程序卡顿时,将卡顿信息(调用的函数地址)通过网络发送至网络侧设备102进行卡顿分析,进而可以对应用进行优化。
可选地,在本实施例中,上述客户端可以包括但不限于以下至少之一:手机、平板电脑等。
上述无线网络包括:蓝牙、WIFI及其他实现无线通信的网络。上述只是一种示例,本实施例对此不做任何限定。
下面对本实施例中涉及到的术语进行介绍。
堆栈或者调用栈(callstack):是计算机中用于存储线程相关的信息的结构。
卡顿:是程序在短时间(例如,200ms内)无响应,用户略有感知或无感知。
扩展基址指针寄存器(extended base pointer,简称为EBP):其内存放一个指针,该指针指向系统栈最上面一个栈帧的底部。
扩展栈寄存器(Extended stack pointer,简称为ESP)为栈指针,用于指向栈的栈顶(下一个压入栈的活动记录的顶部)。
线程:线程是独立调度和分派的基本单位。
主线程:当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程。
消息:在操作系统(例如,Windows)中发生的一切都可以用消息来表示,消息用于告诉操作系统发生了什么,所有的操作系统(例如,Windows)应用程序都是消息驱动的。
可选地,在本实施例中,作为一种可选的实施方式,如图2所示,上述程序卡顿信息的获取方法可以包括:
S202,在检测到程序出现卡顿的情况下,获取该程序的主线程的堆栈信息;
需要说明的是,上述堆栈信息包括但并不限于:上述主线程的堆栈中存储的扩展基址指针(extended base pointer,简称为EBP);
S204,根据该EBP获取该主线程的堆栈中存储的目标函数的返回地址;
需要说明的是,上述目标函数的返回地址在该堆栈中的存储地址与该EBP在该堆栈中的存储地址相隔预定值;
S206,将该目标函数的返回地址作为卡顿信息发送给网络侧设备。
可选地,上述程序卡顿信息的获取方法可以但不限于应用在使用时卡顿优化的过程中,例如,个人电脑网页版应用的卡顿优化、手机应用的卡顿优化等。上述仅是示例,本实施例中对此不做任何限定。
需要说明的是,上述应用可以包括多种类型,例如,社交应用、运动应用、学习应用等。
在上述应用在使用时卡顿优化的过程中,在检测到程序出现卡顿的情况下,获取该程序的主线程的堆栈信息,其中,该堆栈信息包括:该主线程的堆栈中存储的扩展基址指针EBP;根据该EBP获取该主线程的堆栈中存储的目标函数的返回地址,其中,该目标函数的返回地址在该堆栈中的存储地址与该EBP在该堆栈中的存储地址相隔预定值;将该目标函数的返回地址作为卡顿信息发送给网络侧设备。
也就是说,根据主线程的堆栈中存储的扩展基址指针EBP和主线程的堆栈中存储的目标函数的返回地址的存储地址的关系,获取目标函数的返回地址作为程序的卡顿信息发送给网络侧设备,而不是依次获取程序的主线程的堆栈中的各个压入参数后,从中获取目标函数的返回地址,进而解决了相关技术中在检测到程序出现卡顿的情况下,程序卡顿信息的获取效率较低的技术问题,进而达到了提高程序卡顿信息的获取效率的技术效果。
可选地,上述主线程的堆栈中存储的扩展基址指针EBP包括但并不限于:一个或多个。
在上述EBP包括第一EBP、第二EBP、第三EBP时,该多个EBP形成一个调用链,通过该调用链之间的关系,在获取到第一EBP之后,可以分别获取第二EBP、第三EBP。
例如,第一EBP的值被设置为第二EBP的地址,第二EBP的值被设置为第三EBP的地址,这样在使用第一EBP时可以知道第二EBP的地址,在使用第二EBP时可以知道第三EBP的地址,形成一个EBP调用链,通过该EBP调用链在获取到第一EBP之后,可以进一步分别获取第二EBP、第三EBP等。
可选地,获取上述程序的主线程的堆栈信息的方法可以包括多种,例如,可以通过上述EBP调用链获取一个或多个EBP,也可以是通过堆栈在压栈的过程中每一EBP之间相隔的比特位,依次读取一个或多个EBP。
例如,以32位操作系统为例,在压栈的过程中,记录第一EBP的位置,以及第一EBP、第二EBP以及第三EBP之间互相相隔的比特位,在获取到第一EBP的位置后,根据相隔的比特位分别获取第二EBP、第三EBP。
可选地,在根据所述EBP获取所述主线程的堆栈中存储的目标函数的返回地址时所涉及到的预定值可以根据操作系统的位数确定。
例如,在操作系统的位数为32位时,上述预定值为4,在操作系统的位数为16位时,上述预定值2。上述仅是示例,本实施例中对此不做任何限定。
可选地,在本实施例中,上述EBP的个数和上述目标函数的个数可以相同也可以不同,可以根据堆栈的具体结构确定。
可选地,在本实施例中,上述目标函数可以是单函数也可以是嵌套式函数。
例如,以嵌套式函数为例,假设在程序的主线程的堆栈中存在3个函数A、B、C,其中,函数A调用函数B,函数B调用C,通过该3个函数的嵌套式调用实现应用的某部分功能。
可选地,在本实施例中,检测程序出现卡顿的方法包括多个,其中包括但并不限于以下方式:
方式一、向该主线程发送检测消息;在该主线程在预定时长内未响应该检测消息的情况下,确定出该程序出现卡顿;
方式二、通过判断界面绘制帧率判断卡顿;
方式三、通过指定软件周期性获取程序运行时各项参数,如果各项参数不达标,则认为可能出现卡顿。
需要说明的是,检测程序出现卡顿的方法仅仅是作为一种示例,本实施例对此不做任何限定。
可选地,在本实施例中,将所述程序的卡顿信息发送给网络侧设备之后,网络侧设备可根据程序的卡顿信息包括的目标函数的返回地址,定位到发生卡顿的代码行,便于查看相关的星系信息,进而可以帮忙持续优化程序质量,提高程序的运行效率。
下面结合具体示例,对本实施例进行举例说明。
在本示例中提供了一种程序卡顿信息的获取方法,主要包括以下步骤:
步骤S11,程序启动时拉起检测线程,检测主线程是否卡顿。
可选地,上述步骤S11可以通过以下方式实现:
如图3所示,在假死检测线程中每隔(100~300ms,视机器性能而定),对主线程发消息进行检测,若主线程超时无响应,则认为程序发生卡顿。
步骤S12,检测到发生卡顿时,获取主线程当前的线程标识数据。
可选地,上述步骤S12可以通过以下方式实现:
当检测到主线程发生卡顿时,获取主线程的EBP(栈底指针),ESP(栈顶指针)和栈的大小。
其中,线程堆栈结构如图4所示,可以包括多个EBP、目标函数返回地址(和图4中的Ret Addr对应)、参数(和图4中Parameters对应)以及局部变量(和图4中的……对应),其中,图4所示的堆栈从高地址向低地址方向生长,多个EBP之间实际形成了一个调用链,例如第一个EBP指向第二个EBP,该第二个EBP指向第三个EBP,每一个EBP与目标函数的返回地址之间相隔预定值(例如,4比特)。
每次调用函数时候,先压参数,再压入函数返回地址。接着压入当前EBP,当前ESP指向EBP,接着就是函数体中的局部变量压入栈中。
从以上过程可以看出EBP实际形成了一个调用链,并且将EBP+4,就能取到目标函数的返回地址(也就是返回之后要执行的下一条语句),通过回溯EBP,就能够获取完整调用堆栈。
步骤S13,拷贝线程栈信息,单独分析。
可选地,上述步骤S13可以通过以下方式实现:
获取到主线程堆栈的大小和地址后,对主线的整个堆栈进行拷贝操作,拷贝到自己分配的内存中,然后对堆栈内容进行分析。
分析过程,首先计算出主线程EBP和ESP相对于主线程原堆栈的偏移值,然后通过该偏移值,计算出拷贝后的堆栈中,EBP和ESP指针的位置。
例如,在图5中,原始堆栈的基站地址为0x20000,EBP指针地址为0x15000,ESP指针地址为0x10000,通过计算与基地址的偏移值,得出拷贝后的EBP和ESP指针的地址,其中,拷贝后堆栈的基站地址为0x40000,EBP指针地址为0x35000,ESP指针地址为0x30000。
然后根据EBP指针逐层回溯,并且通过每一层EBP得到的函数返回地址,直到回溯到栈顶,我们就可以得到一个完整的函数调用栈。
步骤S14,分析线程栈数据,并且对相关的数据进行统计,便于对程序效率做持续的优化。
在一个可选地实施方式中,上述获取该程序的主线程的堆栈信息包括以下步骤:
步骤S21,重复执行以下步骤,直到当前EBP为空指针;
将该当前EBP设置为该目标EBP;在该堆栈中获取在该当前EBP所指向的地址上存储的EBP,将该当前EBP更新为该获取到的EBP;
需要说明的是,上述当前EBP被初始化为该主线程的堆栈中存储在最靠栈底的位置上的第一EBP,该堆栈信息包括的EBP包括目标EBP。
可选地,在本实施例中,上述目标EBP的个数可以包括多个,该多个EBP之间存在一定的调用关系。
例如,上述多个目标EBP包括第一EBP、第二EBP、第三EBP等,其中,该多个EBP之间存在调用关系形成一个调用链,例如,第一EBP的值被设置为第二EBP的地址(即,第一EBP指向第二EBP),第二EBP的值被设置为第三EBP的地址(即,第二EBP指向第三EBP),这样在使用第一EBP时可以知道第二EBP的地址,在使用第二EBP时可以知道第三EBP的地址,方便了整个堆栈信息的获取。
在上述步骤S21中,通过各个BEP之间的调用关系,然后以遍历的方式获取一个或多个目标EBP,进而达到了能够高效的获取完整的堆栈信息的技术效果。
可选地,获取该程序的主线程的堆栈信息包括以下步骤:
步骤S31,通过调用预定的API接口获取到上述第一EBP,或者,
步骤S32,通过调用预定的API接口获取上述第一EBP在上述堆栈中的存储地址。
可选地,在本实施例中,上述API接口是系统(微软)提供的开放接口,可以通过该API接口获取堆栈中的第一EBP的存储地址。
可选地,上述第一EBP可以在主线程的堆栈中存储在最靠栈底的位置上,也可以在主线程的堆栈中存储在最靠栈底的位置偏移一定地址的位置上。
例如,上述第一EBP在主线程的堆栈中存储在最靠栈底的位置偏移4*N,或者2*N的位置上,其中,N为正整数。
在上述步骤S31至步骤S32中,通过API接口获取堆栈中的第一EBP的存储地址,进而为获取其他目标EBP提供了基础,提高了获取上述程序的主线程的堆栈信息的效率。
在一个可选地实施方式中,上述根据该EBP获取该主线程的堆栈中存储的目标函数的返回地址包括以下步骤:
步骤S41,将每个该目标EBP在该堆栈中的存储地址加上或减去该预定值,得到该目标函数的返回地址在该堆栈中的存储地址;
步骤S42,在该目标函数的返回地址在该堆栈中的存储地址上,获取存储的该目标函数的返回地址。
可选地,在本实施例中,将每个目标EBP在堆栈中的存储地址加上还是减去该预定值,可以根据上述堆栈的压栈方式。
以图4所示的堆栈结构为例,在主线程的堆栈中存储在最靠栈底的位置上的第一EBP的存储地址加上4(即EBP+4),即可得到该目标函数的返回地址在该堆栈中的存储地址,即图4中与在主线程的堆栈中存储在最靠栈底的位置上的第一EBP的存储地址相邻的目标函数的返回地址在该堆栈中的存储地址(Ret Addr)。
又例如,若堆栈的压栈方式和图4相反,那么在主线程的堆栈中存储在最靠栈顶的位置上的第一EBP的存储地址减去4(即EBP-4),即可得到该目标函数的返回地址在该堆栈中的存储地址。
需要说明的是,上述在主线程的堆栈中存储在最靠栈底/栈顶的位置上的第一EBP的存储地址加上/减去的值可根据操作系统的位数确定,在此不作限定。
例如,与上述示例对应的情况有以下两种:
在主线程的堆栈中存储在最靠栈底的位置上的第一EBP的存储地址加上2(即EBP+2),即可得到该目标函数的返回地址在该堆栈中的存储地址。
又例如,在主线程的堆栈中存储在最靠栈顶的位置上的第一EBP的存储地址减去2(即EBP-2),即可得到该目标函数的返回地址在该堆栈中的存储地址。
在上述步骤S41至步骤S42中,通过EBP和目标函数的返回地址之间的地址关系,就能够高效的确定目标函数的返回地址,进一步提高了后续卡顿分析的效率。
在一个可选地实施方式中,在该获取该程序的主线程的堆栈信息之前,上述方法还包括以下步骤:
步骤S51,获取上述主线程的原始堆栈的大小和该原始堆栈的地址;
步骤S52,根据该原始堆栈的大小和该原始堆栈的地址,将该原始堆栈拷贝到内存中,得到目标堆栈;
其中,需要说明的是,上述目标堆栈的大小与该原始堆栈的大小相同,该目标堆栈的地址与该原始堆栈的地址相隔偏移值。
进一步需要说明的是,上述主线程的堆栈中存储的扩展基址指针EBP为该目标堆栈中存储的EBP,该目标堆栈中存储的EBP的地址与该原始堆栈中存储的EBP的地址相隔该偏移值。
例如,如图5所示,原始堆栈的基栈地址为0x20000,EBP指针地址为0x15000,ESP指针地址为0x10000,通过计算与基地址的偏移值,得出拷贝后的EBP和ESP指针的地址,其中,拷贝后堆栈的基栈地址为0x40000,EBP指针地址为0x35000,ESP指针地址为0x30000。
可选地,在本实施例中,上述内存可以是预先申请用于卡顿分析的空闲内存,也可以是临时申请的用于用于卡顿分析的空闲内存。
在上述步骤S51至步骤S52中,通过根据原始堆栈的大小和原始堆栈的地址,将该原始堆栈拷贝到内存中,得到目标堆栈,使得不中断主线程的正常运行的情况下,对主线程堆栈拷贝作离线分析,进一步使得数据更准确。
在一个可选的实施方式中,在该获取该程序的主线程的堆栈信息之前,上述方法还包括以下步骤:
步骤S61,向该主线程发送检测消息;
步骤S62,在该主线程在预定时长内未响应该检测消息的情况下,确定出该程序出现卡顿。
可选地,上述检测消息包括但并不限于:postMessage。
可选地,在本实施例中,上述预定时长可以为100ms~300ms的任意取值,可以视机器性能而定,在此,不做限定。
可选地,在本实施例中,确定程序出现卡顿的方法除了可以通过检测消息的方式外,还可以通过判断界面绘制帧率判断卡顿。
例如,在界面帧率不满足预定条件时,则判断程序出现卡顿,若界面帧率满足预定条件,则判断程序未出现卡顿。
通过上述步骤S61至上述步骤S62,在确定出该程序出现卡顿的情况下,才获取卡顿信息,提高了卡顿信息的获取效率。
总之,通过本实施例提供的上述方法比现有技术中提供的普通方案有更高的效率,获取堆栈的速度在3ms左右,并且对主线程影响及其微小。
另外,通过本实施例提供的上述方法比现有技术有更好的准确率,由于不能中断主线程的正常运行,普通方案耗时高,所以主线程在这段时间会继续运行,导致获取堆栈准确率下降。新方案耗时短,并且对主线程堆栈拷贝作离线分析,数据更准确。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例的方法。
根据本发明实施例的另一个方面,还提供了一种程序卡顿信息的获取装置。可选地,上述程序卡顿信息的获取装置可以但不限于应用于如图1所示的应用环境中。
如图1所示,客户端101运行应用(例如社交应用)时,在启动该应用的同时启动卡顿检测线程(例如,卡顿检测线程可以包括:通过获取应用在运行的过程中调用的函数,将调用的函数对应到代码行,以确定是哪一段代码出现问题导致卡顿,其中,在该应用环境中,涉及到的函数调用的方式可以为单个函数的调用,也可以是多个函数的嵌套式调用,可根据运行的应用的功能确定,在此,不做限定),当检测到程序卡顿时,将卡顿信息(调用的函数地址)通过网络发送至网络侧设备102进行卡顿分析,进而可以对应用进行优化。
可选地,在本实施例中,上述客户端可以包括但不限于以下至少之一:手机、平板电脑等。
上述无线网络包括:蓝牙、WIFI及其他实现无线通信的网络。上述只是一种示例,本实施例对此不做任何限定。
下面对本实施例中涉及到的术语进行介绍。
堆栈或者调用栈(callstack):是计算机中用于存储线程相关的信息的结构。
卡顿:是程序在短时间(例如,200ms内)无响应,用户略有感知或无感知。
扩展基址指针寄存器(extended base pointer,简称为EBP):其内存放一个指针,该指针指向系统栈最上面一个栈帧的底部。
扩展栈寄存器(Extended stack pointer,简称为ESP)为栈指针,用于指向栈的栈顶(下一个压入栈的活动记录的顶部)。
线程:线程是独立调度和分派的基本单位。
主线程:当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程。
消息:在操作系统(例如,Windows)中发生的一切都可以用消息来表示,消息用于告诉操作系统发生了什么,所有的操作系统(例如,Windows)应用程序都是消息驱动的。
根据本发明实施例的一个方面,如图6所示,上述程序卡顿信息的获取装置包括:
1)第一获取单元62,用于在检测到程序出现卡顿的情况下,获取该程序的主线程的堆栈信息;
需要说明的是,上述堆栈信息包括但并不限于:上述主线程的堆栈中存储的扩展基址指针EBP;
2)第二获取单元64,用于根据该EBP获取该主线程的堆栈中存储的目标函数的返回地址;
需要说明的是,上述目标函数的返回地址在该堆栈中的存储地址与该EBP在该堆栈中的存储地址相隔预定值;
3)第一发送单元66,用于将该目标函数的返回地址作为卡顿信息发送给网络侧设备。
可选地,上述程序卡顿信息的获取装置可以但不限于应用在使用时卡顿优化的过程中,例如,个人电脑网页版应用的卡顿优化、手机应用的卡顿优化等。上述仅是示例,本实施例中对此不做任何限定。
需要说明的是,上述应用可以包括多种类型,例如,社交应用、运动应用、学习应用等。
在上述应用在使用时卡顿优化的过程中,在检测到程序出现卡顿的情况下,获取该程序的主线程的堆栈信息,其中,该堆栈信息包括:该主线程的堆栈中存储的扩展基址指针EBP;根据该EBP获取该主线程的堆栈中存储的目标函数的返回地址,其中,该目标函数的返回地址在该堆栈中的存储地址与该EBP在该堆栈中的存储地址相隔预定值;将该程序的卡顿信息发送给网络侧设备,其中,该程序的卡顿信息包括该目标函数的返回地址。
也就是说,根据主线程的堆栈中存储的扩展基址指针EBP和主线程的堆栈中存储的目标函数的返回地址的存储地址的关系,获取目标函数的返回地址作为程序的卡顿信息发送给网络侧设备,而不是依次获取程序的主线程的堆栈中的各个压入参数后,从中获取目标函数的返回地址,进而解决了相关技术中在检测到程序出现卡顿的情况下,程序卡顿信息的获取效率较低的技术问题,进而达到了提高程序卡顿信息的获取效率的技术效果。
可选地,上述主线程的堆栈中存储的扩展基址指针EBP包括但并不限于:一个或多个。
在上述EBP包括第一EBP、第二EBP、第三EBP时,该多个EBP形成一个调用链,通过该调用链之间的关系,在获取到第一EBP之后,可以分别获取第二EBP、第三EBP。
例如,第一EBP的值被设置为第二EBP的地址,第二EBP的值被设置为第三EBP的地址,这样在使用第一EBP时可以知道第二EBP的地址,在使用第二EBP时可以知道第三EBP的地址,形成一个EBP调用链,通过该EBP调用链在获取到第一EBP之后,可以进一步分别获取第二EBP、第三EBP等。
可选地,获取上述程序的主线程的堆栈信息的方法可以包括多种,例如,可以通过上述EBP调用链获取一个或多个EBP,也可以是通过堆栈在压栈的过程中每一EBP之间相隔的比特位,依次读取一个或多个EBP。
例如,以32位操作系统为例,在压栈的过程中,记录第一EBP的位置,以及第一EBP、第二EBP以及第三EBP之间互相相隔的比特位,在获取到第一EBP的位置后,根据相隔的比特位分别获取第二EBP、第三EBP。
可选地,在根据所述EBP获取所述主线程的堆栈中存储的目标函数的返回地址时所涉及到的预定值可以根据操作系统的位数确定。
例如,在操作系统的位数为32位时,上述预定值为4,在操作系统的位数为16位时,上述预定值2。上述仅是示例,本实施例中对此不做任何限定。
可选地,在本实施例中,上述EBP的个数和上述目标函数的个数可以相同也可以不同,可以根据堆栈的具体结构确定。
可选地,在本实施例中,上述目标函数可以是单函数也可以是嵌套式函数。
例如,以嵌套式函数为例,假设在程序的主线程的堆栈中存在3个函数A、B、C,其中,函数A调用函数B,函数B调用C,通过该3个函数的嵌套式调用实现应用的某部分功能。
可选地,在本实施例中,检测程序出现卡顿的方法包括多个,其中包括但并不限于以下方式:
方式一、向该主线程发送检测消息;在该主线程在预定时长内未响应该检测消息的情况下,确定出该程序出现卡顿;
方式二、通过判断界面绘制帧率判断卡顿;
方式三、通过指定软件周期性获取程序运行时各项参数,如果各项参数不达标,则认为可能出现卡顿。
需要说明的是,检测程序出现卡顿的方法仅仅是作为一种示例,本实施例对此不做任何限定。
可选地,在本实施例中,将所述程序的卡顿信息发送给网络侧设备之后,网络侧设备可根据程序的卡顿信息包括的目标函数的返回地址,定位到发生卡顿的代码行,便于查看相关的星系信息,进而可以帮忙持续优化程序质量,提高程序的运行效率。
下面结合具体示例,对本实施例进行举例说明。
在本示例中提供了一种程序卡顿信息的获取方法,主要包括以下步骤:
步骤S11,程序启动时拉起检测线程,检测主线程是否卡顿。
可选地,上述步骤S11可以通过以下方式实现:
如图3所示,在假死检测线程中每隔(100~300ms,视机器性能而定),对主线程发消息进行检测,若主线程超时无响应,则认为程序发生卡顿(具体参见步骤S301至步骤S303)。
步骤S12,检测到发生卡顿时,获取主线程当前的线程标识数据。
可选地,上述步骤S12可以通过以下方式实现:
当检测到主线程发生卡顿时,获取主线程的EBP(栈底指针),ESP(栈顶指针)和栈的大小。
其中,线程堆栈结构如图4所示,可以包括多个EBP、目标函数返回地址(和图4中的Ret Addr对应)、参数(和图4中Parameters对应)以及局部变量(和图4中的……对应),其中,图4所示的堆栈从高地址向低地址方向生长,多个EBP之间实际形成了一个调用链,例如第一个EBP指向第二个EBP,该第二个EBP指向第三个EBP,每一个EBP与目标函数的返回地址之间相隔预定值(例如,4比特)。
每次调用函数时候,先压参数,再压入函数返回地址。接着压入当前EBP,当前ESP指向EBP,接着就是函数体中的局部变量压入栈中。
从以上过程可以看出EBP实际形成了一个调用链,并且将EBP+4,就能取到目标函数的返回地址(也就是返回之后要执行的下一条语句),通过回溯EBP,就能够获取完整调用堆栈。
步骤S13,拷贝线程栈信息,单独分析。
可选地,上述步骤S13可以通过以下方式实现:
获取到主线程堆栈的大小和地址后,对主线的整个堆栈进行拷贝操作,拷贝到自己分配的内存中,然后对堆栈内容进行分析。
分析过程,首先计算出主线程EBP和ESP相对于主线程原堆栈的偏移值,然后通过该偏移值,计算出拷贝后的堆栈中,EBP和ESP指针的位置。
例如,在图5中,原始堆栈的基站地址为0x20000,EBP指针地址为0x15000,ESP指针地址为0x10000,通过计算与基地址的偏移值,得出拷贝后的EBP和ESP指针的地址,其中,拷贝后堆栈的基站地址为0x40000,EBP指针地址为0x35000,ESP指针地址为0x30000。
然后根据EBP指针逐层回溯,并且通过每一层EBP得到的函数返回地址,直到回溯到栈顶,我们就可以得到一个完整的函数调用栈。
步骤S14,分析线程栈数据,并且对相关的数据进行统计,便于对程序效率做持续的优化。
在一个可选地实施方式中,上述第一获取单元62还用于重复执行以下步骤,直到当前EBP为空指针;
将该当前EBP设置为该目标EBP;在该堆栈中获取在该当前EBP所指向的地址上存储的EBP,将该当前EBP更新为该获取到的EBP。
需要说明的是,上述当前EBP被初始化为该主线程的堆栈中存储在最靠栈底的位置上的第一EBP,该堆栈信息包括的EBP包括目标EBP。
可选地,在本实施例中,上述目标EBP的个数可以包括多个,该多个EBP之间存在一定的调用关系。
例如,上述多个目标EBP包括第一EBP、第二EBP、第三EBP等,其中,该多个EBP之间存在调用关系形成一个调用链,例如,第一EBP的值被设置为第二EBP的地址(即,第一EBP指向第二EBP),第二EBP的值被设置为第三EBP的地址(即,第二EBP指向第三EBP),这样在使用第一EBP时可以知道第二EBP的地址,在使用第二EBP时可以知道第三EBP的地址,方便了整个堆栈信息的获取。
上述第一获取单元62利用各个BEP之间的调用关系,然后以遍历的方式获取一个或多个目标EBP,进而达到了能够高效的获取完整的堆栈信息的技术效果。
在一个可选地实施方式中,上述第一获取单元62还用于通过调用预定的API接口获取到该第一EBP,或者,
上述第一获取单元62还用于通过调用预定的API接口获取到第一EBP在该堆栈中的存储地址。
可选地,在本实施例中,上述API接口是系统(微软)提供的开放接口,可以通过该API接口获取堆栈中的第一EBP的存储地址。
可选地,上述第一EBP可以在主线程的堆栈中存储在最靠栈底的位置上,也可以在主线程的堆栈中存储在最靠栈底的位置偏移一定地址的位置上。
例如,上述第一EBP在主线程的堆栈中存储在最靠栈底的位置偏移4*N,或者2*N的位置上,其中,N为正整数。
上述第一获取单元62通过API接口获取堆栈中的第一EBP的存储地址,进而为获取其他目标EBP提供了基础,提高了获取上述程序的主线程的堆栈信息的效率。
在一个可选地实施方式中,图7是根据本发明又一种可选实施例的程序卡顿信息的获取装置结构框图,如图7所示,第二获取单元64包括:
1)第一获取模块72,用于将每个该目标EBP在该堆栈中的存储地址加上或减去该预定值,得到该目标函数的返回地址在该堆栈中的存储地址;
2)第二获取模块74,用于在该目标函数的返回地址在该堆栈中的存储地址上,获取存储的该目标函数的返回地址。
可选地,在本实施例中,将每个目标EBP在堆栈中的存储地址加上还是减去该预定值,可以根据上述堆栈的压栈方式。
以图4所示的堆栈结构为例,在主线程的堆栈中存储在最靠栈底的位置上的第一EBP的存储地址加上4(即EBP+4),即可得到该目标函数的返回地址在该堆栈中的存储地址,即图4中与在主线程的堆栈中存储在最靠栈底的位置上的第一EBP的存储地址相邻的目标函数的返回地址在该堆栈中的存储地址(Ret Addr)。
又例如,若堆栈的压栈方式和图4相反,那么在主线程的堆栈中存储在最靠栈顶的位置上的第一EBP的存储地址减去4(即EBP-4),即可得到该目标函数的返回地址在该堆栈中的存储地址。
需要说明的是,上述在主线程的堆栈中存储在最靠栈底/栈顶的位置上的第一EBP的存储地址加上/减去的值可根据操作系统的位数确定,在此不作限定。
例如,与上述示例对应的情况有以下两种:
在主线程的堆栈中存储在最靠栈底的位置上的第一EBP的存储地址加上2(即EBP+2),即可得到该目标函数的返回地址在该堆栈中的存储地址。
又例如,在主线程的堆栈中存储在最靠栈顶的位置上的第一EBP的存储地址减去2(即EBP-2),即可得到该目标函数的返回地址在该堆栈中的存储地址。
通过图7所示装置,通过EBP和目标函数的返回地址之间的地址关系,就能够高效的确定目标函数的返回地址,进一步提高了后续卡顿分析的效率。
在一个可选地实施方式中,本发明还提供了一种可选实施例的程序卡顿信息的获取装置该装置除了包括如图6所示的单元外,还包括:第三获取单元,用于在该获取该程序的主线程的堆栈信息之前,获取该主线程的原始堆栈的大小和该原始堆栈的地址;第四获取单元,用于根据该原始堆栈的大小和该原始堆栈的地址,将该原始堆栈拷贝到内存中,得到目标堆栈。
其中,需要说明的是,上述目标堆栈的大小与该原始堆栈的大小相同,该目标堆栈的地址与该原始堆栈的地址相隔偏移值。
进一步需要说明的是,上述主线程的堆栈中存储的扩展基址指针EBP为该目标堆栈中存储的EBP,该目标堆栈中存储的EBP的地址与该原始堆栈中存储的EBP的地址相隔该偏移值。
例如,如图5所示,原始堆栈的基栈地址为0x20000,EBP指针地址为0x15000,ESP指针地址为0x10000,通过计算与基地址的偏移值,得出拷贝后的EBP和ESP指针的地址,其中,拷贝后堆栈的基栈地址为0x40000,EBP指针地址为0x35000,ESP指针地址为0x30000。
可选地,在本实施例中,上述内存可以是预先申请用于卡顿分析的空闲内存,也可以是临时申请的用于用于卡顿分析的空闲内存。
在上述装置,通过根据原始堆栈的大小和原始堆栈的地址,将该原始堆栈拷贝到内存中,得到目标堆栈,使得不中断主线程的正常运行的情况下,对主线程堆栈拷贝作离线分析,进一步使得数据更准确。
在一个可选地实施方式中,本发明又提供了一种可选实施例的程序卡顿信息的获取装置,该装置除了包括如图6所示的单元外,还包括:第二发送单元,用于在该获取该程序的主线程的堆栈信息之前,向该主线程发送检测消息;确定单元,用于在该主线程在预定时长内未响应该检测消息的情况下,确定出该程序出现卡顿。
可选地,上述检测消息包括但并不限于:postMessage。
可选地,在本实施例中,上述预定时长可以为100ms~300ms的任意取值,可以视机器性能而定,在此,不做限定。
可选地,在本实施例中,确定程序出现卡顿的方法除了可以通过检测消息的方式外,还可以通过判断界面绘制帧率判断卡顿。
例如,在界面帧率不满足预定条件时,则判断程序出现卡顿,若界面帧率满足预定条件,则判断程序未出现卡顿。
通过上述装置,在确定出该程序出现卡顿的情况下,才获取卡顿信息,提高了卡顿信息的获取效率。
总之,通过本实施例提供的上述方法比现有技术中提供的普通方案有更高的效率,获取堆栈的速度在3ms左右,并且对主线程影响及其微小。
另外,通过本实施例提供的上述方法比现有技术有更好的准确率,由于不能中断主线程的正常运行,普通方案耗时高,所以主线程在这段时间会继续运行,导致获取堆栈准确率下降。新方案耗时短,并且对主线程堆栈拷贝作离线分析,数据更准确。
根据本发明的实施例的又一方面,还提供了一种存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:
S1,在检测到程序出现卡顿的情况下,获取所述程序的主线程的堆栈信息,其中,所述堆栈信息包括:所述主线程的堆栈中存储的扩展基址指针EBP;
S2,根据所述EBP获取所述主线程的堆栈中存储的目标函数的返回地址,其中,所述目标函数的返回地址在所述堆栈中的存储地址与所述EBP在所述堆栈中的存储地址相隔预定值;
S3,将所述目标函数的返回地址作为卡顿信息发送给网络侧设备。
可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:
S1,重复执行以下步骤,直到当前EBP为空指针,其中,所述当前EBP被初始化为所述主线程的堆栈中存储在最靠栈底的位置上的第一EBP,所述堆栈信息包括的EBP包括目标EBP;
S2,将所述当前EBP设置为所述目标EBP;在所述堆栈中获取在所述当前EBP所指向的地址上存储的EBP,将所述当前EBP更新为所述获取到的EBP。
可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:
S1,通过调用预定的API接口获取到所述第一EBP,或者,所述第一EBP在所述堆栈中的存储地址。
可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:
S1,将每个所述目标EBP在所述堆栈中的存储地址加上或减去所述预定值,得到所述目标函数的返回地址在所述堆栈中的存储地址;
S2,在所述目标函数的返回地址在所述堆栈中的存储地址上,获取存储的所述目标函数的返回地址。
可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:
S1,获取所述主线程的原始堆栈的大小和所述原始堆栈的地址;
S2,根据所述原始堆栈的大小和所述原始堆栈的地址,将所述原始堆栈拷贝到内存中,得到目标堆栈,其中,所述目标堆栈的大小与所述原始堆栈的大小相同,所述目标堆栈的地址与所述原始堆栈的地址相隔偏移值;
其中,所述主线程的堆栈中存储的扩展基址指针EBP为所述目标堆栈中存储的EBP,所述目标堆栈中存储的EBP的地址与所述原始堆栈中存储的EBP的地址相隔所述偏移值。
可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:
S1,向所述主线程发送检测消息。
S2,在所述主线程在预定时长内未响应所述检测消息的情况下,确定出所述程序出现卡顿。
可选地,在本实施例中,本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(Read-Only Memory,ROM)、随机存取器(Random Access Memory,RAM)、磁盘或光盘等。
根据本发明实施例的又一个方面,还提供了一种用于实施上述程序卡顿信息的获取的电子装置,如图8所示,该电子装置包括存储器802和处理器804,该存储器802中存储有计算机程序,该处理器804被设置为通过计算机程序执行上述任一项方法实施例中的步骤。
可选地,在本实施例中,上述电子装置可以位于计算机网络的多个网络设备中的至少一个网络设备。
可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:
S1,在检测到程序出现卡顿的情况下,获取所述程序的主线程的堆栈信息,其中,所述堆栈信息包括:所述主线程的堆栈中存储的扩展基址指针EBP;
S2,根据所述EBP获取所述主线程的堆栈中存储的目标函数的返回地址,其中,所述目标函数的返回地址在所述堆栈中的存储地址与所述EBP在所述堆栈中的存储地址相隔预定值;
S3,将所述目标函数的返回地址作为卡顿信息发送给网络侧设备。
可选地,在本实施例中,上述处理器可以被设置为存储用于执行以下步骤的计算机程序:
S1,重复执行以下步骤,直到当前EBP为空指针,其中,所述当前EBP被初始化为所述主线程的堆栈中存储在最靠栈底的位置上的第一EBP,所述堆栈信息包括的EBP包括目标EBP;
S2,将所述当前EBP设置为所述目标EBP;在所述堆栈中获取在所述当前EBP所指向的地址上存储的EBP,将所述当前EBP更新为所述获取到的EBP。
可选地,在本实施例中,上述处理器可以被设置为存储用于执行以下步骤的计算机程序:
S1,通过调用预定的API接口获取到所述第一EBP,或者,所述第一EBP在所述堆栈中的存储地址。
可选地,在本实施例中,上述处理器可以被设置为存储用于执行以下步骤的计算机程序:
S1,将每个所述目标EBP在所述堆栈中的存储地址加上或减去所述预定值,得到所述目标函数的返回地址在所述堆栈中的存储地址;
S2,在所述目标函数的返回地址在所述堆栈中的存储地址上,获取存储的所述目标函数的返回地址。
可选地,在本实施例中,上述处理器可以被设置为存储用于执行以下步骤的计算机程序:
S1,获取所述主线程的原始堆栈的大小和所述原始堆栈的地址;
S2,根据所述原始堆栈的大小和所述原始堆栈的地址,将所述原始堆栈拷贝到内存中,得到目标堆栈,其中,所述目标堆栈的大小与所述原始堆栈的大小相同,所述目标堆栈的地址与所述原始堆栈的地址相隔偏移值;
其中,所述主线程的堆栈中存储的扩展基址指针EBP为所述目标堆栈中存储的EBP,所述目标堆栈中存储的EBP的地址与所述原始堆栈中存储的EBP的地址相隔所述偏移值。
可选地,在本实施例中,上述处理器可以被设置为存储用于执行以下步骤的计算机程序:
S1,向所述主线程发送检测消息。
S2,在所述主线程在预定时长内未响应所述检测消息的情况下,确定出所述程序出现卡顿。
可选地,本领域普通技术人员可以理解,图8所示的结构仅为示意,电子装置也可以是智能手机(如Android手机、iOS手机等)、平板电脑、掌上电脑以及移动互联网设备(Mobile Internet Devices,简称为MID)、PAD等终端设备。图8其并不对上述电子装置的结构造成限定。例如,电子装置还可包括比图8中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图8所示不同的配置。
其中,存储器804可用于存储软件程序以及模块,如本发明实施例中的程序卡顿信息的获取方法和装置对应的程序指令/模块,处理器802通过运行存储在存储器804内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述程序卡顿信息的获取方法。存储器804可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器804可进一步包括相对于处理器802远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。其中,存储器802具体可以但不限于用于程序卡顿信息的获取流程等信息。作为一种示例,如图8所示,上述存储器802中可以但不限于包括上述程序卡顿信息的获取装置中的第一获取单元62、第二获取单元64、第一发送单元66。此外,还可以包括但不限于上述程序卡顿信息的获取装置中的其他模块单元,本示例中不再赘述。
可选地,上述的传输装置810用于经由一个网络接收或者发送数据。上述的网络具体实例可包括有线网络及无线网络。在一个实例中,传输装置810包括一个网络适配器(Network Interface Controller,NIC),其可通过网线与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,传输装置810为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。
此外,上述电子装置还包括:显示器808,用于显示上述程序卡顿信息的获取的结果;和连接总线810,用于连接上述电子装置中的各个模块部件。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1.一种程序卡顿信息的获取方法,其特征在于,包括:
在检测到程序出现卡顿的情况下,获取所述程序的主线程的堆栈信息,其中,所述堆栈信息包括:所述主线程的堆栈中存储的扩展基址指针;
根据所述扩展基址指针获取所述主线程的堆栈中存储的目标函数的返回地址,其中,所述目标函数的返回地址在所述堆栈中的存储地址与所述扩展基址指针在所述堆栈中的存储地址相隔预定值;
将所述目标函数的返回地址作为卡顿信息发送给网络侧设备。
2.根据权利要求1所述的方法,其特征在于,所述获取所述程序的主线程的堆栈信息包括:
重复执行以下步骤,直到当前扩展基址指针为空指针,其中,所述当前扩展基址指针被初始化为所述主线程的堆栈中存储在最靠栈底的位置上的第一扩展基址指针,所述堆栈信息包括的扩展基址指针包括目标扩展基址指针:
将所述当前扩展基址指针设置为所述目标扩展基址指针;在所述堆栈中获取在所述当前扩展基址指针所指向的地址上存储的扩展基址指针,将所述当前扩展基址指针更新为所述获取到的扩展基址指针。
3.根据权利要求2所述的方法,其特征在于,所述获取所述程序的主线程的堆栈信息包括:
通过调用预定的应用程序编程接口获取到所述第一扩展基址指针,或者,所述第一扩展基址指针在所述堆栈中的存储地址。
4.根据权利要求2所述的方法,其特征在于,根据所述扩展基址指针获取所述主线程的堆栈中存储的目标函数的返回地址包括:
将每个所述目标扩展基址指针在所述堆栈中的存储地址加上或
减去所述预定值,得到所述目标函数的返回地址在所述堆栈中的存储地址;
在所述目标函数的返回地址在所述堆栈中的存储地址上,获取存储的所述目标函数的返回地址。
5.根据权利要求1所述的方法,其特征在于,
在所述获取所述程序的主线程的堆栈信息之前,所述方法包括:获取所述主线程的原始堆栈的大小和所述原始堆栈的地址;根据所述原始堆栈的大小和所述原始堆栈的地址,将所述原始堆栈拷贝到内存中,得到目标堆栈,其中,所述目标堆栈的大小与所述原始堆栈的大小相同,所述目标堆栈的地址与所述原始堆栈的地址相隔偏移值;
其中,所述主线程的堆栈中存储的扩展基址指针扩展基址指针为所述目标堆栈中存储的扩展基址指针,所述目标堆栈中存储的扩展基址指针的地址与所述原始堆栈中存储的扩展基址指针的地址相隔所述偏移值。
6.根据权利要求1所述的方法,其特征在于,在所述获取所述程序的主线程的堆栈信息之前,所述方法还包括:
向所述主线程发送检测消息;
在所述主线程在预定时长内未响应所述检测消息的情况下,确定出所述程序出现卡顿。
7.一种程序卡顿信息的获取装置,其特征在于,包括:
第一获取单元,用于在检测到程序出现卡顿的情况下,获取所述程序的主线程的堆栈信息,其中,所述堆栈信息包括:所述主线程的堆栈中存储的扩展基址指针;
第二获取单元,用于根据所述扩展基址指针获取所述主线程的堆栈中存储的目标函数的返回地址,其中,所述目标函数的返回地址在所述堆栈中的存储地址与所述扩展基址指针在所述堆栈中的存储地址相隔预定值;
第一发送单元,用于将所述目标函数的返回地址作为卡顿信息发送给网络侧设备。
8.根据权利要求7所述的装置,其特征在于,所述第一获取单元还用于重复执行以下步骤,直到当前扩展基址指针为空指针,其中,所述当前扩展基址指针被初始化为所述主线程的堆栈中存储在最靠栈底的位置上的第一扩展基址指针,所述堆栈信息包括的扩展基址指针包括目标扩展基址指针:
将所述当前扩展基址指针设置为所述目标扩展基址指针;在所述堆栈中获取在所述当前扩展基址指针所指向的地址上存储的扩展基址指针,将所述当前扩展基址指针更新为所述获取到的扩展基址指针。
9.根据权利要求8所述的装置,其特征在于,所述第一获取单元还用于通过调用预定的应用程序编程接口获取到所述第一扩展基址指针,或者,所述第一扩展基址指针在所述堆栈中的存储地址。
10.根据权利要求8所述的装置,其特征在于,所述第二获取单元包括:
第一获取模块,用于将每个所述目标扩展基址指针在所述堆栈中的存储地址加上或减去所述预定值,得到所述目标函数的返回地址在所述堆栈中的存储地址;
第二获取模块,用于在所述目标函数的返回地址在所述堆栈中的存储地址上,获取存储的所述目标函数的返回地址。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811005036.3A CN110874301B (zh) | 2018-08-30 | 2018-08-30 | 程序卡顿信息的获取方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811005036.3A CN110874301B (zh) | 2018-08-30 | 2018-08-30 | 程序卡顿信息的获取方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110874301A true CN110874301A (zh) | 2020-03-10 |
CN110874301B CN110874301B (zh) | 2022-09-13 |
Family
ID=69715078
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811005036.3A Active CN110874301B (zh) | 2018-08-30 | 2018-08-30 | 程序卡顿信息的获取方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110874301B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111552613A (zh) * | 2020-04-26 | 2020-08-18 | 北京字节跳动网络技术有限公司 | 线程超时的处理方法、装置以及电子设备 |
CN113190427A (zh) * | 2021-05-11 | 2021-07-30 | 北京字节跳动网络技术有限公司 | 卡顿监控方法、装置、电子设备及存储介质 |
CN113835985A (zh) * | 2021-09-27 | 2021-12-24 | 北京基调网络股份有限公司 | 一种监测卡顿、分析卡顿原因的方法、装置及设备 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
CN1885275A (zh) * | 2005-06-20 | 2006-12-27 | 中兴通讯股份有限公司 | 一种嵌入式系统及其实时内存监控处理方法 |
US20120047579A1 (en) * | 2009-04-27 | 2012-02-23 | Fourteenforty Research Institute | Information device, program, method for preventing execution of unauthorized program code, and computer readable recording medium |
CN103034577A (zh) * | 2011-10-08 | 2013-04-10 | 腾讯科技(深圳)有限公司 | 一种定位关机慢的方法及装置 |
CN103679032A (zh) * | 2013-12-13 | 2014-03-26 | 北京奇虎科技有限公司 | 防御恶意软件的方法和装置 |
CN103870767A (zh) * | 2014-03-19 | 2014-06-18 | 四川大学 | 基于ebp构造的栈栈帧内容保护方法 |
CN107038107A (zh) * | 2017-03-09 | 2017-08-11 | 武汉斗鱼网络科技有限公司 | 一种获取应用卡顿信息的方法及装置 |
CN108170609A (zh) * | 2018-01-11 | 2018-06-15 | 五八有限公司 | 程序漏洞的定位方法、装置、计算机设备及可读存储介质 |
CN108345524A (zh) * | 2017-01-22 | 2018-07-31 | 腾讯科技(深圳)有限公司 | 应用程序监控方法及应用程序监控装置 |
-
2018
- 2018-08-30 CN CN201811005036.3A patent/CN110874301B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
CN1885275A (zh) * | 2005-06-20 | 2006-12-27 | 中兴通讯股份有限公司 | 一种嵌入式系统及其实时内存监控处理方法 |
US20120047579A1 (en) * | 2009-04-27 | 2012-02-23 | Fourteenforty Research Institute | Information device, program, method for preventing execution of unauthorized program code, and computer readable recording medium |
CN103034577A (zh) * | 2011-10-08 | 2013-04-10 | 腾讯科技(深圳)有限公司 | 一种定位关机慢的方法及装置 |
CN103679032A (zh) * | 2013-12-13 | 2014-03-26 | 北京奇虎科技有限公司 | 防御恶意软件的方法和装置 |
CN103870767A (zh) * | 2014-03-19 | 2014-06-18 | 四川大学 | 基于ebp构造的栈栈帧内容保护方法 |
CN108345524A (zh) * | 2017-01-22 | 2018-07-31 | 腾讯科技(深圳)有限公司 | 应用程序监控方法及应用程序监控装置 |
CN107038107A (zh) * | 2017-03-09 | 2017-08-11 | 武汉斗鱼网络科技有限公司 | 一种获取应用卡顿信息的方法及装置 |
CN108170609A (zh) * | 2018-01-11 | 2018-06-15 | 五八有限公司 | 程序漏洞的定位方法、装置、计算机设备及可读存储介质 |
Non-Patent Citations (1)
Title |
---|
朱剑锋等: "基于堆栈回溯的异常处理", 《计算机工程与设计》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111552613A (zh) * | 2020-04-26 | 2020-08-18 | 北京字节跳动网络技术有限公司 | 线程超时的处理方法、装置以及电子设备 |
CN113190427A (zh) * | 2021-05-11 | 2021-07-30 | 北京字节跳动网络技术有限公司 | 卡顿监控方法、装置、电子设备及存储介质 |
CN113835985A (zh) * | 2021-09-27 | 2021-12-24 | 北京基调网络股份有限公司 | 一种监测卡顿、分析卡顿原因的方法、装置及设备 |
CN113835985B (zh) * | 2021-09-27 | 2023-09-29 | 北京基调网络股份有限公司 | 一种监测卡顿、分析卡顿原因的方法、装置及设备 |
Also Published As
Publication number | Publication date |
---|---|
CN110874301B (zh) | 2022-09-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111831548B (zh) | 一种依赖关系拓扑图的绘制方法和装置 | |
CN110874301B (zh) | 程序卡顿信息的获取方法和装置 | |
CN109669795B (zh) | 崩溃信息处理方法及装置 | |
CN112543176A (zh) | 一种异常网络访问检测方法、装置、存储介质及终端 | |
CN107404481B (zh) | 用户信息识别方法及装置 | |
CN111258680B (zh) | 资源加载方法和装置、存储介质及电子装置 | |
CN105160027B (zh) | 广告数据处理方法及装置 | |
CN109241780B (zh) | 一种图像隐藏信息的检测方法、装置及设备 | |
KR20150083627A (ko) | 액티비티 문자열 분석에 의한 안드로이드 악성코드 검출 방법 | |
CN105404578B (zh) | 用于显示应用程序所占用的内存的方法和装置 | |
CN109783258A (zh) | 一种消息处理方法、装置及服务器 | |
CN111464513A (zh) | 数据检测方法、装置、服务器及存储介质 | |
CN107798039A (zh) | 一种数据同步方法和装置 | |
CN110069406B (zh) | 自动触发的tpc-ds测试方法以及系统 | |
CN106933644A (zh) | 数据处理方法和装置 | |
US10761862B2 (en) | Method and device for adding indicative icon in interactive application | |
CN106294345A (zh) | 应用程序的日志内容的处理方法和装置 | |
CN105302715B (zh) | 应用程序用户界面的获取方法和装置 | |
CN110442439B (zh) | 任务进程处理方法、装置和计算机设备 | |
CN111209368A (zh) | 信息提示方法和装置、计算机可读的存储介质及电子装置 | |
CN106469166A (zh) | 一种信息处理方法及装置 | |
CN107040603B (zh) | 用于确定应用程序App活跃场景的方法和装置 | |
CN111459774A (zh) | 一种应用程序的流量的获取方法、装置、设备及存储介质 | |
CN105551500B (zh) | 一种音频信号处理方法及装置 | |
CN115795100A (zh) | 用户事件处理方法、装置、电子设备及可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40021554 Country of ref document: HK |
|
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |