ANR异常数据的收集方法、显示方法、装置及设备与流程

文档序号:27341601发布日期:2021-11-10 03:06阅读:250来源:国知局
ANR异常数据的收集方法、显示方法、装置及设备与流程
anr异常数据的收集方法、显示方法、装置及设备
技术领域
1.本技术实施例涉及计算机技术领域,特别涉及一种anr(application not responding,应用程序未响应)异常数据的收集方法、显示方法、装置及设备。


背景技术:

2.anr是用户在使用运行的应用程序时可能出现的问题。在android系统中,特定的事件需要在规定的时间范围内完成,应用程序如果在规定的时间范围内未能进行有效的响应或者响应时间过长,就会造成anr异常。
3.在相关技术中,当应用程序发生anr异常后,技术人员通过调取操作系统产生的追踪文档(trace.txt)等手段分析anr异常的产生原因。追踪文档中记载了发生anr异常的时间点以及相应时间段内的线程等信息、出现anr异常的应用程序、进程号以及cpu(central processing unit,中央处理器)的负载情况等信息,技术人员通过关键字查询等手段从追踪文档中寻找用于分析anr异常产生原因的数据。
4.然而,由于追踪文档中能收集到的数据有限,并且包含许多底层数据,这些数据对anr异常分析过程没有帮助。在相关技术中,追踪文档不能清晰、明确地显示导致anr异常的原因。


技术实现要素:

5.本技术实施例提供了一种anr异常数据的收集方法、显示方法、装置及设备,可用于解决相关技术中用于分析anr异常的参考信息指向性不强的问题。技术方案如下:
6.根据本技术实施例的一个方面,提供了一种anr异常数据的收集方法,所述方法由目标应用程序执行,所述方法包括:
7.采集所述目标应用程序的运行数据,所述运行数据包括主线程调用栈数据、主线程任务数据和函数执行数据;其中,所述主线程调用栈数据用于指示所述目标应用程序的主线程的调用情况,所述主线程任务数据用于指示所述主线程在不同时间的任务执行情况,所述函数执行数据用于指示所述目标应用程序的线程中的函数执行情况;
8.记录所述运行数据;
9.在所述目标应用程序发生anr的情况下,向服务器上报anr异常数据,所述anr异常数据包括所述anr的发生时间以及与所述anr对应的所述运行数据。
10.根据本技术实施例的一个方面,提供了一种anr异常数据的收集方法,所述方法由分析设备执行,所述方法包括:
11.从服务器获取目标应用程序的anr异常数据,所述anr异常数据包括所述目标应用程序的anr的发生时间以及与所述anr对应的运行数据,所述运行数据包括主线程调用栈数据、主线程任务数据和函数执行数据;其中,所述主线程调用栈数据用于指示所述目标应用程序的主线程的调用情况,所述主线程任务数据用于指示所述主线程在不同时间的任务执行情况,所述函数执行数据用于指示所述目标应用程序的线程中的函数执行情况;
12.可视化显示所述运行数据。
13.根据本技术实施例的一个方面,提供了一种anr异常数据的收集装置,所述装置包括:
14.采集模块,用于采集所述目标应用程序的运行数据,所述运行数据包括主线程调用栈数据、主线程任务数据和函数执行数据;其中,所述主线程调用栈数据用于指示所述目标应用程序的主线程的调用情况,所述主线程任务数据用于指示所述主线程在不同时间的任务执行情况,所述函数执行数据用于指示所述目标应用程序的线程中的函数执行情况;
15.记录模块,用于记录所述运行数据;
16.上报模块,用于在所述目标应用程序发生anr的情况下,向服务器上报anr异常数据,所述anr异常数据包括所述anr的发生时间以及与所述anr对应的所述运行数据。
17.根据本技术实施例的一个方面,提供了一种anr异常数据的显示装置,所述装置包括:
18.获取模块,用于从服务器获取目标应用程序的anr异常数据,所述anr异常数据包括所述目标应用程序的anr的发生时间以及与所述anr对应的运行数据,所述运行数据包括主线程调用栈数据、主线程任务数据和函数执行数据;其中,所述主线程调用栈数据用于指示所述目标应用程序的主线程的调用情况,所述主线程任务数据用于指示所述主线程在不同时间的任务执行情况,所述函数执行数据用于指示所述目标应用程序的线程中的函数执行情况;
19.显示模块,用于可视化显示所述运行数据。
20.根据本技术实施例的一个方面,提供了一种计算机设备,所述计算机设备包括处理器和存储器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序以实现上述anr异常数据的收集方法,或实现上述anr异常数据的显示方法。
21.根据本技术实施例的一个方面,提供了一种计算机可读存储介质,所述存储介质中存储有计算机程序,所述计算机程序用于被处理器执行,以实现上述anr异常数据的收集方法,或实现上述anr异常数据的显示方法。
22.根据本技术的一个方面,提供了一种计算机程序产品,当所述计算机程序产品在计算机设备上运行时,使得计算机设备执行如上述anr异常数据的收集方法,或者上述anr异常数据的显示方法。
23.本技术实施例提供的技术方案可以带来如下有益效果:
24.本技术提供一种anr异常数据的收集方法,通过应用程序采集并记录运行数据,运行数据包括:主线程调用栈数据、主线程任务数据和函数执行数据,并在应用程序产生anr的情况下,将记录的主线程调用栈数据、主线程任务数据和函数执行数据发送给服务器,实现了针对性收集用于分析anr异常的数据,本方法能够为anr异常分析提供有效的数据,降低了anr异常的分析难度。
25.本技术还提供一种anr异常数据的显示方法,通过分析设备从服务器获取目标应用程序的anr异常数据,并可视化显示运行数据,实现了按照时间线清晰,直观地展示目标应用程序出现anr异常前一段时间内目标应用程序的运行场景,有助于分析anr异常的产生原因。
附图说明
26.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
27.图1是本技术一个实施例提供的网络构架的示意图;
28.图2示例性示出了子线程的消息访问主线程方法的示意图;
29.图3示例性示出了调用栈结构的示意图;
30.图4是本技术一个实施例提供的anr异常数据的收集方法的流程图;
31.图5是本技术一个实施例提供的anr异常数据的显示方法的流程图;
32.图6是本技术一个实施例提供的可视化显示运行数据的示意图;
33.图7是本技术另一个实施例提供的可视化显示主线程调用栈数据的示意图;
34.图8是本技术另一个实施例提供的可视化显示主线程任务数据的示意图;
35.图9是本技术另一个实施例提供的可视化显示函数执行数据的示意图;
36.图10是本技术一个实施例提供的anr异常数据的收集装置的框图;
37.图11是本技术另一个实施例提供的anr异常数据的显示装置的框图;
38.图12是本技术一个实施例提供的计算机设备的示意图。
具体实施方式
39.在介绍本技术技术方案之前,先对本技术涉及的一些背景技术知识进行介绍说明。以下相关技术作为可选方案与本技术实施例的技术方案可以进行任意结合,其均属于本技术实施例的保护范围。本技术实施例包括以下内容中的至少部分内容。
40.本技术实施例描述的系统架构以及业务场景是为了更加清楚地说明本技术实施例的技术方案,并不构成对本技术实施例提供的技术方案的限定,本领域普通技术人员可知,随着系统架构的演变和新业务场景的出现,本技术实施例提供的技术方案对于类似的技术问题,同样适用。
41.请参考图1,其示出了本技术一个实施例提供的系统架构的示意图。该系统架构可以包括:电子设备10、服务器20和分析设备30。
42.其中,上述电子设备10运行有目标应用程序,该目标应用程序可以是视频应用程序、主播应用程序和社交应用程序等,目标应用程序的类型在此不进行限定,该电子设备10可以是智能手机,平板电脑,台式计算机,便携式计算机,智能电视,vr设备等拥有进程、线程具备交互功能的电子设备。
43.上述服务器20是具有接收、存储、发送数据的功能的设备,用以接收、存储目标应用程序发生anr时发送的运行数据,并在分析设备30向服务器20请求目标应用程序的运行数据时,将存储的anr异常发生前一段时间内的目标应用程序的运行数据发送给分析设备30。服务器20可以是独立的服务器设备,也可以是多个物理服务器构成的服务器集群或者分布式系统。服务器20可以是一台服务器,也可以是由多台服务器组成的服务器集群,或者是一个云计算服务中心。
44.上述分析设备30是具有发送、存储、接收功能并具有将数据进行可视化显示能力
的设备,该分析设备30可以是智能手机,平板电脑,台式计算机,便携式计算机,智能电视等具有一定运算能力,能够显示图形数据的设备。
45.下面,以android系统为例,对主线程与子线程的相关内容进行介绍。
46.主线程又称为ui(user interface,用户界面)线程或界面线程,主线程用于更新ui界面的线程。在应用程序创建过程中,应用程序的主线程是系统默认生成的,不能通过用户自行创建,每个应用程序只拥有一个主线程。主线程负责处理用户对应用程序进行交互所产生的按键事件、触摸事件和屏幕绘制等事件,这些事件通过主线程控制的ui组件完成,常用的ui组件包括:折叠面板、操作表、数字角标、按钮和对话框。系统通过主线程控制ui组件,主线程负责向ui组件分发时间(包括绘制事件)。
47.子线程又称为工作者(worker thread)线程:工作者线程是除去主线程外的其他任意线程。
48.主线程负责与用户进行交互,通常来说,只有进程中主线程任务响应超时才会导致anr异常,anr异常会导致系统崩溃,造成应用程序无法使用的情况,子线程的阻塞或响应缓慢不会导致anr异常。因此,为了减少anr异常的产生保证主线程的安全,通常使用子线程处理复杂耗时的工作,子线程无法直接访问ui组件,但通过访问主线程,访问ui组件。
49.请参考图2,以andriod系统为例,其示出了子线程的消息访问主线程的方法示意图。
50.在主线程创建的过程中,andriod系统为主线程指派消息队列与消息循环,子线程产生的消息通过looper和handler工具访问主线程消息队列并在主线程中执行。在handler的构造过程中,系统可以将handler指定给主线程对应的looper,随后handler能够将消息添加进主线程的looper管理的消息队列中。looper用于循环访问消息队列,子线程通过handler将消息添加进主线程的消息队列中,主线程通过looper从主线程消息队列中获取消息,实现消息循环。
51.下面对anr异常的产生原因进行介绍说明。
52.在android系统中,主线程中初始化一个消息队列(message queue)来处理ui消息。通常情况下,消息队列存储在一个链表当中,消息队列中的任务按照待执行的时间顺序有序地存储在消息队列中,其中,ui消息包括asm(automatic storage management,自动存储管理)的回调消息和应用程序内部产生的消息。ui消息队列中特定的任务消息对应特定的时间范围,在规定时间范围内任务消息不能完成就会触发anr异常,产生anr异常的原因可以包括但不限于:
53.1.主线程中进行长时间的计算;
54.2.主线程中执行了耗时的i/o操作;
55.3.主线程处于阻塞状态,等待获取锁;
56.4.主线程与其他线程之间发生死锁;
57.5.主线程与其他线程进行同步的binder(粘和)调用。
58.下面,对关于回调函数的相关内容进行介绍说明。
59.所谓回调函数,就是在调用方把一个需要被回调的函数作为参数,传递给要调用的函数,被调用的函数执行完成后,通过该参数返回来调用此函数,作为参数传递的该函数就称作回调函数。
60.下面,将结合图3对线程调用栈的相关内容进行介绍说明。
61.请参考图3,其示出了调用栈的结构的示意图。
62.以android系统为例,调用栈,也称为执行栈、控制栈、运行时栈和机器栈,是用于存储运行中应用程序产生的数据的数据结构。调用栈中主要存放返回地址、本地变量、参数以及运行环境,其中,返回地址是指当前函数执行完成后下一条执行指令的地址。调用栈用于跟踪每个活动的子例程在完成执行后应该返回控制的点。
63.调用栈由若干个栈帧组成,每一个栈帧对应一个函数,栈帧中包括:函数参数、返回地址和帧内的本地变量。调用栈的运行方向是由上向下的,栈指针指向栈顶,帧指针指向上一个栈帧,通过帧指针可以遍历整个调用栈。通过遍历调用栈获取整个函数的调用关系,获得函数的真实存储地址进而获函数的名称与运行过程的相关信息。
64.相关技术中,对于线上异常的分析依赖于日志系统。目前常用的anr异常分析方法主要依赖于android系统内核日志数据和一些简单的自定义内存数据以及进程占用等数据。然而,通过这些数据,排查应用程序发生的anr异常的原因是一件非常困难的事情,相关技术难以找出导致anr异常产生的因素的原因,主要包括以下几点:
65.1.相关技术中监控手段收集到的日志数据非常有限,收集到的日志数据中缺少很多的关键数据;
66.2.相关技术中收集到的应用程序运行数据晦涩难懂,往往有许多系统层面的日志数据,例如cpu数据、线程占用情况等数据,这些数据通常难以与应用程序的业务相对应,因此难以定位具体的业务问题;
67.3.由于相关技术中收集到的应用数据,运行数据晦涩难懂,导致分析anr异常分析具有较高的技术门槛,开发人员在难以直观地通过应用数据,运行数据找到导致anr异常的原因;
68.4.导致anr异常产生的原因是多种多样的,引起应用程序出现anr异常的不仅可能是当前正在执行的、耗时过长的任务,而且可能是anr异常产生前的一个或多个耗时任务。通过相关技术收集到anr异常发生时的日志数据在部分情况下无法反应出anr发生时应用程序的运行内容,因此难以找到导致anr异常产生的原因。
69.因此,需要一个更加完善的anr异常数据收集方法,该方法能够更准确地还原anr异常发生前、发生时、发生后的应用程序执行现场,通过提供充分的现场数据,使得开发人员能够更直观地、快速地排查anr异常产生的原因。
70.为使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术实施方式作进一步地详细描述。
71.请参考图4,其示出了本技术一个实施例的提供的anr异常数据的收集方法的流程图,本方法各步骤的执行主体可以是电子设备中的目标应用程序,该方法可以包括如下几个步骤(410

430)中的至少一个步骤:
72.步骤410,采集目标应用程序的运行数据,运行数据包括主线程调用栈数据、主线程任务数据和函数执行数据;其中,主线程调用栈数据用于指示目标应用程序的主线程的调用情况,主线程任务数据用于指示主线程在不同时间的任务执行情况,函数执行数据用于指示目标应用程序的线程中的函数执行情况。
73.目标应用程序是一类至少能与用户进行交互的、能够产生anr异常的计算机程序。
运行数据是指目标应用程序在运行过程中产生的、能反映应用程序某一时刻或某段时间的执行情况的数据。主线程是指负责与用户进行交互的线程,关于主线程的详细介绍请参考上文。主线程任务数据是指能反映主线程消息队列中任务执行信息、执行情况的数据。
74.在一些实施例中,目标应用程序获取主线程调用栈数据的时间间隔是固定的,也称为周期性获取;在一些实施例中,目标应用程序获取主线程调用栈数据的时间间隔是不固定的。在一些实施例中,目标应用程序的主线程任务数据和函数执行数据是实时获取的。
75.在一些实施例中,运行数据还包括接口调用栈,接口调用栈是指应用程序中一种语言调用其他语言的接口。在一些实施例中,接口调用栈的类型是native(本地)接口,native接口是java用来调用c++程序的接口。
76.在一些实施例中,目标应用程序的目标包中插入有监听函数,监听函数用于采集、记录和上报运行数据;目标包中需要进行anr异常监控的位置插入有开启命令,开启命令用于触发执行监听函数。
77.目标包是指需要监听的、一组相关的类或接口的集合,通过在目标应用程序中的目标包中插入监听函数,使得目标应用程序能够通过监听函数获得上述运行数据。在一些实施例中,监听函数是通过插桩的方式插入到目标应用程序的。在一些实施例中,目标应用程序中通过使用asm的插桩方法将监听函数插入到目标包中,监听函数在应用程序运行过程中采集、记录主线程调用栈数据,主线程任务数据和函数执行数据,并在发生anr异常的时刻,将记录的上述运行数据发送给服务器。
78.步骤420,记录运行数据。
79.在一些实施例中,记录运行数据,包括:应用程序将主线程调用栈数据、主线程任务数据和函数执行数据,分别存储至相应的存储队列中;其中,存储队列用于采用先入先出的方式,记录最近一段时间的运行数据。
80.在一些实施例中,主线程调用栈数据对应的存储队列的容量是根据监听的时长与监听的时间间隔确定的,存储队列的容量是指存储队列中能储存运行数据的个数,例如目标应用程序需要监听anr发生前30s内的运行数据,采集主线程调用栈数据的周期1s,于是,主线程调用栈数据对应的存储队列的容量需要大于等于30。通常情况下,主线程任务数据与函数执行数据对应的存储队列压缩后的大小应保持在几兆以内,主线程任务数据和函数执行数据对应的存储队列的容量是通过多次实验获得的,在此不进行具体限定。在一些实施例中,在监听主线程调用栈数据的时间范围内,目标应用程序产生的主线程任务数据和函数执行数据在对应的的存储队列中能找到,此外,主线程任务数据和函数执行数据对应的存储队列中还可以包含上述监听时间范围之外,目标应用程序产生的主线程任务数据和函数执行数据。在一些实施例中,存储队列中用于采用先入先出的方式,记录最近一段时间的运行数据是指在存储队列内存储的运行数据达到存储队列容量的情况下,存储队列会将最先写入的运行数据丢弃,并写入新的运行数据。在一些实施例中,最近一段时间是指应用程序监听运行数据的时间范围。在一些实施例中,存储队列使用poll方法将旧的运行数据移出存储队列,使用push方法将新的运行数据写入存储队列。
81.步骤430,在目标应用程序发生anr的情况下,向服务器上报anr异常数据,anr异常数据包括该anr的发生时间以及与该anr对应的运行数据。
82.与anr对应的运行数据是指当产生anr时,存储队列中记录的主线程调用栈数据、
主线程任务数据和函数执行数据。在一些实施例中,在发生anr的情况下,应用程序将创建一个文档,文档的名称为anr的发生时间,文档的内容为与anr对应的运行数据,应用程序将上述文档上传给服务器。
83.在一些实施例中,应用程序在运行过程中采集并记录主线程调用栈数据、主线程任务数据和函数执行数据,当应用程序发生anr异常时,应用程序将存储队列中记录的主线程调用栈数据、主线程任务数据和函数执行数据发送给服务器。
84.综上所述,通过应用程序采集并记录主线程调用栈数据、主线程任务数据和函数执行数据,并在应用程序产生anr的情况下,将记录的主线程调用栈数据、主线程任务数据和函数执行数据发送给服务器,实现了针对性收集导致anr异常的运行数据的目的,为anr异常分析提供了完整的应用程序运行场景,降低了anr异常的分析难度。
85.下面,对采集目标应用程序的运行数据的方法进行介绍说明。
86.在一些实施例中,主线程调用栈数据包括至少一组主线程堆栈信息和调用时间信息之间的对应关系;
87.采集目标应用程序的运行数据,包括:
88.获取主线程堆栈信息,主线程堆栈信息用于指示主线程中各类方法间的调用关系;
89.获取主线程堆栈信息对应的调用时间信息,调用时间信息用于指示主线程堆栈信息的获取时刻。
90.在一些实施例中,应用程序周期性采集主线程调用栈信息,在每一个采样周期中,应用程序通过监控状态确定是否采集主线程调用栈信息,在确定采集主线程调用栈信息的情况下,应用程序使用运行栈信息获取工具获取主线程堆栈信息,使用时间获取工具获取主线程堆栈信息对应的调用时间信息;应用程序在确定不采集主线程调用栈信息的情况下,不对主线程调用栈信息进行采集。在一些实施例中,线程堆栈信息对应的调用时间信息是通过当前时间减去开始监控目标应用程序的时间获取的。在一些实施例中,在某一个采样周期中,应用程序在获取主线程调用栈信息与主线程堆栈信息对应的调用时间信息之后,构建一个主线程调用栈的对象,并将获取的主线程堆栈信息与主线程堆栈信息对应的调用时间信息记录在构建的主线程调用栈的对象中。
91.在一些实施例中,在应用程序确定获取主线程调用栈信息的情况下,开始监测时间为t,应用程序通过thread.currentthread().getstacktrace()或thread.stacktrace方法获取主线程堆栈信息,应用程序使用system.nanotime()获取当前时间t,通过t

t获得主线程堆栈信息对应的调用时间信息。
92.通过获取主线程调用栈信息可以掌握主线程调用栈中的调用情况,有利于分析anr异常的产生原因。
93.在一些实施例中,主线程任务数据包括:至少一个目标任务的开始执行时间、执行时长和cpu占用时长,目标任务是主线程的消息队列中的任务;
94.采集目标应用程序的运行数据,包括:在目标任务开始执行的情况下,获取目标任务的开始执行时间以及第一线程运行时间,第一线程运行时间是指当目标任务开始执行时,主线程的运行时长;在目标任务执行结束的情况下,获取目标任务的结束执行时间以及第二线程运行时间,第二线程运行时间是指当目标任务执行结束时,主线程的运行时长;根
据目标任务的开始执行时间和目标任务的结束执行时间,确定目标任务的执行时长;根据第一线程运行时间和第二线程运行时间,确定目标任务的cpu占用时长。
95.目标任务的执行时长是指目标任务开始执行到目标任务结束执行的时间间隔。目标任务的cpu占有时长是指主线程执行目标任务消耗的时长。由于应用程序中存在异步执行的机制,在目标任务执行一段时间后,可能发生任务切换,目标任务不在执行处于挂起状态,系统切换其他任务执行,因此,在一些实施例中,目标任务的执行时长大于cpu占用时长;在另一些实施例中,目标任务的执行时长等于cpu占用时长。
96.在一些实施例中,主线程任务数据还包括目标任务开始执行时对应的应用程序运行时长,应用程序通过系统时间获取工具获取应用程序的运行时长。在一些实施例中,在目标任务开始执行的情况下,应用程序通过systemclock.uptimemillis()的方法获取目标任务开始执行时对应的应用程序运行时长。
97.在一些实施例中,在目标任务开始执行的情况下,应用程序通过时间获取工具获取目标任务的开始执行时间以及第一线程运行时间,第一线程运行时间是指当目标任务开始执行时,主线程的运行时长。在一些实施例中,目标任务的开始执行时间是通过system.nanotime()获取的,第一线程运行时间是通过systemclock.currentthreadtimemillis()获取的。
98.在一些实施例中,在目标任务开始执行的情况下,应用程序通过回调的信息获取任务执行结束时的数据,关于回调的详细内容请参考上文,在此不再赘述。在一些实施例中,在目标任务执行结束的情况下,应用程序通过时间获取工具获取目标任务的结束执行时间以及第二线程运行时间,第二线程运行时间是指当目标任务执行结束时,主线程的运行时长。在一些实施例中,目标任务的结束执行时间是通过system.nanotime()获取的,第二线程运行时间是通过systemclock.currentthreadtimemillis()获取的。
99.在一些实施例中,应用程序通过目标任务结束执行时间与目标任务开始执行时间相减获得目标任务的执行时长。
100.在一些实施例中,应用程序通过第二线程运行时间与第一线程运行时间相减获得目标任务的cpu占用时长。
101.在一些实施例中,主线程任务数据还包括目标任务的执行信息,执行信息用于指示目标任务的执行环境和执行结果;根据目标任务的开始执行时间和目标任务的结束执行时间,确定目标任务的执行时长之后,方法还包括:在执行时长大于或等于门限值的情况下,获取目标任务的执行信息;其中,执行信息包括字段信息和参数信息,字段信息用于指示目标任务所在的字段,参数信息用于指示目标任务执行时的现场情况。
102.在一些实施例中目标任务的门限值时通过自定义确定的,在一些实施例中,应用程序通过名为config.msgfiltertime的变量确定目标任务执行时长的门限值。
103.在一些实施例中,目标应用程序通过比较目标任务的执行时长是否超过门限值判断目标任务的执行情况,在目标任务执行时长大于或等于门限值的情况下,目标应用程序记录目标任务的执行信息。在目标任务执行时长小于门限值的情况下,目标应用程序记录和/或不记录目标任务的执行信息。
104.在一些实施例中,在目标任务执行时长大于或等于门限值的情况下,目标应用程序获取目标任务的执行信息,其中,执行信息包括字段信息和参数信息,字段信息用于指示
目标任务所在的字段,参数信息用于指示目标任务执行时的现场情况。在一些实施例中,字段信息用于存储java的类级变量与实例级变量。在一些实施例中,目标应用程序获取目标程序的参数信息包括:回调信息、target(目标节点)信息、目标任务执行过程中调用参数的信息、执行状态信息,执行状态信息用于表示目标任务是否执行完成。在一些实施例中,目标应用程序创建一个名为period的变量来指示目标任务的执行状态,并使用

1表示目标任务执行完成,0表示目标任务正在执行,1表示目标任务未执行。
105.在目标任务执行时长大于或等于门限值的情况下,目标任务的执行情况包括:目标任务执行完成或目标任务未执行完成但执行时间过长导致目标任务执行结束。在一些实施例中,目标应用程序在目标任务开始执行的情况下,目标应用程序创建一个目标任务对应的对象,该对象用于在目标程序执行过程中,记录目标任务的参数信息,例如在某个目标任务开始执行时创建一个名为premessage的对象。
106.在一些实施例中,在目标任务执行时长大于等于门限值的情况下,目标应用程序首先判断目标任务对应的对象中是否存在执行信息,在目标任务相应的对象中存在执行信息的情况下,目标应用程序记录目标任务的执行信息;在目标任务相应的对象中不存在执行信息的情况下,目标应用程序进一步判断目标任务是否具有回调信息,在目标任务不存在回调信息的情况下,目标应用程序在目标任务对应的参数信息记录用于指示回调不成功的参数。
107.通过目标应用程序采集主线程任务数据可以充分了解目标任务的执行过程,还原目标任务的执行现场,有利于anr异常的原因分析。
108.在一些实施例中,函数执行数据包括:至少一个目标函数的函数名、开始执行时间、结束执行时间、执行时长和cpu占用时长;采集目标应用程序的运行数据,包括:在目标函数开始执行的情况下,获取目标函数的函数名、开始执行时间和第三线程运行时间,第三线程运行时间是指当目标函数开始执行时,目标函数所在线程的运行时长;目标函数执行结束的情况下,获取目标函数的结束执行时间和第四线程运行时间,第四线程运行时间是指当目标函数执行结束时,目标函数所在线程的运行时长;根据目标函数的开始执行时间和目标函数的结束执行时间,确定目标函数的执行时长;根据第三线程运行时间和第四线程运行时间,确定目标函数的cpu占用时长。
109.在一些实施例中,应用程序通过在目标包中插桩的方式采集线程中的函数的执行数据,应用程序在目标函数的头部和尾部以插桩的方法插入监听函数,采集、记录目标函数执行数据。在一些实施例中,在目标函数开始执行和/或结束执行时,应用程序通过visitmethodinsn的方法采集目标函数的函数名。在一些实施例中,在存在至少一个函数与目标函数同名的情况下,应用程序获取目标函数的函数名中还包括参数列表,参数列表用于区别目标函数与其他同名函数。
110.在一些实施例中,在目标函数开始执行的情况下,目标应用程序通过时间获取工具获取目标函数的开始执行时间以及第三线程运行时间,第三线程运行时间是指当目标函数开始执行时,目标函数所在线程的运行时长。在一些实施例中,目标函数的开始执行时间是通过system.nanotime()获取的,第三线程运行时间是通过systemclock.currentthreadtimemillis()获取的。
111.在一些实施例中,在目标函数执行结束的情况下,目标应用程序通过时间获取工
具获取目标函数的结束执行时间以及第四线程运行时间,第四线程运行时间是指当目标函数执行结束时,目标函数所在线程的运行时长。在一些实施例中,目标函数的结束执行时间是通过system.nanotime()获取的,第四线程运行时间是通过systemclock.currentthreadtimemillis()获取的。
112.在一些实施例中,目标应用程序通过目标函数结束执行时间与目标函数开始执行时间相减获得目标函数的执行时长。
113.在一些实施例中,目标应用程序通过第四线程运行时间与第三线程运行时间相减获得目标函数的cpu占用时长。
114.通过获取目标应用程序中线程的函数执行数据能够有选择性、有针对性地跟踪目标函数的执行情况,有利于分析导致anr异常的原因。
115.请参考图5,其示出了本技术一个实施例的提供anr异常数据显示方法的流程图,本方法各步骤的执行主体可以是分析设备,该方法可以包括如下几个步骤(510

520)中的至少一个步骤:
116.步骤510,从服务器获取目标应用程序的anr异常数据,anr异常数据包括目标应用程序的anr的发生时间以及与anr对应的运行数据,运行数据包括主线程调用栈数据、主线程任务数据和函数执行数据;其中,主线程调用栈数据用于指示目标应用程序的主线程的调用情况,主线程任务数据用于指示主线程在不同时间的任务执行情况,函数执行数据用于指示目标应用程序的线程中的函数执行情况。
117.在一些实施例中,主线程调用栈数据包括:主线程堆栈信息和主线程堆栈信息对应的调用时间,主线程堆栈信息是指主线程中各类方法间的调用关系,调用时间信息是指获取当前主线程堆栈信息与开始获取运行数据之间的时间间隔;主线程任务数据包括:至少一个目标任务的开始执行时间、执行时长、cpu占用时长和执行信息,目标任务是主线程消息队列中的任务,执行信息用于指示目标任务的执行环境和执行结果;函数执行数据包括:至少一个目标函数的函数名、开始执行时间、结束执行时间、执行时长和cpu占用时长。
118.在一些实施例中,主线程任务数据中还包括目标任务开始执行时对应的目标应用程序运行时长。
119.在一些实施例中,目标任务的参数信息用于指示目标任务执行时的现场情况。目标任务的执行信息包括字段信息与参数信息。
120.关于执行信息以及其他运行信息的详细内容请参见上文,在此不进行赘述。
121.在一些实施例中,分析设备通过服务器获取目标应用程序的anr异常数据,anr异常数据包括目标应用程序的anr的发生时间以及与anr对应的运行数据。
122.步骤520,可视化显示运行数据。
123.分析设备将通过服务器获得的运行数据进行可视化显示。
124.请参考图6,其示出了本技术一个实施例提供的anr异常数据的显示方法的示意图。
125.在一些实施例中,可视化显示运行数据,包括:按照排列顺序分别显示时间轴610、主线程调用栈数据620、主线程任务数据630、函数执行数据640和信息窗650,信息窗650用于显示运行数据的详细信息;使用有宽度的时间线分别表示主线程调用栈数据、主线程任务数据和函数执行数据。
126.在一些实施例中,时间轴610是带有时间刻度的线段。在一些实施例中,排列顺序为从上到下或从左向右分别显示时间轴610、主线程调用栈数据620、主线程任务数据630、函数执行数据640和信息窗650;或者,从上到下或从左向右分别显示主线程调用栈数据620、时间轴610、主线程任务数据630、函数执行数据640和信息窗650;或者,从上到下或从左向右分别显示主线程调用栈数据620、主线程任务数据630、函数执行数据640、时间轴610和信息窗650;或者,从上到下或从左向右分别显示主线程调用栈数据620、主线程任务数据630、函数执行数据640、信息窗650和时间轴610。
127.在一些实施例中,分析设备从服务器获取目标应用程序的anr异常数据,anr异常数据包括目标应用程序的anr的发生时间以及与anr对应的运行数据,运行数据包括主线程调用栈数据620、主线程任务数据630和函数执行数据640。分析设备按照从上到下的顺序依次显示时间轴610、主线程调用栈数据620、主线程任务数据630、函数执行数据640和信息窗650的方式,完成了对运行数据的可视化。
128.综上所述,通过分析设备从服务器获取目标应用程序的anr异常数据,并可视化显示运行数据有利于按照时间线清晰,直观地展示应用程序出现anr异常前应用程序的运行现场,有助于分析anr异常的产生原因。
129.下面,结合图7,图8和图9对可视化显示运行数据的方法进行介绍说明。
130.请参考图7,其示出了另一个实施例提供的anr异常数据的显示方法的示意图。
131.在一些实施例中,在主线程调用栈数据对应的时间线623上,使用区别标记621标识主线程堆栈信息622对应的调用时间信息,并在区别标记621对应的信息窗651中显示与调用时间信息相关联的主线程堆栈信息622,区别标记621是能够区别于时间线623的标识。
132.在一些实施例中,分析设备选择圆圈作为区别标记621,通过时间轴610定位主线程堆栈信息622对应的调用时间信息在主线程调用栈数据对应的时间线623上的位置,并使用圆圈状的区别标记621标识调用时间信息的位置,分析设备在圆圈状区别标记621所对应的信息窗651中显示该主线程调用栈数据620的主线程堆栈信息622。
133.通过分析设备可视化主线程调用栈数据能够明确显示anr发生前一段时间主线程堆栈信息及其对应的调用时间信息,有利于anr异常的分析。
134.请参考图8,其示出了另一个实施例的可视化显示效果图。
135.在一些实施例中,按照时间顺序排列主线程任务数据,使用不同的颜色标识不同的目标任务632;按照时间顺序排列所述函数执行数据640,使用不同的颜色标识不同的所述目标函数。
136.在一些实施例中,通过目标任务632的开始执行时间、结束执行时间确定目标任务632在主线程任务数据630对应的时间线631上的显示位置;或者,通过目标任务632的开始执行时间、执行时长确定目标任务在主线程任务数据630对应的时间线631上的显示位置;在显示位置对应的信息窗651中显示目标任务的开始执行时间执行时长、cpu占有时长以及执行信息。
137.在一些实施例中,目标任务在主线程任务数据对应的时间线上的显示位置是时间线631上的一段时间线。
138.在一些实施例中,分析设备通过时间轴610定位目标任务的开始执行时间、结束执行时间在主线程任务数据对应的时间线上的显示位置;在一些实施例中,分析设备通过时
间轴610定位目标任务632的开始执行时间在主线程任务数据630对应的时间线631上的位置,并通过目标任务632的执行时长确定目标任务在主线程任务数据对应的时间线631上的显示位置。
139.在一些实施例中,分析设备在目标任务632的显示位置对应的信息窗651中显示目标应用程序的开始执行时间633、cpu占用时长634、目标任务的执行时长635、以及执行信息。在一些实施例中,执行信息包括参数信息636和字段信息637,关于字段信息与参数信息的详细信息在上文中已经介绍,在此不进行赘述。
140.在一些实施例中,分析设备在目标任务632的显示位置对应的信息窗651中显示的信息还包括目标任务开始执行时对应的应用程序运行时长。在信息窗中显示目标任务开始执行时对应的应用程序运行时长有助于分析anr异常的产生原因。
141.通过可视化显示主线程任务数据能够直观地展示主线程的繁忙程度,通过目标任务对应的信息窗能够明确展示各个目标任务的作用、执行参数等信息并且方便技术任务检测目标任务耗时情况。
142.请参考图9,其示出了另一个实施例的可视化显示效果图。
143.在一些实施例中,按照时间顺序排列函数执行数据640,包括:通过目标函数的开始执行时间、结束执行时间确定目标函数在函数执行数据640对应的时间线641上的显示位置;或者,通过目标函数的开始执行时间、执行时长确定目标函数在函数执行数据对应的时间线641上的显示位置;在显示位置对应的信息窗651中显示目标函数的函数名642、执行时长643以及cpu占用时长644。
144.在一些实施例中,分析设备通过时间轴610定位目标函数的开始执行时间、结束执行时间在函数执行数据对应的时间线641上的显示位置;在一些实施例中,分析设备通过时间轴610定位目标函数的开始执行时间在函数执行数据640对应的时间线641上的位置,并通过开始执行时间在函数执行数据640对应的时间线641上的位置与目标函数的执行时长643确定目标函数在函数执行数据640对应的时间线641上的显示位置。
145.在一些实施例中,分析设备在目标函数的显示位置对应的信息窗651中显示目标函数的函数名642,执行时长643和cpu占用时长644。
146.在一些实施例中,在函数执行数据中,目标函数的函数名中还包括参数列表645,参数列表645用于区别目标函数与其他同名函数。
147.在一些实施例中,在目标函数之间存在调用关系的情况下,按照目标函数的开始执行时间和结束执行时间确定目标函数间的调用关系;将被调用的目标函数显示在进行调用的目标函数的下方。
148.存在调用关系的函数的在开始执行时间和结束执行时间上存在一定的关系,进行调用的目标函数的开始执行时间小于或等于被调用的目标函数的开始执行时间,进行调用的目标函数的结束执行时间大于或等于被调用的目标函数的结束执行时间。在一些实施例中,分析设备通过目标函数的开始执行时间与结束执行时间确定目标函数之间的调用关系,并将被调用的目标函数显示在进行调用的目标函数的上方。
149.在一些实施例中,分析设备通过服务器获取anr发生时的运行数据,运行数据中包括函数执行数据。目标执行数据中包括目标函数1、目标函数2和目标函数3,其中,目标函数1的函数名为1,执行时长为300ms,cpu占用时长为275ms,开始执行时间为1000ms,结束执行
时间为1300ms;目标函数2的函数名为2,执行时长为1000ms,cpu占用时长为700ms,开始执行时间为500ms,结束执行时间为1500ms;目标函数3的函数名为3,执行时长为100ms,cpu占用时长为75ms,开始执行时间为1700ms,结束执行时间为1800ms。分析设备通过目标任务的开始执行时间和结束执行时间确定目标函数2和目标函数1之间存在调用与被调用的关系(目标函数1的开始执行时间1000ms大于目标函数2的开始执行时间700ms,目标函数1的结束执行时间1300ms小于目标函数2的结束执行时间1500ms),目标函数3与目标函数1之间不存在调用关系,目标函数3与目标函数2之间不存在调用关系,分析设备通过目标函数2,3的开始执行时间和结束执行时间确定目标函数2和目标函数3在函数执行数据对应的时间轴上的显示位置,并在相应显示位置的信息窗中分别显示目标函数2,3对应的函数名、执行时长和cpu占用时长。分析设备在目标函数2的下方通过目标函数1的开始执行时间、结束执行时间确定目标函数1的显示位置,并在目标函数1的显示位置上显示目标函数1的函数名、执行时长和cpu占用时长。
150.通过可视化显示函数执行数据可以理清各个目标函数之间的调用关系,并且清晰的展现目标函数的执行情况。
151.下述为本技术装置实施例,可以用于执行本技术方法实施例。对于本技术装置实施例中未披露的细节,请参照本技术方法实施例。
152.请参考图10,其示出了本技术一个实施例提供的anr异常数据的收集装置的框图。该装置具有实现上述anr异常数据的收集方法的功能,所述功能可以由硬件实现,也可以由硬件执行相应的软件实现。该装置可以是上文介绍的电子设备,也可以设置在电子设备中。该装置1000可以包括:采集模块1010、记录模块1020和上报模块1030。
153.采集模块1010,用于采集所述目标应用程序的运行数据,所述运行数据包括主线程调用栈数据、主线程任务数据和函数执行数据;其中,所述主线程调用栈数据用于指示所述目标应用程序的主线程的调用情况,所述主线程任务数据用于指示所述主线程在不同时间的任务执行情况,所述函数执行数据用于指示所述目标应用程序的线程中的函数执行情况。
154.记录模块1020,用于记录所述运行数据。
155.上报模块1030,用于在所述目标应用程序发生anr的情况下,向服务器上报anr异常数据,所述anr异常数据包括所述anr的发生时间以及与所述anr对应的所述运行数据。
156.在一些实施例中,所述主线程调用栈数据包括至少一组主线程堆栈信息和调用时间信息之间的对应关系;所述采集模块1010包括第一获取单元,用于:获取所述主线程堆栈信息,所述主线程堆栈信息用于指示所述主线程中各类装置间的调用关系;获取所述主线程堆栈信息对应的调用时间信息,所述调用时间信息用于指示所述主线程堆栈信息的获取时刻。
157.在一些实施例中,所述主线程任务数据包括:至少一个目标任务的开始执行时间、执行时长和cpu占用时长,所述目标任务是所述主线程的消息队列中的任务;所述采集模块1010还包括第二获取单元,用于:
158.在所述目标任务开始执行的情况下,获取所述目标任务的开始执行时间以及第一线程运行时间,所述第一线程运行时间是指当所述目标任务开始执行时,所述主线程的运行时长;在所述目标任务执行结束的情况下,获取所述目标任务的结束执行时间以及第二
线程运行时间,所述第二线程运行时间是指当所述目标任务执行结束时,所述主线程的运行时长;根据所述目标任务的开始执行时间和所述目标任务的结束执行时间,确定所述目标任务的执行时长;根据所述第一线程运行时间和所述第二线程运行时间,确定所述目标任务的cpu占用时长。
159.在一些实施例中,所述主线程任务数据还包括所述目标任务的执行信息,所述执行信息用于指示所述目标任务的执行环境和执行结果;所述第二获取单元,还用于在所述执行时长大于或等于门限值的情况下,获取所述目标任务的执行信息;其中,所述执行信息包括字段信息和参数信息,所述字段信息用于指示所述目标任务所在的字段,所述参数信息用于指示所述目标任务执行时的现场情况。
160.在一些实施例中,所述函数执行数据包括:至少一个目标函数的函数名、开始执行时间、结束执行时间、执行时长和cpu占用时长;所述采集模块1010还包括第三获取单元,用于:在所述目标函数开始执行的情况下,获取所述目标函数的函数名、开始执行时间和第三线程运行时间,所述第三线程运行时间是指当所述目标函数开始执行时,所述目标函数所在线程的运行时长;在所述目标函数执行结束的情况下,获取所述目标函数的结束执行时间和第四线程运行时间,所述第四线程运行时间是指当所述目标函数执行结束时,所述目标函数所在线程的运行时长;根据所述目标函数的开始执行时间和所述目标函数的结束执行时间,确定所述目标函数执行时长;根据所述第三线程运行时间和所述第四线程运行时间,确定所述目标函数的cpu占用时长。
161.在一些实施例中,所述记录模块1020,用于:
162.将所述主线程调用栈数据、所述主线程任务数据和所述函数执行数据,分别存储至相应的存储队列中;其中,所述存储队列用于采用先入先出的方式,记录最近一段时间的运行数据。在一些实施例中,所述目标应用程序的目标包中插入有监听函数,所述监听函数用于采集、记录和上报所述运行数据;所述目标包中需要进行anr异常监控的位置插入有开启命令,所述开启命令用于触发执行所述监听函数。
163.请参考图11,其示出了本技术一个实施例提供的anr异常数据的显示装置的框图。该装置具有实现上述anr异常数据的显示方法的功能,所述功能可以由硬件实现,也可以由硬件执行相应的软件实现。该装置可以是上文介绍的分析设备,也可以设置在分析设备中。该装置1100可以包括:获取模块1110和显示模块1120。
164.获取模块1110,用于从服务器获取目标应用程序的anr异常数据,所述anr异常数据包括所述目标应用程序的anr的发生时间以及与所述anr对应的运行数据,所述运行数据包括主线程调用栈数据、主线程任务数据和函数执行数据;其中,所述主线程调用栈数据用于指示所述目标应用程序的主线程的调用情况,所述主线程任务数据用于指示所述主线程在不同时间的任务执行情况,所述函数执行数据用于指示所述目标应用程序的线程中的函数执行情况。
165.显示模块1120,用于可视化显示所述运行数据。
166.在一些实施例中,所述主线程调用栈数据包括:主线程堆栈信息和所述主线程堆栈信息对应的调用时间,所述主线程堆栈信息是指主线程中各类装置间的调用关系,所述调用时间信息是指获取当前主线程堆栈信息与开始获取所述运行数据之间的时间间隔;所述主线程任务数据包括:至少一个目标任务的开始执行时间、执行时长、cpu占用时长和执
行信息,所述目标任务是所述主线程消息队列中的任务,所述执行信息用于指示所述目标任务的执行环境和执行结果;所述函数执行数据包括:至少一个目标函数的函数名、开始执行时间、结束执行时间、执行时长和cpu占用时长。
167.在一些实施例中,所述显示模块1120用于:按照排列顺序分别显示时间轴、所述主线程调用栈数据、所述主线程任务数据、所述函数执行数据和信息窗,所述信息窗用于显示所述运行数据的详细信息;使用有宽度的时间线分别表示所述主线程调用栈数据、所述主线程任务数据和所述函数执行数据。
168.在一些实施例中,所述显示模块1120,用于:按照排列顺序分别显示时间轴、所述主线程调用栈数据、所述主线程任务数据、所述函数执行数据和信息窗,所述信息窗用于显示所述运行数据的详细信息;使用有宽度的时间线分别表示所述主线程调用栈数据、所述主线程任务数据和所述函数执行数据。
169.在一些实施例中,所述显示模块1120,用于:在所述主线程调用栈数据对应的时间线上,使用区别标记标识所述主线程堆栈信息对应的调用时间信息,并在所述区别标记对应的所述信息窗中显示与所述调用时间信息相关联的所述主线程堆栈信息,所述区别标记是能够区别于时间线的标识。
170.在一些实施例中,所述显示模块1120,用于:按照时间顺序排列所述主线程任务数据,使用不同的颜色标识不同的所述目标任务;按照时间顺序排列所述函数执行数据,使用不同的颜色标识不同的所述目标函数。
171.在一些实施例中,所述显示模块1120,用于:通过所述目标任务的开始执行时间、结束执行时间确定所述目标任务在所述主线程任务数据对应的时间线上的显示位置;或者,通过所述目标任务的开始执行时间、执行时长确定所述目标任务在所述主线程任务数据对应的时间线上的显示位置;在所述显示位置对应的信息窗中显示所述目标任务的开始执行时间、结束执行时间、执行时长、cpu占有时长以及执行信息。
172.在一些实施例中,所述显示模块1120,用于:通过所述目标函数的开始执行时间、结束执行时间确定所述目标函数在所述函数执行数据对应的时间线上的显示位置;或者,通过所述目标函数的开始执行时间、执行时长确定所述目标函数在所述函数执行数据对应的时间线上的显示位置;在所述显示位置对应的信息窗中显示所述目标函数的函数名、执行时长以及cpu占有时长。
173.在一些实施例中,所述显示模块1120,用于:在所述目标函数之间存在调用关系的情况下,按照所述目标函数的开始执行时间和结束执行时间确定目标函数间的调用关系;将被调用的目标函数显示在进行调用的目标函数的下方。
174.需要说明的是,上述实施例提供的装置,在实现其功能时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内容结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的装置与方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
175.请参考图12,其示出了本技术一个实施例提供的计算机设备1200的结构框图。该计算机设备1200可以是上文介绍的电子设备,用于实施上述anr异常数据的收集方法;也可以是上文介绍的分析设备,用于实施上述anr异常数据的显示方法。
176.通常,计算机设备1200包括有:处理器1201和存储器1202。
177.处理器1201可以包括一个或多个处理核心,比如4核心处理器、8核心处理器等。处理器1201可以采用dsp(digital signal processing,数字信号处理)、fpga(field programmable gate array,现场可编程门阵列)、pla(programmable logic array,可编程逻辑阵列)中的至少一种硬件形式来实现。处理器1201也可以包括主处理器和协处理器,主处理器是用于对在唤醒状态下的数据进行处理的处理器,也称cpu(central processing unit,中央处理器);协处理器是用于对在待机状态下的数据进行处理的低功耗处理器。在一些实施例中,处理器1201可以在集成有gpu(graphics processing unit,图像处理器),gpu用于负责显示屏所需要显示的内容的渲染和绘制。一些实施例中,处理器1201还可以包括ai(artificial intelligence,人工智能)处理器,该ai处理器用于处理有关机器学习的计算操作。
178.存储器1202可以包括一个或多个计算机可读存储介质,该计算机可读存储介质可以是非暂态的。存储器1202还可包括高速随机存取存储器,以及非易失性存储器,比如一个或多个磁盘存储设备、闪存存储设备。
179.本领域技术人员可以理解,图12中示出的结构并不构成对计算机设备1200的限定,可以包括比图示更多或更少的组件,或者组合某些组件,或者采用不同的组件布置。
180.在示例中实施例中,还提供了一种计算机设备,所述计算机设备包括处理器和存储器,所述存储器中存储有计算机程序。所述计算机程序经配置以由一个或者一个以上处理器执行,以实现上述anr异常数据的收集方法,或者实现上述anr异常数据的显示方法。
181.在示例性实施例中,还提供了一种计算机可读存储介质,所述存储介质中存储有计算机程序,所述计算机程序在被计算机设备的处理器执行时实现上述anr异常数据的收集方法,或者实现上述anr异常数据的显示方法。
182.可选地,上述计算机可读存储介质可以是rom(read

only memory,只读存储器)、ram(random access memory,随机存取存储器)、cd

rom(compact disc read

only memory,只读光盘)、磁带、软盘和光数据存储设备等。
183.在示例性实施例中,还提供了一种计算机程序产品,当所述计算机程序产品在计算机设备上运行时,使得计算机设备执行如上述anr异常数据的收集方法,或者上述anr异常数据的显示方法。
184.应当理解的是,在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。另外,本文中描述的步骤编号,仅示例性示出了步骤间的一种可能的执行先后顺序,在一些其它实施例中,上述步骤也可以不按照编号顺序来执行,如两个不同编号的步骤同时执行,或者两个不同编号的步骤按照与图示相反的顺序执行,本技术实施例对此不作限定。
185.以上所述仅为本技术的示例性实施例,并不用以限制本技术,凡在本技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1