函数耗时跟踪方法、设备和存储介质
技术领域
本申请涉及计算机技术领域,特别是涉及一种函数耗时跟踪方法、设备和存储介质。
背景技术
为了优化运行在电子设备上的应用程序的性能,需要对应用程序运行期间调用的函数的执行耗时进行跟踪,以便于开发者定位到应用程序运行期间的耗时点,从而针对耗时点进行优化。
以对运行在安卓操作系统上的应用程序进行函数耗时跟踪为例,目前使用的函数耗时跟踪工具是systrace(系统跟踪)工具。为了使用systrace工具进行函数耗时跟踪,开发者需要将安装有该应用程序的电子设备与安装有systrace工具的电脑连接,在电子设备上运行应用程序,并通过电脑端上运行的systrace工具对应用程序运行过程中调用的函数的执行耗时进行跟踪。
可见,使用systrace工具进行函数耗时跟踪需要搭建特定的运行环境,即需要与安装有systrace工具的电脑连接,且只有在应用程序运行过程中复现了耗时场景的情况下才能追踪到耗时问题。使用场景受限导致systrace工具可靠性有待提升。
发明内容
为解决如何提高函数耗时跟踪可靠性、突破函数耗时跟踪工具使用场景受限的问题,本申请实施例提出一种函数耗时跟踪方法、设备和存储介质。
第一方面,本申请实施例提供一种函数耗时跟踪方法,在应用程序运行过程中,该方法包括:
在预定的开启时机,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态;
获取目标轨迹文件的文件描述符;
在上述目标轨迹开关变量处于打开状态期间,若有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断该指定文件描述符是否包括目标轨迹文件的文件描述符;
在指定文件描述符包括目标轨迹文件的文件描述符的情况下,输出上述需要写入的数据,该数据包括第一函数的耗时数据。
在应用程序运行期间,本申请实施例提供的方法可以动态打开目标轨迹开关变量,从而能够在应用程序运行期间进行函数耗时跟踪,具体的,当有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断该指定文件描述符是否包括获取到的目标轨迹文件的文件描述符。若是,意味着需要写入的数据包括耗时数据,输出耗时数据,耗时数据描述了第一函数的耗时情况,例如第一函数开始执行的时刻、第一函数结束执行的时刻等等。可见,通过上述处理过程,可以在应用程序运行在电子设备的过程中实时跟踪函数耗时,不需要将电子设备连接到电脑上,使得其应用场景更为广泛,可以在电子设备用户使用应用程序期间跟踪函数耗时,也可以在开发者测试应用程序期间跟踪耗时函数。另外,通过配置开启时机,可以在电子设备用户日常使用电子设备的过程中实时跟踪函数耗时,对于非必现的函数耗时问题也可以成功实现耗时跟踪,提高函数耗时跟踪的可靠性。
可选的,本申请实施例提供的方法还可以在预定的关闭时机,将上述目标轨迹开关变量的状态设置为关闭状态。
本申请实施例提供的方法可以实现在电子设备用户使用应用程序期间,占用电子设备处理资源。相应的,不仅动态开启轨迹开关变量,还动态关闭轨迹开关变量,避免长时间占用处理资源导致应用程序的性能下降。
可选的,上述在预定的开启时机,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态,其实现方式可以包括:
当应用程序冷启动,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态;
或者,
当应用程序的性能下降到阈值水平,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态;
或者,
响应于接收到的开启指示消息,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态。
可选的,在预定的关闭时机,将目标轨迹开关变量的状态设置为关闭状态,包括:
当应用程序的目标阶段结束,将目标轨迹开关变量的状态设置为关闭状态;
或者,
当目标轨迹开关变量处于打开状态的持续时间达到设定时长阈值,将目标轨迹开关变量的状态设置为关闭状态。
在上述任意方法实施例的基础上,上述目标轨迹开关变量包括系统服务层的轨迹开关变量和本地服务层的轨迹开关变量。
本申请实施例提供的方法既开启系统服务层的轨迹开关变量,对java语言实现的函数进行耗时跟踪,又开启本地服务层的轨迹开关变量,对c++语言实现的函数进行耗时跟踪,使得耗时跟踪更加全面、可靠。
在上述任意方法实施例的基础上,上述若有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断指定文件描述符是否包括目标轨迹文件的文件描述符,其实现方式可以包括:
若有第一函数调用第二函数向指定文件描述符对应的文件写入数据,利用预先为第二函数配置的代理函数判断指定文件描述符是否包括目标轨迹文件的文件描述符。
本申请实施例提供的方法,通过代理第二函数,利用第二函数的代理函数识别待写入的数据是否包括耗时数据。
可选的,在指定文件描述符包括目标轨迹文件的文件描述符的情况下,输出上述需要写入的数据,其实现方式可以包括:
在指定文件描述符包括目标轨迹文件的文件描述符的情况下,代理函数调用第二函数,通过第二函数将数据的数据结构格式化为目标数据结构,并将目标数据结构的该数据写入目标耗时跟踪文件。
第二方面,本申请实施例提供一种电子设备,该电子设备包括轨迹开关变量状态设置模块、文件描述符获取模块,文件描述符比对模块和耗时数据输出模块,在应用程序运行过程中:
轨迹开关变量状态设置模块用于在预定的开启时机,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态;
文件描述符获取模块用于获取目标轨迹文件的文件描述符;
文件描述符比对模块用于在目标轨迹开关变量处于打开状态期间,若有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断指定文件描述符是否包括目标轨迹文件的文件描述符;
耗时数据输出模块用于在指定文件描述符包括目标轨迹文件的文件描述符的情况下,输出上述需要写入的数据,该数据包括第一函数的耗时数据。
在应用程序运行期间,本申请实施例提供的电子设备可以动态打开目标轨迹开关变量,从而能够在应用程序运行期间进行函数耗时跟踪,具体的,当有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断该指定文件描述符是否包括获取到的目标轨迹文件的文件描述符。若是,意味着需要写入的数据包括耗时数据,输出耗时数据,耗时数据描述了第一函数的耗时情况,例如第一函数开始执行的时刻、第一函数结束执行的时刻等等。可见,通过上述处理过程,可以在应用程序运行在电子设备的过程中实时跟踪函数耗时,不需要将电子设备连接到电脑上,使得其应用场景更为广泛,可以在电子设备用户使用应用程序期间跟踪函数耗时,也可以在开发者测试应用程序期间跟踪耗时函数。另外,通过配置开启时机,可以在电子设备用户日常使用电子设备的过程中实时跟踪函数耗时,对于非必现的函数耗时问题也可以成功实现耗时跟踪,提高函数耗时跟踪的可靠性。
可选的,上述轨迹开关变量状态设置模块还可以在预定的关闭时机,将上述目标轨迹开关变量的状态设置为关闭状态。
本申请实施例提供的电子设备可以实现在电子设备用户使用应用程序期间,占用电子设备处理资源。相应的,不仅动态开启轨迹开关变量,还动态关闭轨迹开关变量,避免长时间占用处理资源导致应用程序的性能下降。
可选的,上述轨迹开关变量状态设置模块的实现方式可以包括:
当应用程序冷启动,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态;
或者,
当应用程序的性能下降到阈值水平,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态;
或者,
响应于接收到的开启指示消息,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态。
可选的,轨迹开关变量状态设置模块的实现方式可以包括:
当应用程序的目标阶段结束,将目标轨迹开关变量的状态设置为关闭状态;
或者,
当目标轨迹开关变量处于打开状态的持续时间达到设定时长阈值,将目标轨迹开关变量的状态设置为关闭状态。
在上述任意方法实施例的基础上,上述目标轨迹开关变量包括系统服务层的轨迹开关变量和本地服务层的轨迹开关变量。
本申请实施例提供的电子设备既开启系统服务层的轨迹开关变量,对java语言实现的函数进行耗时跟踪,又开启本地服务层的轨迹开关变量,对c++语言实现的函数进行耗时跟踪,使得耗时跟踪更加全面、可靠。
在上述任意电子设备实施例的基础上,上述文件描述符对比模块的实现方式可以包括:
若有第一函数调用第二函数向指定文件描述符对应的文件写入数据,利用预先为第二函数配置的代理函数判断指定文件描述符是否包括目标轨迹文件的文件描述符。
本申请实施例提供的电子设备,通过代理第二函数,利用第二函数的代理函数识别待写入的数据是否包括耗时数据。
可选的,耗时函数输出模块的实现方式可以包括:
在指定文件描述符包括目标轨迹文件的文件描述符的情况下,代理函数调用第二函数,通过第二函数将数据的数据结构格式化为目标数据结构,并将目标数据结构的该数据写入目标耗时跟踪文件。
第三方面,本发明实施例提供一种电子设备,包括处理器和存储器;
存储器用于存储执行上述第一方面任意方法实施例的程序;
处理器被配置为执行存储器中存储的程序。
在应用程序运行期间,本申请实施例提供的电子设备可以动态打开目标轨迹开关变量,从而能够在应用程序运行期间进行函数耗时跟踪,具体的,当有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断该指定文件描述符是否包括获取到的目标轨迹文件的文件描述符。若是,意味着需要写入的数据包括耗时数据,输出耗时数据,耗时数据描述了第一函数的耗时情况,例如第一函数开始执行的时刻、第一函数结束执行的时刻等等。可见,通过上述处理过程,可以在应用程序运行在电子设备的过程中实时跟踪函数耗时,不需要将电子设备连接到电脑上,使得其应用场景更为广泛,可以在电子设备用户使用应用程序期间跟踪函数耗时,也可以在开发者测试应用程序期间跟踪耗时函数。另外,通过配置开启时机,可以在电子设备用户日常使用电子设备的过程中实时跟踪函数耗时,对于非必现的函数耗时问题也可以成功实现耗时跟踪,提高函数耗时跟踪的可靠性。
第四方面,本发明实施例提供一种计算机可读存储介质,存储有实现上述第一方面任意方法实施例的程序。
本申请实施例提供的计算机可读存储介质中存储的程序在运行期间,可以动态打开目标轨迹开关变量,从而能够在应用程序运行期间进行函数耗时跟踪,具体的,当有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断该指定文件描述符是否包括获取到的目标轨迹文件的文件描述符。若是,意味着需要写入的数据包括耗时数据,输出耗时数据,耗时数据描述了第一函数的耗时情况,例如第一函数开始执行的时刻、第一函数结束执行的时刻等等。可见,通过上述处理过程,可以在应用程序运行在电子设备的过程中实时跟踪函数耗时,不需要将电子设备连接到电脑上,使得其应用场景更为广泛,可以在电子设备用户使用应用程序期间跟踪函数耗时,也可以在开发者测试应用程序期间跟踪耗时函数。另外,通过配置开启时机,可以在电子设备用户日常使用电子设备的过程中实时跟踪函数耗时,对于非必现的函数耗时问题也可以成功实现耗时跟踪,提高函数耗时跟踪的可靠性。
附图说明
图1为本申请一个实施例提供的函数耗时跟踪方法流程图;
图2为本申请一个实施例提供的电子设备框图;
图3为本发明一个实施例提供的移动终端结构示意图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在本申请的说明书和权利要求书及上述附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。
本申请实施例提供一种函数耗时跟踪方法,可以应用在移动终端上安装的应用程序的运行期间,也可以应用在模拟移动终端运行环境的虚拟机上的应用程序的运行期间,本申请实施例对此不做限定。在应用程序运行期间,如图1所示,本申请实施例提供的方法包括如下操作:
步骤101、在预定的开启时机,查找目标atrace(轨迹)开关变量,并将查找到的目标atrace开关变量的状态设置为打开状态。
实际应用中,可以根据需要预先配置至少一个开启时机。
步骤102、获取目标atrace文件的文件描述符。
其中,步骤101和步骤102之间不存在时序限定,既可以并行执行,也可以串行执行。
步骤103、在上述目标atrace开关变量处于打开状态期间,若有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断该指定文件描述符是否包括目标atrace文件的文件描述符。
其中,第一函数是函数耗时跟踪的跟踪对象,第二函数是write(写入)函数,具体是用于将第一函数输出的数据写入指定文件描述符对应的文件。
其中,指定文件描述符由第一函数指定。
作为举例而非限定,可以通过字符串(或关键字段)比对的方式实现上述判断,即将指定文件描述符的字符串(或关键字段)与获取到的各个目标atrace文件的文件描述符的字符串(或关键字段)进行匹配。
步骤104、在指定文件描述符包括目标轨迹文件的文件描述符的情况下,输出上述需要写入的数据,该数据包括第一函数的耗时数据。
其中,耗时函数用于描述第一函数的执行耗时,可以但不仅限于包括第一函数开始执行的时刻、第一函数结束执行的时刻等等。
在应用程序运行期间,本申请实施例提供的方法可以动态打开目标轨迹开关变量,从而能够在应用程序运行期间进行函数耗时跟踪,具体的,当有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断该指定文件描述符是否包括获取到的目标轨迹文件的文件描述符。若是,意味着需要写入的数据包括耗时数据,输出耗时数据,耗时数据描述了第一函数的耗时情况。可见,通过上述处理过程,可以在应用程序运行在电子设备的过程中实时跟踪函数耗时,不需要将电子设备连接到电脑上,使得其应用场景更为广泛,可以在电子设备用户使用应用程序期间跟踪函数耗时,也可以在开发者测试应用程序期间跟踪耗时函数。另外,通过配置开启时机,可以在电子设备用户日常使用电子设备的过程中实时跟踪函数耗时,发现和解决更多实际用户侧的性能和函数耗时问题,对于非必现的函数耗时问题也可以成功实现耗时跟踪,提高函数耗时跟踪的可靠性,提升应用程序的基础用户体验。
可选的,本申请实施例提供的方法还可以在预定的关闭时机,将上述目标轨迹开关变量的状态设置为关闭状态。
本申请实施例提供的方法可以实现在电子设备用户使用应用程序期间,占用电子设备处理资源。相应的,不仅动态开启轨迹开关变量,还动态关闭轨迹开关变量,避免长时间占用处理资源导致应用程序的性能下降。
如上所述,动态打开、关闭atrace开关变量的时机是预先配置的,且可以配置不止一个开启时机,以及配置不止一个关闭时机。每当到达一个开启时机,即打开atrace开关变量,直至到达一个关闭时机,关闭atrace开关变量。
上述开启时机可以是应用程序冷启动时,相应的,当应用程序冷启动,查找目标atrace开关变量,并将查找到的目标atrace开关变量的状态设置为打开状态。
应用程序的冷启动往往是耗时较长的过程,为了优化冷启动阶段的耗时,可以在应用程序冷启动时开启atrace开关,以对冷启动阶段的函数进行耗时跟踪。
上述开启时机也可以是应用程序的性能下降到阈值水平时,相应的,当应用程序的性能下降到阈值水平,查找目标atrace开关变量,并将查找到的目标atrace开关变量的状态设置为打开状态。
若应用程序的性能下降到阈值水平,意味着出现或即将出现耗时问题,此时开启atrace开关,可以及时获取到相应函数的耗时数据,以便开发者分析耗时数据,定位耗时问题,进行优化。
实际应用中,可以根据实际场景、需要确定反映应用程序性能的特征。作为举例而非限定,可以通过以下至少一个特征反映应用程序的性能:中央处理器(CPU)占用率、内存占用率、图形处理器(GPU)占用率等等。以通过内存占用率反映应用程序性能为例,若内存占用率上升到设定的内存占用率阈值,意味着应用程序的性能下降到阈值水平。
上述开启时机还可以是接收到开启指示消息时,相应的,响应于接收到的开启指示消息,查找目标atrace开关变量,并将查找到的目标atrace开关变量的状态设置为打开状态。
电子设备用户在使用应用程序期间,应用程序的服务器可以对应用程序的运行情况进行监控,当通过监控发现应用程序出现卡顿等异常情况,则向电子设备的应用程序发送开启指示消息,以指示电子设备的应用程序打开atrace开关。若监控到应用程序出现上述异常情况,意味着出现或即将出现耗时问题,此时开启atrace开关,可以及时获取到相应函数的耗时数据,以便开发者分析耗时数据,定位耗时问题,进行优化。
上述关闭时机可以包括应用程序的目标阶段结束时,相应的,当应用程序的目标阶段结束,将目标atrace开关变量的状态设置为关闭状态。
其中,目标阶段可以根据实际需要定义,例如,目标阶段可以包括冷启动阶段、指定内容加载阶段等等。
以冷启动阶段为例,若配置的开启时机包括应用程序冷启动时,相应的,配置的关闭时机可以包括冷启动阶段结束。
上述关闭时机也可以包括目标atrace开关变量处于打开状态的持续时间达到设定时长阈值时,相应的,当目标atrace开关变量处于打开状态的持续时间达到设定时长阈值,将目标atrace开关变量的状态设置为关闭状态。
在上述任意方法实施例的基础上,上述目标atrace开关变量包括系统服务层(又称JAVA层)的atrace开关变量和/或本地服务层(又称native)的atrace开关变量。
其中,查找JAVA层的atrace开关变量的实现方式有多种,例如,可以采用反射的方式遍历JAVA层查找atrace开关变量,也可以采用自定义的遍历方式遍历JAVA层查找atrace开关变量。
其中,查找native层的atrace开关变量的实现方式有多种,例如,可以通过dlsym函数遍历native层的atrace开关变量,也可以采用自定义的遍历方式遍历native层查找atrace开关变量。
无论是在JAVA层还是在native层查找到的atrace开关变量,既可以是应用程序自身的atrace开关变量,也可以是应用程序运行期间需要调用的操作系统的atrace开关变量。
本申请实施例提供的方法,为了关闭目标atrace开关变量,可以采用上述实现方式在JAVA层和/或native层查找目标atrace开关变量,以便将其状态设置为关闭状态,也可以在步骤101中查找到目标atrace开关变量后,保存这些目标开关变量的索引,利用保存的索引查找目标atrace开关变量,以便将其状态设置为关闭状态。
本申请实施例提供的方法既开启系统服务层的轨迹开关变量,对java语言实现的函数进行耗时跟踪,又开启本地服务层的轨迹开关变量,对c++语言实现的函数进行耗时跟踪,使得耗时跟踪更加全面、可靠。
在上述任意方法实施例的基础上,获取目标atrace文件的文件描述符的实现方式有多种。作为举例而非限定,可以通过dlsym函数遍历native层,查找并获取atrace文件的文件描述符。其中,可以将查找到的所有atrace文件的文件描述符均作为目标atrace文件的文件描述符,也可以将查找到的部分atrace文件的文件描述符均作为目标atrace文件的文件描述符。
在上述任意方法实施例的基础上,上述若有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断指定文件描述符是否包括目标轨迹文件的文件描述符,其实现方式可以包括:若有第一函数调用第二函数向指定文件描述符对应的文件写入数据,利用预先为第二函数配置的代理函数判断指定文件描述符是否包括目标轨迹文件的文件描述符。
其中,可以应用程序运行期间进行代理函数的配置,本申请实施例不对代理函数配置的时机进行限定,可以与上述步骤101、步骤102并行执行,也可以与这两个步骤串行执行。具体的,获取应用程序中使用的所有动态库列表,通过got表hook(代理)动态库列表中所有动态库的write函数的调用。那么,当有函数(第一函数)调用write函数(第二函数)向指定文件描述符写入数据时,会触发代理函数,由代理函数判断该指定文件描述符是否包括目标atrace文件描述符。
本申请实施例提供的方法,通过代理第二函数,利用第二函数的代理函数识别待写入的数据是否包括耗时数据。
相应的,在指定文件描述符包括目标atrace文件的文件描述符的情况下,代理函数调用第二函数,通过第二函数将数据的数据结构格式化为目标数据结构,并将目标数据结构的该数据写入目标耗时跟踪文件。
其中,目标数据结构可以但不仅限于是标准systrace数据,也可以是自定义的数据结构。
电子设备可以按照预定的上报时机,将上述目标耗时跟踪文件上报给应用程序的服务器或其他指定的网络设备,以便开发者根据其中的函数耗时数据进行函数耗时分析,从而实现应用程序的性能优化。
基于与图1所示的方法相同的发明构思,本申请实施例还提供一种电子设备,如图2所示,该电子设备包括轨迹开关变量状态设置模块201、文件描述符获取模块202,文件描述符比对模块203和耗时数据输出模块204,在应用程序运行过程中:
轨迹开关变量状态设置模块201用于在预定的开启时机,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态;
文件描述符获取模块202用于获取目标轨迹文件的文件描述符;
文件描述符比对模块203用于在目标轨迹开关变量处于打开状态期间,若有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断指定文件描述符是否包括目标轨迹文件的文件描述符;
耗时数据输出模块204用于在指定文件描述符包括目标轨迹文件的文件描述符的情况下,输出上述需要写入的数据,该数据包括第一函数的耗时数据。
在应用程序运行期间,本申请实施例提供的电子设备可以动态打开目标轨迹开关变量,从而能够在应用程序运行期间进行函数耗时跟踪,具体的,当有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断该指定文件描述符是否包括获取到的目标轨迹文件的文件描述符。若是,意味着需要写入的数据包括耗时数据,输出耗时数据,耗时数据描述了第一函数的耗时情况,例如第一函数开始执行的时刻、第一函数结束执行的时刻等等。可见,通过上述处理过程,可以在应用程序运行在电子设备的过程中实时跟踪函数耗时,不需要将电子设备连接到电脑上,使得其应用场景更为广泛,可以在电子设备用户使用应用程序期间跟踪函数耗时,也可以在开发者测试应用程序期间跟踪耗时函数。另外,通过配置开启时机,可以在电子设备用户日常使用电子设备的过程中实时跟踪函数耗时,对于非必现的函数耗时问题也可以成功实现耗时跟踪,提高函数耗时跟踪的可靠性。
可选的,上述轨迹开关变量状态设置模块还可以在预定的关闭时机,将上述目标轨迹开关变量的状态设置为关闭状态。
本申请实施例提供的电子设备可以实现在电子设备用户使用应用程序期间,占用电子设备处理资源。相应的,不仅动态开启轨迹开关变量,还动态关闭轨迹开关变量,避免长时间占用处理资源导致应用程序的性能下降。
可选的,上述轨迹开关变量状态设置模块的实现方式可以包括:
当应用程序冷启动,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态;
或者,
当应用程序的性能下降到阈值水平,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态;
或者,
响应于接收到的开启指示消息,查找目标轨迹开关变量,并将查找到的目标轨迹开关变量的状态设置为打开状态。
可选的,轨迹开关变量状态设置模块的实现方式可以包括:
当应用程序的目标阶段结束,将目标轨迹开关变量的状态设置为关闭状态;
或者,
当目标轨迹开关变量处于打开状态的持续时间达到设定时长阈值,将目标轨迹开关变量的状态设置为关闭状态。
在上述任意方法实施例的基础上,上述目标轨迹开关变量包括系统服务层的轨迹开关变量和本地服务层的轨迹开关变量。
本申请实施例提供的电子设备既开启系统服务层的轨迹开关变量,对java语言实现的函数进行耗时跟踪,又开启本地服务层的轨迹开关变量,对c++语言实现的函数进行耗时跟踪,使得耗时跟踪更加全面、可靠。
在上述任意电子设备实施例的基础上,上述文件描述符对比模块的实现方式可以包括:
若有第一函数调用第二函数向指定文件描述符对应的文件写入数据,利用预先为第二函数配置的代理函数判断指定文件描述符是否包括目标轨迹文件的文件描述符。
本申请实施例提供的电子设备,通过代理第二函数,利用第二函数的代理函数识别待写入的数据是否包括耗时数据。
可选的,耗时函数输出模块的实现方式可以包括:
在指定文件描述符包括目标轨迹文件的文件描述符的情况下,代理函数调用第二函数,通过第二函数将数据的数据结构格式化为目标数据结构,并将目标数据结构的该数据写入目标耗时跟踪文件。
上述各实施例中的电子设备可以包括智能手机、掌上电脑、平板电脑、带显示屏的可穿戴设备、车载电脑、智能音箱、个人电脑、超级计算机等等。其中,个人电脑、超级计算机上部署有模拟移动终端运行环境的虚拟机。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的电子设备的模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
基于与方法同样的发明构思,本申请实施例提供一种电子设备,包括处理器和存储器;
存储器用于存储执行上述任意方法实施例的程序;
处理器被配置为执行存储器中存储的程序。
在应用程序运行期间,本申请实施例提供的电子设备可以动态打开目标轨迹开关变量,从而能够在应用程序运行期间进行函数耗时跟踪,具体的,当有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断该指定文件描述符是否包括获取到的目标轨迹文件的文件描述符。若是,意味着需要写入的数据包括耗时数据,输出耗时数据,耗时数据描述了第一函数的耗时情况,例如第一函数开始执行的时刻、第一函数结束执行的时刻等等。可见,通过上述处理过程,可以在应用程序运行在电子设备的过程中实时跟踪函数耗时,不需要将电子设备连接到电脑上,使得其应用场景更为广泛,可以在电子设备用户使用应用程序期间跟踪函数耗时,也可以在开发者测试应用程序期间跟踪耗时函数。另外,通过配置开启时机,可以在电子设备用户日常使用电子设备的过程中实时跟踪函数耗时,对于非必现的函数耗时问题也可以成功实现耗时跟踪,提高函数耗时跟踪的可靠性。
若本申请实施例提供的电子设备为移动终端,如图3所示,本申请实施例提供的移动终端不仅包括处理器和存储器,还包括输入设备(例如触摸屏、摄像头、传声器等)、输出设备(例如显示屏、扬声器等)、通信模块、电源模块。
其中,存储器、输入设备、输出设备、通信模块、电源模块通过串口、总线或USB接口与处理器连接。其中,对于单处理器移动终端,处理器即CPU(中央处理器);对于双处理器移动终端,处理器包括主处理器和从处理器,由其主处理器执行应用程序实现本发明实施例提供的方法,若其中需要与外界进行通信,则由从处理器控制通信模块配合实现;对于包含GPU(图形处理器)和CPU的终端设备,处理器是指GPU和CPU,由GPU和CPU配合或由CPU单独实现本申请实施例提供的方法。
其中,移动终端的存储器可以但不仅限于包括:Flash(闪存)存储器、RAM(随机存取存储器)、ROM(只读存储器)等。RAM主要用于存储终端设备运行时的程序和数据,需要执行的程序或者需要处理的数据都必须先装入RAM内。ROM主要用于检查终端设备操作系统的配置情况,并提供最基本的输入输出(I/O)程序。Flash存储器是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)存储器,数据删除不是以单个的字节为单位,而是以固定的区块为单位。由于Flash存储器断电时仍能保存数据,它通常被用来保存设置信息,如用户对手机的设置信息等。
应当指出的是,针对不同的移动终端(单处理器智能手机、双处理器智能手机、智能穿戴设备、平板电脑等等),其可能包括比图3所示的终端设备更多或更少的硬件结构,但只要包括存储器和处理器,且能够实现上述方法实施例的功能,均在本公开的保护范围内。
基于与方法同样的发明构思,本申请实施例提供一种计算机可读存储介质,存储有实现上述任意方法实施例的程序。
本申请实施例提供的计算机可读存储介质中存储的程序在运行期间,可以动态打开目标轨迹开关变量,从而能够在应用程序运行期间进行函数耗时跟踪,具体的,当有第一函数调用第二函数向指定文件描述符对应的文件写入数据,判断该指定文件描述符是否包括获取到的目标轨迹文件的文件描述符。若是,意味着需要写入的数据包括耗时数据,输出耗时数据,耗时数据描述了第一函数的耗时情况,例如第一函数开始执行的时刻、第一函数结束执行的时刻等等。可见,通过上述处理过程,可以在应用程序运行在电子设备的过程中实时跟踪函数耗时,不需要将电子设备连接到电脑上,使得其应用场景更为广泛,可以在电子设备用户使用应用程序期间跟踪函数耗时,也可以在开发者测试应用程序期间跟踪耗时函数。另外,通过配置开启时机,可以在电子设备用户日常使用电子设备的过程中实时跟踪函数耗时,对于非必现的函数耗时问题也可以成功实现耗时跟踪,提高函数耗时跟踪的可靠性。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、磁盘或光盘等。
上述所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。