CN109783161B - iOS系统中应用程序的运行信息确定方法、装置 - Google Patents

iOS系统中应用程序的运行信息确定方法、装置 Download PDF

Info

Publication number
CN109783161B
CN109783161B CN201811512388.8A CN201811512388A CN109783161B CN 109783161 B CN109783161 B CN 109783161B CN 201811512388 A CN201811512388 A CN 201811512388A CN 109783161 B CN109783161 B CN 109783161B
Authority
CN
China
Prior art keywords
running
time
method object
thread
target function
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.)
Active
Application number
CN201811512388.8A
Other languages
English (en)
Other versions
CN109783161A (zh
Inventor
徐臻
吴君阳
王志宇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Sankuai Online Technology Co Ltd
Original Assignee
Beijing Sankuai Online Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Sankuai Online Technology Co Ltd filed Critical Beijing Sankuai Online Technology Co Ltd
Priority to CN201811512388.8A priority Critical patent/CN109783161B/zh
Publication of CN109783161A publication Critical patent/CN109783161A/zh
Application granted granted Critical
Publication of CN109783161B publication Critical patent/CN109783161B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明提供了iOS系统中应用程序的运行信息确定方法、装置,该iOS系统中设置有多个线程,所述线程包含至少一个方法对象,所述方法包括:当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数,并替换为目标函数;当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态,并在所述堆栈器中写入和读取所述运行状态,根据在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;所述目标函数通过所述运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,最终确定所述应用程序的运行信息。解决了现有应用程序运行信息获取方法侵入性高且不可持续维护的问题。

Description

iOS系统中应用程序的运行信息确定方法、装置
技术领域
本发明涉及机器学习技术领域,特别是涉及一种iOS系统中应用程序的运行信息确定方法、一种iOS系统中应用程序的运行信息确定装置、设备及可读存储介质。
背景技术
在移动应用的开发过程中,可能会遇到一些性能瓶颈,例如程序运行的卡顿或内存无法正确的释放,都无法得到很好的监控或反馈。通常在针对统计Objective-C语言程序的方法调用信息(包括方法调用关系、调用次数以及执行时间等),对于分析验证程序运行逻辑、优化运行性能都有很大的意义。目前普遍可采用的解决方案是直接在代码层面的指定方法前后插入记录代码,或者使用官方提供的Instrument分析工具进行分析。
但是上述方法仅可覆盖有限的事先预见的代码,不可能做到全面覆盖,对源代码的侵入性高,无法直接处理二进制,并且人力成本高,利用Instrument分析工具分析,对系统依赖性高,不具备持续可维护性,应用效果不理想。
发明内容
鉴于上述问题,提出了本发明实施例以便提供一种克服上述问题或者至少部分地解决上述问题的一种iOS系统中应用程序的运行信息确定方法和相应的一种iOS系统中应用程序的运行信息确定装置。
根据本发明的第一方面,本发明实施例公开了一种iOS系统中应用程序的运行信息确定方法,上述iOS系统中设置有多个线程,所述线程包含至少一个方法对象,具体包括:
当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;
将所述预设入口函数替换为目标函数;
当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;
所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;
所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;
所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间;
所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息。
根据本发明的第二方面,本发明实施例公开了一种iOS系统中应用程序的运行信息确定装置,上述iOS系统中设置有多个线程,所述线程包含至少一个方法对象,具体包括:
入口函数拦截模块,用于当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;
入口函数替换模块,用于将所述预设入口函数替换为目标函数;
运行状态获取模块,用于当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;
堆栈器构建模块,用于所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;
方法对象运行时间生成模块,用于所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;
线程的运行时间确定模块,用于所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间;
应用程序运行信息确定模块,用于所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息。
根据本发明的第三方面,提供了一种设备,包括:处理器、存储器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如前述的iOS系统中应用程序的运行信息确定方法。
根据本发明的第四方面,提供了一种可读存储介质,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够实现前述的iOS系统中应用程序的运行信息确定方法。
本发明实施例包括以下优点,在监测到所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数,并替换为目标函数,通过目标函数构建堆栈器,并获取所述方法对象的运行状态,在所述堆栈器中写入和读取所述运行状态,通过在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间,进一步通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间。提供了一种对源代码无侵入性的方法,具备不依赖编码环境,通过堆栈器读写时间而确定方法对象运行时间的有益效果。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明的一种iOS系统中应用程序的运行信息确定方法实施例的步骤流程图;
图2是本发明的一种iOS系统中应用程序的运行信息确定方法实施例的步骤流程图;
图2A是本发明的实施例中运行信息确定流程示意;
图3是本发明的一种iOS系统中应用程序的运行信息确定装置实施例的结构框图;
图4是本发明的一种iOS系统中应用程序的运行信息确定装置实施例的结构框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
Objective-C:是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。GCC与Clang含Objective-C的编译器,Objective-C可以在GCC以及Clang运作的系统上编译。
实施例一
参照图1,示出了本发明的一种iOS系统中应用程序的运行信息确定方法实施例的步骤流程图,所述iOS系统中设置有多个线程,所述线程包含至少一个方法对象,具体可以包括如下步骤:
步骤101,当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;
本发明实施例中,基于iOS系统的应用开发所使用的Objective-C,是一种通过提供类定义、方法以及属性的动态语言,其所有的方法调用经过编译器处理都会转化为objc_msgSend系列的函数的调用,即所有方法调用都会归结到统一的入口,也就是说iOS系统中应用程序开发中,应用程序通过预设入口函数objc_msgSend调用时系统线程中任一方法对象时,将该预设入口函数进行拦截。
在实际应用中,通常使用Hook函数拦截预设入口函数,其中,Hook函数是通过重新绑定二进制动态符号地址的方式完成预设入口函数的替换。
步骤102,将所述预设入口函数替换为目标函数;
本发明实施例中,当通过上述描述的Hook函数捕捉到预设入口函数后,将该预设入口函数将要调用的整个程序进程在系统挂起,并将预设入口函数替换为目标函数。
其中,目标函数是自定义的实现my_objc_msgSend,Hook可通过重新绑定二进制动态符号地址的方式完成。这样之后各线程每一次方法对象的调用都会进入my_objc_msgSend的实现中。
步骤103,当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;
本发明实施例中,在将预设入口函数替换为目标函数后,所有线程的方法对象的运行都会进入到目标函数中,目标函数可以收集方法对象运行的各种参数,即方法对象的运行状态。
其中,由于各线程之间的方法调用是独立的,不存在调用和时序上的关系,所以对方法调用情况的收集需要区分线程分别进行,其具体处理逻辑体现在自定义方法调用入口函数的实现上。自定义方法调用入口函数采用了汇编语言来保证收集性能和对原有代码逻辑的无侵入性。
步骤104,所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;
本发明实施例中,为了遵循Objective-C的调用约定,避免获取调用开始信息的代码逻辑破坏原有调用现场,需事先保存调用现场,即运行状态,所以根据收集方法对象的运行过程构建堆栈器,堆栈器是一缓存器,通过方法对象的运行信息写入的先后顺序进行入栈操作,在方法对象运行结束后,对方法对象的运行信息进行出栈操作。
其中,堆栈器中存储包括寄存器和栈的信息,这里发挥了汇编语言对系统寄存器粒度操作能力。
步骤105,所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;
本发明实施例中,在堆栈器中,目标函数记录调用开始信息,包括类名、Selector、是实例方法或类方法、执行开始时间。这部分记录的目的是在方法调用结束时,通过结束时间减去开始时间获取到方法执行的整体耗时。
其中,当前方法内部可能会继续调用新的子方法,在调用结束部分通过堆栈器的栈式结构找到对应的开始信息,每个线程均维护一个独立的栈存储区域,在调用开始时将开始信息进行入栈操作,调用结束时进行出栈操作,栈顶便是与结束信息对应的开始信息。通过出入栈的时间生成方法对象的运行时间。
步骤106,所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间;
本发明实施例中,由于每个线程均维护一个独立的栈存储区域,根据该独立的栈存储区域中每个线程中包含的方法对象的运行开始时间和结束时间,可以确定各方法对象在线程中的调用关系,以及线程的整体运行时间。
其中,最早开始运行的方法对象的时间和最晚结束的方法对象运行时间之差,即是该线程的运行时间。
步骤107,所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息。
本发明实施例中,各线程之间的方法调用是独立的,不存在调用和时序上的关系,所以从线程中每个方法对象的开始和结束的时序上,可以得知各方法对象之间的调用关系,例如,方法对象A的开始时间和结束时间包含方法对象B的开始时间和结束时间,那么方法对象A是包含方法对象B的,即A调用B。
在本发明实施例中,当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;将所述预设入口函数替换为目标函数;当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间;所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息。具备不依赖编码环境,通过堆栈器读写时间而确定方法对象运行时间的有益效果。
实施例二
参照图2,示出了本发明的一种iOS系统中应用程序的运行信息确定方法实施例的步骤流程图,具体可以包括如下步骤:
步骤201,当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;
此步骤与步骤101相同,在此不再上述。
步骤202,将所述预设入口函数替换为目标函数;
此步骤与步骤102相同,在此不再上述。
步骤203,当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;
此步骤与步骤103相同,在此不再上述。
步骤204,所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;
此步骤与步骤104相同,在此不再上述。
步骤205,所述方法对象的运行时间包括所述方法对象的第一运行起始时间和第一运行结束时间,以及,所述方法对象的第一运行耗时;所述方法对象运行开始,所述目标函数将所述方法对象的运行状态在所述堆栈器中执行入栈操作;
具体地,将方法对象的运行时间定义为第一运行耗时,那么可以根据该方法对象的第一运行起始时间和第一运行结束时间来计算第一运行耗时。
其中,如图2A所示,当任一方法对象调用执行前获取其当前的运行状态,即记录该方法对象的名称和开始时间信息,包括各个寄存器的值,以arm64为例,包括r0~r8,sp fplr等数据,保存在堆栈器中,即将上述信息进行入栈操作。
步骤206,所述方法对象运行结束,所述目标函数将所述方法对象的所述运行状态从所述堆栈器中执行出栈操作;
具体地,如图2A所示,利用目标函数执行上述方法对象,在当上述方法对象运行结束时,将该方法对象开始时入栈的运行状态执行出栈操作,并利用目标函数调用该方法对象的结束时间。
步骤207,所述目标函数通过所述入栈操作的时间,确定所述方法对象的第一运行起始时间;
具体地,堆栈器的栈结构决定了先入先出,后入后出的执行顺序,由于各线程之间的方法调用是独立的,不存在调用和时序上的关系,入栈和出栈时间也是独立且互不干扰,所以可以将方法对象对应运行信息的入栈时间确定为方法对象的第一运行起始时间。
步骤208,所述目标函数通过所述出栈操作的时间,确定所述方法对象的第一运行结束时间;
同样地,可以将方法对象对应运行信息的出栈时间确定为方法对象的第一运行结束时间。
步骤209,所述目标函数根据所述第一运行起始时间和所述第一运行结束时间之差,确定所述方法对象的第一运行耗时。
具体地,第一运行起始时间和第一运行结束时间之差,即为该方法对象的第一运行耗时。
步骤210,所述线程的运行时间包括所述线程的第二运行起始时间和第二运行结束时间,以及,所述线程的第二运行耗时;所述目标函数根据各所述方法对象的所述第一运行起始时间和所述第一运行结束时间,确定所述线程的第二运行起始时间和第二运行结束时间;
具体地,将现场的运行时间定义为第二运行耗时,其开始时间为第二运行起始时间,其结束时间为第二运行结束时间,那么通过线程中各方法对象的第一运行起始时间和第一运行结束时间,可以确定线程的第二运行起始时间和第二运行结束时间。
例如,线程A中包含方法对象a、b,a是最先开始运行的方法对象,b是最后结束的方法对象,那么a的第一开始时间即为线程A的第二开始时间,b的第一结束时间即为线程A的第二结束时间。
步骤211,所述目标函数根据所述第二运行起始时间和所述第二运行结束时间之差,确定所述线程的第二运行耗时;
同样地,如上所述,线程A中包含方法对象a、b,a是最先开始运行的方法对象,b是最后结束的方法对象,那么a的第一开始时间和b的第一结束之间之差,即为线程A的运行耗时,即第二运行耗时。
步骤212,所述目标函数根据所述方法对象的所述第一运行起始时间和所述第一运行耗时,确定所述方法对象在所述线程中的运行起始顺序和结束顺序;
同样地,如上所述,线程A中包含方法对象a、b,a的第一开始时间为12:00,a的第一运行耗时为30秒,而b的第一开始时间为12:01,b的第一运行耗时为20秒,那么a先开始后结束,b后开始先结束。
步骤213,通过所述起始顺序和结束顺序,确定所述方法对象在所述线程中的调用关系。
如上述的,那么b是包含在a内的方法对象,即a调用b,如果b的第一运行耗时为40秒,那么b就不是a调用的方法对象。
步骤214,所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息。
此步骤与步骤107相同,在此不再上述。
步骤215,将所述目标函数还原为所述预设入口函数;
具体地,记录完成调用开始信息后,需要执行当前方法原有的实现,也就是准备好入参调用原始的入口函数。此时,目标函数停止运行,即返回原有的预设入口函数。
步骤216,所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,所述方法对象读取所述堆栈器中存储的所述运行状态;
具体地,返回原预设入口函数后,调用原始的入口函数,执行原始的代码逻辑,此时,需要读取线程中各方法对象被目标函数执行时的初始状态,可以从堆栈器中读取在目标函数开始调用方法对象时存储的各方法对象的运行状态,其中包括方法对象的名称和开始时间信息,以及各个寄存器的值,以arm64为例,包括r0~r8,sp fp lr等数据。
步骤217,所述方法对象根据所述运行状态恢复运行。
具体地,通过上述数据对各方法对象进行恢复运行。
其中,如图2A所示的,为了在返回调用者时不破坏返回值的传递,需要再次对调用现场进行保存,程序的执行流程交还给调用者,还原原有执行逻辑。
例如,将objc_msgSend替换为原始的实现,结束对方法调用信息的持续收集,针对各线程收集到数据分别进行处理分析,因为同一线程内的各方法的执行不存在交错的情况,在时序上看只会存在包含或者不包含的情况,如果包含则说明两个方法存在调用执行关系,不包含则说明两个方法存在先后执行关系。得到方法两两之间的调用关系,便可以得到该线程所有方法的执行时长和相互调用关系。对所有线程进行这样的处理,就可以实现对整个程序代码执行情况的统计。
在本发明实施例中,当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;将所述预设入口函数替换为目标函数;当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间;所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息。将所述目标函数还原为所述预设入口函数;所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,所述方法对象读取所述堆栈器中存储的所述运行状态;所述方法对象根据所述运行状态恢复运行。具备通过堆栈器读写时间而确定方法对象运行时间后,恢复方法调用的正常运行的有益效果。
实施例三
参照图3,示出了本发明的一种iOS系统中应用程序的运行信息确定装置实施例的结构框图,所述iOS系统中设置有多个线程,所述线程包含至少一个方法对象,具体可以包括如下模块:
入口函数拦截模块301,用于当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;
入口函数替换模块302,用于将所述预设入口函数替换为目标函数;
运行状态获取模块303,用于当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;
堆栈器构建模块304,用于所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;
方法对象运行时间生成模块305,用于所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;
线程的运行时间确定模块306,用于所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间;
应用程序运行信息确定模块307,用于所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息。
在本发明实施例中,入口函数拦截模块,用于当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;入口函数替换模块,用于将所述预设入口函数替换为目标函数;运行状态获取模块,用于当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;堆栈器构建模块,用于所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;方法对象运行时间生成模块,用于所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;线程的运行时间确定模块,用于所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间;应用程序运行信息确定模块,用于所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息。具备不依赖编码环境,通过堆栈器读写时间而确定方法对象运行时间的有益效果。
实施例四
参照图4,示出了本发明的一种iOS系统中应用程序的运行信息确定装置实施例的结构框图,所述iOS系统中设置有多个线程,所述线程包含至少一个方法对象,具体可以包括如下模块:
入口函数拦截模块301,用于当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;
入口函数替换模块302,用于将所述预设入口函数替换为目标函数;
运行状态获取模块303,用于当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;
堆栈器构建模块304,用于所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;
方法对象运行时间生成模块305,用于所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;
优选地,所述方法对象的运行时间包括所述方法对象的第一运行起始时间和第一运行结束时间,以及,所述方法对象的第一运行耗时;所述方法对象运行时间生成模块305,包括:
入栈子模块,用于所述方法对象运行开始,所述目标函数将所述方法对象的运行状态在所述堆栈器中执行入栈操作;
出栈子模块,用于所述方法对象运行结束,所述目标函数将所述方法对象的所述运行状态从所述堆栈器中执行出栈操作;
第一运行起始时间确定子模块,用于所述目标函数通过所述入栈操作的时间,确定所述方法对象的第一运行起始时间;
第一运行结束时间确定子模块,用于所述目标函数通过所述出栈操作的时间,确定所述方法对象的第一运行结束时间;
第一运行耗时确定子模块,用于所述目标函数根据所述第一运行起始时间和所述第一运行结束时间之差,确定所述方法对象的第一运行耗时。
线程的运行时间确定模块306,用于所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间;
优选地,所述线程的运行时间包括所述线程的第二运行起始时间和第二运行结束时间,以及,所述线程的第二运行耗时;所述线程的运行时间确定模块306,包括:
线程的运行时间确定子模块,用于所述目标函数根据各所述方法对象的所述第一运行起始时间和所述第一运行结束时间,确定所述线程的第二运行起始时间和第二运行结束时间;
线程的第二运行耗时确定子模块,用于所述目标函数根据所述第二运行起始时间和所述第二运行结束时间之差,确定所述线程的第二运行耗时;
顺序确定子模块,用于所述目标函数根据所述方法对象的所述第一运行起始时间和所述第一运行耗时,确定所述方法对象在所述线程中的运行起始顺序和结束顺序;
调用关系确定子模块,用于通过所述起始顺序和结束顺序,确定所述方法对象在所述线程中的调用关系。
应用程序运行信息确定模块307,用于所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息。
预设入口函数还原模块308,用于将所述目标函数还原为所述预设入口函数;
运行状态读取模块309,用于所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,所述方法对象读取所述堆栈器中存储的所述运行状态;
恢复运行模块310,用于所述方法对象根据所述运行状态恢复运行。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本发明实施例还提供一种设备,包括:处理器、存储器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如上述的一个或多个所述的iOS系统中应用程序的运行信息确定方法。
本发明实施例还提供一种可读存储介质,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行如所述的iOS系统中应用程序的运行信息确定方法。
综上所述,在本发明实施例中,通过入口函数拦截模块,用于当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;入口函数替换模块,用于将所述预设入口函数替换为目标函数;运行状态获取模块,用于当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;堆栈器构建模块,用于所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;方法对象运行时间生成模块,用于所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;线程的运行时间确定模块,用于所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间;应用程序运行信息确定模块,用于所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息。预设入口函数还原模块,用于将所述目标函数还原为所述预设入口函数;运行状态读取模块,用于所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,所述方法对象读取所述堆栈器中存储的所述运行状态;恢复运行模块,用于所述方法对象根据所述运行状态恢复运行。具备通过堆栈器读写时间而确定方法对象运行时间后,恢复方法调用的正常运行的有益效果。其具有如下优点:
一.采用面向切面编程技术,对源代码没有侵入性
二.没有对调试环境的依赖,可以工作于生产环境下
三.可以保证方法统计的全面性,不会存在信息丢失
四.不需要源码也可以正常工作,可以用来统计三方库
五.集成便利,无需重复耗费人力,可适应程序的不断迭代
六.统计结果的输出格式可控,便于后续的自动化分析处理
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本发明所提供的一种iOS系统中应用程序的运行信息确定方法和一种iOS系统中应用程序的运行信息确定装置,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (8)

1.一种iOS系统中应用程序的运行信息确定方法,所述iOS系统中设置有多个线程,所述线程包含至少一个方法对象,其特征在于,所述的方法包括:
当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;
将所述预设入口函数替换为目标函数;以使所述线程的方法对象的运行进入到所述目标函数中;
当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;
所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;
所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;
所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间;
所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息;
其中,每个线程均维护一个独立的栈存储区域,根据该独立的栈存储区域中每个线程中包含的方法对象的运行开始时间和结束时间,确定该线程的运行时间;
将所述目标函数还原为所述预设入口函数;
所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,所述方法对象读取所述堆栈器中在所述目标函数开始调用方法对象时存储的各方法对象的运行状态;
所述方法对象根据所述运行状态恢复运行。
2.根据权利要求1所述的方法,其特征在于,所述方法对象的运行时间包括所述方法对象的第一运行起始时间和第一运行结束时间,以及,所述方法对象的第一运行耗时;所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间的步骤,包括:
所述方法对象运行开始,所述目标函数将所述方法对象的运行状态在所述堆栈器中执行入栈操作;
所述方法对象运行结束,所述目标函数将所述方法对象的所述运行状态从所述堆栈器中执行出栈操作;
所述目标函数通过所述入栈操作的时间,确定所述方法对象的第一运行起始时间;
所述目标函数通过所述出栈操作的时间,确定所述方法对象的第一运行结束时间;
所述目标函数根据所述第一运行起始时间和所述第一运行结束时间之差,确定所述方法对象的第一运行耗时。
3.根据权利要求2所述的方法,其特征在于,所述线程的运行时间包括所述线程的第二运行起始时间和第二运行结束时间,以及,所述线程的第二运行耗时;所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间的步骤,包括:
所述目标函数根据各所述方法对象的所述第一运行起始时间和所述第一运行结束时间,确定所述线程的第二运行起始时间和第二运行结束时间;
所述目标函数根据所述第二运行起始时间和所述第二运行结束时间之差,确定所述线程的第二运行耗时;
所述目标函数根据所述方法对象的所述第一运行起始时间和所述第一运行耗时,确定所述方法对象在所述线程中的运行起始顺序和结束顺序;
通过所述起始顺序和结束顺序,确定所述方法对象在所述线程中的调用关系。
4.一种iOS系统中应用程序的运行信息确定装置,所述iOS系统中设置有多个线程,所述线程包含至少一个方法对象,其特征在于,包括:
入口函数拦截模块,用于当所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,拦截所述预设入口函数;
入口函数替换模块,用于将所述预设入口函数替换为目标函数;以使所述线程的方法对象的运行进入到所述目标函数中;
运行状态获取模块,用于当所述目标函数在所述方法对象中运行时,获取所述方法对象的运行状态;
堆栈器构建模块,用于所述目标函数构建堆栈器,在所述堆栈器中写入和读取所述运行状态;
方法对象运行时间生成模块,用于所述目标函数根据所述运行状态在所述堆栈器中的写入和读取的时间,生成所述方法对象的运行时间;
线程的运行时间确定模块,用于所述目标函数通过所述方法对象的运行时间,确定所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间;
应用程序运行信息确定模块,用于所述目标函数根据所述方法对象在所述线程中的调用关系,以及,所述线程的运行时间,确定所述应用程序的运行信息;
其中,每个线程均维护一个独立的栈存储区域,根据该独立的栈存储区域中每个线程中包含的方法对象的运行开始时间和结束时间,确定该线程的运行时间;
预设入口函数还原模块,用于将所述目标函数还原为所述预设入口函数;
运行状态读取模块,用于所述应用程序通过预设入口函数,调用所述线程中任一所述方法对象时,所述方法对象读取所述堆栈器中在所述目标函数开始调用方法对象时存储的各方法对象的所述运行状态;
恢复运行模块,用于所述方法对象根据所述运行状态恢复运行。
5.根据权利要求4所述的装置,其特征在于,所述方法对象的运行时间包括所述方法对象的第一运行起始时间和第一运行结束时间,以及,所述方法对象的第一运行耗时;所述方法对象运行时间生成模块,包括:
入栈子模块,用于所述方法对象运行开始,所述目标函数将所述方法对象的运行状态在所述堆栈器中执行入栈操作;
出栈子模块,用于所述方法对象运行结束,所述目标函数将所述方法对象的所述运行状态从所述堆栈器中执行出栈操作;
第一运行起始时间确定子模块,用于所述目标函数通过所述入栈操作的时间,确定所述方法对象的第一运行起始时间;
第一运行结束时间确定子模块,用于所述目标函数通过所述出栈操作的时间,确定所述方法对象的第一运行结束时间;
第一运行耗时确定子模块,用于所述目标函数根据所述第一运行起始时间和所述第一运行结束时间之差,确定所述方法对象的第一运行耗时。
6.根据权利要求5所述的装置,其特征在于,所述线程的运行时间包括所述线程的第二运行起始时间和第二运行结束时间,以及,所述线程的第二运行耗时;所述线程的运行时间确定模块,包括:
线程的运行时间确定子模块,用于所述目标函数根据各所述方法对象的所述第一运行起始时间和所述第一运行结束时间,确定所述线程的第二运行起始时间和第二运行结束时间;
线程的第二运行耗时确定子模块,用于所述目标函数根据所述第二运行起始时间和所述第二运行结束时间之差,确定所述线程的第二运行耗时;
顺序确定子模块,用于所述目标函数根据所述方法对象的所述第一运行起始时间和所述第一运行耗时,确定所述方法对象在所述线程中的运行起始顺序和结束顺序;
调用关系确定子模块,用于通过所述起始顺序和结束顺序,确定所述方法对象在所述线程中的调用关系。
7.一种设备,其特征在于,包括:
处理器、存储器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1-3之任一项所述的iOS系统中应用程序的运行信息确定方法。
8.一种可读存储介质,其特征在于,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够实现如权利要求1-3之任一项所述的iOS系统中应用程序的运行信息确定方法。
CN201811512388.8A 2018-12-11 2018-12-11 iOS系统中应用程序的运行信息确定方法、装置 Active CN109783161B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811512388.8A CN109783161B (zh) 2018-12-11 2018-12-11 iOS系统中应用程序的运行信息确定方法、装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811512388.8A CN109783161B (zh) 2018-12-11 2018-12-11 iOS系统中应用程序的运行信息确定方法、装置

Publications (2)

Publication Number Publication Date
CN109783161A CN109783161A (zh) 2019-05-21
CN109783161B true CN109783161B (zh) 2020-08-04

Family

ID=66495849

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811512388.8A Active CN109783161B (zh) 2018-12-11 2018-12-11 iOS系统中应用程序的运行信息确定方法、装置

Country Status (1)

Country Link
CN (1) CN109783161B (zh)

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110442504A (zh) * 2019-08-02 2019-11-12 中国工商银行股份有限公司 基于调用栈分析的性能测试方法和装置
CN110457196B (zh) * 2019-08-16 2023-10-24 腾讯科技(深圳)有限公司 函数执行时间的获取方法及装置
CN110457277B (zh) * 2019-08-19 2024-04-16 北京博睿宏远数据科技股份有限公司 业务处理性能分析方法、装置、设备及存储介质
CN110618940B (zh) * 2019-09-19 2024-02-06 腾讯科技(深圳)有限公司 堆栈信息追踪方法、装置、计算机可读介质及计算装置
CN113535143A (zh) * 2020-04-21 2021-10-22 腾讯科技(深圳)有限公司 堆栈信息处理方法、装置、电子设备和存储介质
CN111966577B (zh) * 2020-07-06 2023-09-08 北京奇艺世纪科技有限公司 一种程序稳定性检测方法及装置
CN112232027A (zh) * 2020-10-19 2021-01-15 腾讯科技(深圳)有限公司 一种符号翻译方法、装置、设备和计算机可读存储介质
CN113535457B (zh) * 2021-09-14 2021-12-10 腾讯科技(深圳)有限公司 检测方法、装置、设备及计算机可读存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103761474A (zh) * 2014-01-24 2014-04-30 北京京东尚科信息技术有限公司 一种用于监控方法执行时间的监控方法和装置
CN104951375A (zh) * 2015-07-01 2015-09-30 北京博睿宏远科技发展有限公司 基于函数拦截技术的手机app性能数据采集方法
CN106055462A (zh) * 2016-05-20 2016-10-26 腾讯科技(深圳)有限公司 一种时长获取方法和装置
CN107480029A (zh) * 2017-08-02 2017-12-15 北京深思数盾科技股份有限公司 一种函数调用时间的监控方法及装置
CN108197004A (zh) * 2018-01-23 2018-06-22 武汉斗鱼网络科技有限公司 Ios应用的方法耗时、加载视图耗时的监测方法及系统

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107766216A (zh) * 2016-08-19 2018-03-06 阿里巴巴集团控股有限公司 一种用于获取应用执行信息的方法与设备

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103761474A (zh) * 2014-01-24 2014-04-30 北京京东尚科信息技术有限公司 一种用于监控方法执行时间的监控方法和装置
CN104951375A (zh) * 2015-07-01 2015-09-30 北京博睿宏远科技发展有限公司 基于函数拦截技术的手机app性能数据采集方法
CN106055462A (zh) * 2016-05-20 2016-10-26 腾讯科技(深圳)有限公司 一种时长获取方法和装置
CN107480029A (zh) * 2017-08-02 2017-12-15 北京深思数盾科技股份有限公司 一种函数调用时间的监控方法及装置
CN108197004A (zh) * 2018-01-23 2018-06-22 武汉斗鱼网络科技有限公司 Ios应用的方法耗时、加载视图耗时的监测方法及系统

Also Published As

Publication number Publication date
CN109783161A (zh) 2019-05-21

Similar Documents

Publication Publication Date Title
CN109783161B (zh) iOS系统中应用程序的运行信息确定方法、装置
CN108984652B (zh) 一种可配置数据清洗系统和方法
CN110603527B (zh) 用于服务器侧生产代码的条件调试的方法、系统和设备
US10296442B2 (en) Distributed time-travel trace recording and replay
US20100223446A1 (en) Contextual tracing
US11144433B2 (en) Analysis and visualization of application concurrency and processor resource utilization
US20120131559A1 (en) Automatic Program Partition For Targeted Replay
EP3093768A3 (en) Debugging systems
CN106951298A (zh) 一种提升应用启动速度的方法和装置
US20150006961A1 (en) Capturing trace information using annotated trace output
CN105302717A (zh) 一种大数据平台的检测方法及装置
US10496423B2 (en) Method for opening up data and functions of terminal application based on reconstruction technology
Mani et al. Test case generation for embedded system software using UML interaction diagram
CN108446224B (zh) 移动端上应用程序的性能分析方法、存储介质
CN107179982B (zh) 一种跨进程调试方法和装置
CN110795326A (zh) 一种代码拦截检测方法、存储介质、电子设备及系统
CN109542341B (zh) 一种读写io监测方法、装置、终端及计算机可读存储介质
CN106649000A (zh) 实时处理引擎的故障恢复方法及相应的服务器
Theelen et al. Model checking of scenario-aware dataflow with CADP
CN111221744B (zh) 数据采集方法、装置及电子设备
CN111026604B (zh) 一种日志文件解析方法及装置
CN113535529B (zh) 业务日志分析方法、装置及计算机可读存储介质
CN113886342A (zh) 文件的格式转换方法、装置、存储介质及处理器
CN113934698A (zh) 日志压缩
US10956304B2 (en) Dynamic diagnostic code instrumentation over a historic program execution

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant