一种异常信息处理方法、装置、计算机设备和存储介质与流程

allin2024-10-11  28



1.本公开涉及计算机技术领域,具体而言,涉及一种异常信息处理方法、装置、计算机设备和存储介质。


背景技术:

2.由于发版后的flutter应用对应的文件包,为对原始文件包裁剪后得到的文件包,导致了flutter应用在运行出错时产生的崩溃堆栈与未裁剪前的原始文件包对应的原始崩溃堆栈不同,继而,为了确定崩溃堆栈的产生原因,需要将崩溃堆栈还原为对应的原始崩溃堆栈。
3.当前的还原方法为新建还原进程,并在还原进程中加载从原始文件包中裁剪下来的文件内容,利用加载完成的裁剪下来的文件内容对崩溃堆栈进行整体处理,最终将其还原为原始崩溃堆栈。
4.但上述方法,由于加载从原始文件包中裁剪下来的文件内容,以及对崩溃堆栈进行整体处理,均需要消耗一定的时长,导致堆栈还原具有一定的延时;并且,每次进行堆栈还原都需要新建进程,导致了无法大规模并发地进行堆栈还原的问题。


技术实现要素:

5.本公开实施例至少提供一种异常信息处理方法、装置、计算机设备和存储介质。
6.第一方面,本公开实施例提供了一种异常信息处理方法,包括:
7.获取应用在运行时产生的异常地址堆栈信息;所述应用基于flutter应用开发框架开发得到;
8.根据所述异常地址堆栈信息,确定所述异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息;
9.针对每个所述子地址堆栈信息,若多个缓存空间中的任一缓存空间,均未存储与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息,则调用堆栈解析服务,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息。
10.在一种可能的实施方式中,所述调用堆栈解析服务,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息,包括:
11.调用所述堆栈解析服务,利用哈希算法基于所述解析地址信息,从所述堆栈解析服务运行的解析实例中,确定用于处理所述解析地址信息的目标实例;
12.利用所述目标实例,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息。
13.在一种可能的实施方式中,所述利用所述目标实例,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息,包括:
14.确定所述目标实例中当前存在的已创建解析进程中,是否存在与所述解析地址信
息相匹配的第一目标解析进程;
15.在所述目标实例中存在所述第一目标解析进程的情况下,利用所述第一目标解析进程,基于第一目标解析进程中已加载完成的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息。
16.在一种可能的实施方式中,所述方法还包括:
17.在所述目标实例中不存在所述第一目标解析进程的情况下,在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程,并在所述第二目标解析进程中加载在编译所述应用时生成并存储的堆栈还原信息;
18.利用所述第二目标解析进程,基于加载的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息。
19.在一种可能的实施方式中,所述多个缓存空间包括本地缓存空间和持久化远程存储空间;
20.在所述利用所述第二目标解析进程,基于加载的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息之后,还包括:
21.将所述解析地址信息和得到的所述子代码堆栈信息作为键值对,存储至所述本地缓存空间和所述持久化远程存储空间,其中,所述解析地址信息作为所述键值对中的键,所述子代码堆栈信息作为所述键值对中的值;所述本地缓存空间为接收所述异常地址堆栈信息的服务端对应的本地缓存空间;所述持久化远程存储空间用于存储多个服务端对应的键值对。
22.在一种可能的实施方式中,在所述利用所述第一目标解析进程,基于第一目标解析进程中已加载完成的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息之后,还包括:
23.更新利用最近最少使用lru算法存储的所述第一目标解析进程的最近使用时间信息;
24.所述在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程,包括:
25.在所述目标实例中的已创建解析进程的数量满足预设数量的情况下,根据各个所述已创建解析进程对应的最近使用时间信息,从多个所述已创建解析进程中筛选出最久未使用的已创建解析进程;
26.删除所述最久未使用的已创建解析进程,并在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程。
27.在一种可能的实施方式中,所述方法还包括确定所述多个缓存空间中任一缓存空间是否存储有与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息的步骤:
28.将与所述子地址堆栈信息对应的解析地址信息作为查询键,并按照多个缓存空间分别对应的查询优先级,依次从所述本地缓存空间和所述持久化远程存储空间中分别已存储的键值对中,确定是否存在与所述查询键相匹配的目标键值对;
29.在确定不存在所述目标键值对的情况下,确定所述多个缓存空间中的任一缓存空间,均未存储有与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息。
30.在一种可能的实施方式中,所述方法还包括:
31.在确定存在所述目标键值对的情况下,将所述目标键值对中的值指示的子代码堆栈信息,作为所述子地址堆栈信息对应的子代码堆栈信息。
32.在一种可能的实施方式中,所述根据所述异常地址堆栈信息,确定所述异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息,包括:
33.对所述异常地址堆栈信息进行堆栈解析,确定所述异常地址堆栈信息对应的堆栈头信息和地址堆栈信息,并从所述地址堆栈信息中,拆分得到每一行子地址堆栈信息;
34.针对每一行子地址堆栈信息,基于所述子地址堆栈信息和所述堆栈头信息,确定所述子地址堆栈信息对应的解析地址信息。
35.第二方面,本公开实施例还提供一种异常信息处理装置,包括:
36.获取模块,用于获取应用在运行时产生的异常地址堆栈信息;所述应用基于flutter应用开发框架开发得到;
37.确定模块,用于根据所述异常地址堆栈信息,确定所述异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息;
38.还原模块,用于针对每个所述子地址堆栈信息,若多个缓存空间中的任一缓存空间,均未存储与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息,则调用堆栈解析服务,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息。
39.在一种可能的实施方式中,所述还原模块,在执行所述调用堆栈解析服务,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息时,用于调用所述堆栈解析服务,利用哈希算法基于所述解析地址信息,从所述堆栈解析服务运行的解析实例中,确定用于处理所述解析地址信息的目标实例;
40.利用所述目标实例,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息。
41.在一种可能的实施方式中,所述还原模块,在执行所述利用所述目标实例,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息时,用于确定所述目标实例中当前存在的已创建解析进程中,是否存在与所述解析地址信息相匹配的第一目标解析进程;
42.在所述目标实例中存在所述第一目标解析进程的情况下,利用所述第一目标解析进程,基于第一目标解析进程中已加载完成的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息。
43.在一种可能的实施方式中,所述还原模块,还用于在所述目标实例中不存在所述第一目标解析进程的情况下,在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程,并在所述第二目标解析进程中加载在编译所述应用时生成并存储的堆栈还原信息;
44.利用所述第二目标解析进程,基于加载的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息。
45.在一种可能的实施方式中,所述多个缓存空间包括本地缓存空间和持久化远程存储空间;
46.所述装置还包括存储模块,用于在所述利用所述第二目标解析进程,基于加载的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息之后,将所述解析地址信息和得到的所述子代码堆栈信息作为键值对,存储至所述本地缓存空间和所述持久化远程存储空间,其中,所述解析地址信息作为所述键值对中的键,所述子代码堆栈信息作为所述键值对中的值;所述本地缓存空间为接收所述异常地址堆栈信息的服务端对应的本地缓存空间;所述持久化远程存储空间用于存储多个服务端对应的键值对。
47.在一种可能的实施方式中,所述还原模块,还用于在所述利用所述第一目标解析进程,基于第一目标解析进程中已加载完成的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息之后,更新利用最近最少使用lru算法存储的所述第一目标解析进程的最近使用时间信息;
48.以及在执行所述在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程时,用于在所述目标实例中的已创建解析进程的数量满足预设数量的情况下,根据各个所述已创建解析进程对应的最近使用时间信息,从多个所述已创建解析进程中筛选出最久未使用的已创建解析进程;
49.删除所述最久未使用的已创建解析进程,并在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程。
50.在一种可能的实施方式中,所述还原模块,还用于按照以下步骤确定所述多个缓存空间中任一缓存空间是否存储有与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息:
51.将与所述子地址堆栈信息对应的解析地址信息作为查询键,并按照多个缓存空间分别对应的查询优先级,依次从所述本地缓存空间和所述持久化远程存储空间中分别已存储的键值对中,确定是否存在与所述查询键相匹配的目标键值对;
52.在确定不存在所述目标键值对的情况下,确定所述多个缓存空间中的任一缓存空间,均未存储有与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息。
53.在一种可能的实施方式中,所述还原模块,还用于在确定存在所述目标键值对的情况下,将所述目标键值对中的值指示的子代码堆栈信息,作为所述子地址堆栈信息对应的子代码堆栈信息。
54.在一种可能的实施方式中,所述确定模块,在执行所述根据所述异常地址堆栈信息,确定所述异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息时,用于对所述异常地址堆栈信息进行堆栈解析,确定所述异常地址堆栈信息对应的堆栈头信息和地址堆栈信息,并从所述地址堆栈信息中,拆分得到每一行子地址堆栈信息;
55.针对每一行子地址堆栈信息,基于所述子地址堆栈信息和所述堆栈头信息,确定所述子地址堆栈信息对应的解析地址信息。
56.第三方面,本公开可选实现方式还提供一种计算机设备,处理器、存储器,所述存储器存储有所述处理器可执行的机器可读指令,所述处理器用于执行所述存储器中存储的机器可读指令,所述机器可读指令被所述处理器执行时,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
57.第四方面,本公开可选实现方式还提供一种计算机可读存储介质,所述计算机可
读存储介质上存储有计算机程序,所述计算机程序被运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
58.关于上述异常信息处理装置、计算机设备、及计算机可读存储介质的效果描述参见上述异常信息处理方法的说明,这里不再赘述。
59.本公开实施例提供的异常信息处理方法、装置、计算机设备和存储介质,通过异常地址堆栈信息拆分为单行子地址堆栈信息,并对单行子地址堆栈信息进行还原处理的方式,相比将异常地址堆栈信息整体进行还原处理的方式,可以有效减少还原处理所需要消耗的计算资源,从而提高堆栈还原的速度。在多个缓存空间均不存在解析地址信息对应的子代码堆栈信息的情况下,才调用堆栈解析服务进行堆栈还原,可以避免每次进行堆栈还原都需要新建进程、加载堆栈还原信息的操作,进而可以有效提高能够并行处理的异常地址堆栈信息的数量,实现大规模并发操作。此外,即使需要调用堆栈解析服务进行堆栈还原,该堆栈解析服务每次需要处理的信息均为数据量更小的子地址堆栈信息,堆栈还原速度能够得到有效保障,有效解决了堆栈还原的延迟问题。
60.进一步,本公开实施例提供的异常信息处理方法、装置、计算机设备和存储介质,还可以通过在目标实例中保留解析进程的方式,可以实现在调用解析服务的情况下,利用保留的解析进程中与解析地址信息匹配的第一目标解析进程进行堆栈还原,并由于第一目标解析进程中已经加载有堆栈还原信息,节省了加载堆栈还原信息的时间,堆栈还原的速度也可以得到提升,有效解决了堆栈还原的延迟问题。
61.进一步的,本公开实施例提供的异常信息处理方法、装置、计算机设备和存储介质,若在目标实例中的已创建解析进程的数量满足预设数量,在新建第二目标解析进程时,还可以根据各个已创建解析进程对应的最近使用时间信息,将最久未使用的已创建解析进程删除,之后再创建第二目标解析,这样,既可以保证目标实例中的解析进程的数量被控制在预设数量内,避免出现内存用完(out of memory,oom)的情况,还可以保证存储在目标实例中的解析进程均为活跃性较高的常用进程,保证了目标实例的活力。
62.为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
63.为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
64.图1示出了本公开实施例所提供的一种异常信息处理方法的流程图;
65.图2示出了本公开实施例所提供的一种异常信息处理的具体实施流程示意图;
66.图3示出了本公开实施例所提供的一种异常信息处理装置的示意图;
67.图4示出了本公开实施例所提供的一种计算机设备结构示意图。
具体实施方式
68.为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
69.另外,本公开实施例中的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应所述理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。
70.在本文中提及的“多个或者若干个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
71.经研究发现,为了提高flutter应用对应的应用文件包的安全性,以及减少应用文件包的体积,在对flutter应用进行编译以及发版的过程中,通常会将flutter应用对应的原始文件包进行裁剪,将裁剪后的文件包作为最终发版的应用文件包,并将裁剪下来的文件内容存储。在flutter应用使用出现异常产生崩溃堆栈后,每次都需要在目标实例中新建进程,并加载裁剪下来的文件内容,之后利用加载完成的裁剪下来的文件内容对崩溃堆栈进行整体处理,最终将崩溃堆栈还原为原始崩溃堆栈。这样,不仅造成了堆栈还原的延迟问题,并且还由于可并发创建的进程的数量有限,造成无法大规模并发地进行堆栈还原的问题。
72.基于上述研究,本公开提供了一种异常信息处理方法、装置、计算机设备和存储介质,通过异常地址堆栈信息拆分为单行子地址堆栈信息,并对单行子地址堆栈信息进行还原处理的方式,相比将异常地址堆栈信息整体进行还原处理的方式,可以有效减少还原处理所需要消耗的计算资源,从而提高堆栈还原的速度。在多个缓存空间均不存在解析地址信息对应的子代码堆栈信息的情况下,才调用堆栈解析服务进行堆栈还原,可以避免每次进行堆栈还原都需要新建进程、加载堆栈还原信息的操作,进而可以有效提高能够并行处理的异常地址堆栈信息的数量,实现大规模并发操作。此外,即使需要调用堆栈解析服务进行堆栈还原,该堆栈解析服务每次需要处理的信息均为数据量更小的子地址堆栈信息,堆栈还原速度能够得到有效保障,有效解决了堆栈还原的延迟问题。
73.针对以上方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本公开针对上述问题所提出的解决方案,都应所述是发明人在本公开过程中对本公开做出的贡献。
74.应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
75.需要说明的是,本公开实施例中所提到的特定名词包括:
76.flutter:是开源的构建用户界面(ui)工具包,帮助开发者通过一套代码库高效构
建多平台精美应用,支持移动、网页web、桌面和嵌入式平台。
77.为便于对本实施例进行理解,首先对本公开实施例所公开的一种异常信息处理方法进行详细介绍,本公开实施例所提供的异常信息处理方法的执行主体一般为具有一定计算能力的计算机设备,在一些可能的实现方式中,所述异常信息处理方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
78.下面以执行主体为计算机设备为例对本公开实施例提供的异常信息处理方法加以说明。
79.如图1所示,为本公开实施例提供的一种异常信息处理方法的流程图,可以包括以下步骤:
80.s101:获取应用在运行时产生的异常地址堆栈信息;应用基于flutter应用开发框架开发得到。
81.本公开实施例所提供的异常信息处理方法可以应用于任一基于flutter应用开发框架开发得到应用。
82.这里,为了提高应用对应的应用文件包的安全性和应用文件包的体积,应用在编译发版时,会使用flutter混淆方法,对应用文件包进行裁剪和打包,得到混淆后的应用软件开发工具包(software development kit,sdk)并发版,由于发版的应用sdk为裁剪后,应用在运行时产生的异常地址堆栈信息将与裁剪前对应的异常堆栈信息(具体为异常代码堆栈信息)不同,进而,造成无法直接根据异常地址堆栈信息确定出应用的异常原因。这样,产生了将异常地址堆栈信息进行还原的需求。
83.上述异常地址堆栈信息即为应用在运行时产生的崩溃堆栈信息,上述应用即为裁剪后发版的flutter应用。
84.具体实施时,在运行任一裁剪后发版的flutter应用时,如果该应用产生异常,可以利用用于上报异常地址堆栈信息的数据上报服务,将该应用在运行时产生的异常地址堆栈信息发送至异常地址堆栈接收服务(flutter_crash_sink服务),在flutter_crash_sink服务成功接收到异常地址堆栈信息时,也即成功获取了应用在运行时产生的异常地址堆栈信息。这里,flutter_crash_sink服务同时可以接收到多个异常地址堆栈信息,也即,可以同时获取多个异常地址堆栈信息。
85.s102:根据异常地址堆栈信息,确定异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息。
86.这里,异常地址堆栈信息中可以包括多行不同的子地址堆栈,不同的子地址堆栈信息对应于不同的解析地址信息。解析地址信息用于将子地址堆栈信息还原为裁剪前对应的异常子堆栈信息。具体的,解析地址信息可以为地址符号。
87.具体实施时,flutter_crash_sink服务可以将获取的异常堆栈地址信息发送至堆栈还原服务(flutter_retrace服务),之后,利用flutter_retrace服务对异常堆栈地址信息进行拆分,得到多行子地址堆栈信息,之后,针对每行子地址堆栈信息,可以根据该子地址堆栈信息对应的信息内容,将该子地址堆栈信息还原为解析地址信息。
88.这里,如果获取的异常地址堆栈信息可以包括多个,可以利用flutter_retrace服务并行地对每个异常地址堆栈信息处理,确定出每个异常地址堆栈信息中的各行子地址堆栈信息对应的解析地址信息。
89.在一种实施例中,针对s102,可以按照以下步骤实施:
90.s102-1:对异常地址堆栈信息进行堆栈解析,确定异常地址堆栈信息对应的堆栈头信息和地址堆栈信息,并从地址堆栈信息中,拆分得到每一行子地址堆栈信息。
91.这里,堆栈头信息用于标识异常地址堆栈信息,不同的异常地址堆栈信息对应的堆栈头信息不同。地址堆栈信息即为异常地址堆栈信息中的各个异常地址,例如,异常地址可以为0x822828这种的地址;或者,地址堆栈信息也可以称为异常地址堆栈信息中的运行信息。
92.具体实施时,可以利用flutter_retrace服务,对异常地址堆栈信息进行堆栈解析,将异常地址堆栈信息拆分为堆栈头信息和地址堆栈信息,再利用flutter_retrace服务对地址堆栈信息进行进一步的拆分,得到各行子地址堆栈信息。
93.s102-2:针对每一行子地址堆栈信息,基于子地址堆栈信息和堆栈头信息,确定子地址堆栈信息对应的解析地址信息。
94.具体实施时,针对每一行子地址堆栈信息,可以利用flutter_retrace服务,将该子地址堆栈信息和堆栈头信息结合,得到结合后的子地址堆栈信息,之后将结合后的子地址堆栈信息转换为解析地址信息。这里,具体可以将结合后的子地址堆栈信息还原为地址符号。
95.s103:针对每个子地址堆栈信息,若多个缓存空间中的任一缓存空间,均未存储与子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息,则调用堆栈解析服务,基于解析地址信息和应用对应的堆栈还原信息,还原得到子地址堆栈信息对应的子代码堆栈信息。
96.这里,子代码堆栈信息为对子地址堆栈信息进行还原后,得到的异常堆栈信息,相比子地址堆栈信息,其为一种可以人为识别的异常堆栈信息。例如,在子地址堆栈信息为0x822828这种地址的情况下,还原后的子代码堆栈信息可以为dart.xxxx.main.dart 80。
97.多个缓存空间中的每个缓存空间均用于存储已经还原出的、与历史子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息,也即存储有解析地址信息与子代码堆栈信息的关联关系,该关联关系可以以键值对的方式表征,其中,键值对中的键为解析地址信息,键值对中的值为关联的子代码堆栈信息。例如,在确定当前的子地址堆栈信息1以及子地址堆栈信息1对应的解析地址信息1之前,已经根据子地址堆栈信息2对应的解析地址信息2,还原出子地址堆栈信息2对应的子代码堆栈信息1,则可以确定解析地址信息2与子代码堆栈信息1存在关联关系,并将解析地址信息2与子代码堆栈信息1分别存储在多个缓存空间中。这里,子地址堆栈信息2即为一个历史子地址堆栈信息。进而,在确定子地址堆栈信息1和解析地址信息1之后,可以进一步地确定多个缓存空间中确定不存在与解析地址信息1相关联的子代码堆栈信息。
98.多个缓存空间可以分别具有不同的等级,一个低等级的缓存空间可以对应于一个服务端,也即低等级的缓存空间,可以用于存储子地址堆栈信息对应的解析地址信息和子地址堆栈信息对应的子代码堆栈信息之间的关联关系,这里的子地址堆栈信息均为低等级的缓存空间对应的一个服务端,在运行应用时产生的子地址堆栈信息。
99.一个高等级的缓存空间可以对应于多个服务端,也即高等级的缓存空间,可以用于存储子地址堆栈信息对应的解析地址信息和子地址堆栈信息对应的子代码堆栈信息之
间的关联关系,其中,这里的子地址堆栈信息可以为高等级的缓存空间对应的多个服务端,在运行应用时产生的子地址堆栈信息。
100.也即,高等级的缓存空间中存储的内容可以为多个低等级的缓存空间的内容之和。
101.例如,多个缓存空间包括高等级的缓存空间1、低等级的缓存空间2和低等级的缓存空间3,缓存空间1存储的内容可以为缓存空间2存储的内容与缓存空间3存储的内容之和。
102.上述堆栈解析服务即为flutter_retrace_tool服务,用于根据子地址堆栈信息对应的解析地址信息,还原出该子地址堆栈信息对应的子代码堆栈信息。
103.堆栈还原信息即为在使用flutter混淆方法,对应用文件包进行裁剪和打包时,从应用文件包中裁剪下的文件内容,该裁剪下来的文件内容用于将异常地址堆栈信息还原为异常代码堆栈信息。堆栈还原信息可以为mapping文件,mapping文件包括有各个异常地址堆栈信息、异常地址堆栈信息的名称、异常地址堆栈信息中各个子地址堆栈信息对应的解析地址信息,以及各个解析地址信息对应的子代码堆栈信息。在具体实施时,mapping文件中的解析地址信息可以为地址符号,也即,mapping文件中可以存储有各个地址符号和子代码堆栈信息的映射关系。
104.堆栈还原信息在使用flutter混淆方法对应用文件包进行裁剪和打包时生成,可以利用提交标识(commit id)唯一标识,在生成后可以上传至存储设备中进行持久存储。
105.本步骤在具体实施时,针对每个子地址堆栈信息,可以先确定多个缓存空间的任一缓存空间中,是否存储有与该子地址堆栈信息对应的解析地址信息相关的关联关系(关联关系用于指示解析地址信息对应的子代码堆栈信息)。在确定多个缓存空间中的任一缓存空间,均未存储有相关的关联关系的情况下,也即,在确定任一缓存空间,均未存储有与该子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息的情况下,则可以调用flutter_retrace_tool服务,利用flutter_retrace_tool服务,基于解析地址信息和应用对应的堆栈还原信息,对该子地址堆栈信息进行还原,得到该子地址堆栈信息对应的子代码堆栈信息。
106.在另一种实施方式中,在确定个缓存空间中的任一缓存空间,存储有与该子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息的情况下,可以直接将该子代码堆栈信息,作为当前正在处理的该子地址堆栈信息对应的子代码堆栈信息。
107.这样,通过异常地址堆栈信息拆分为单行子地址堆栈信息,并对单行子地址堆栈信息进行还原处理的方式,相比将异常地址堆栈信息整体进行还原处理的方式,可以有效减少还原处理所需要消耗的计算资源,从而提高堆栈还原的速度。在多个缓存空间均不存在解析地址信息对应的子代码堆栈信息的情况下,才调用堆栈解析服务进行堆栈还原,可以避免每次进行堆栈还原都需要新建进程、加载堆栈还原信息的操作,进而可以有效提高能够并行处理的异常地址堆栈信息的数量,实现大规模并发操作。此外,即使需要调用堆栈解析服务进行堆栈还原,该堆栈解析服务每次需要处理的信息均为数据量更小的子地址堆栈信息,堆栈还原速度能够得到有效保障,有效解决了堆栈还原的延迟问题。
108.在一种实施例中,针对s103中调用堆栈解析服务,基于解析地址信息和应用对应的堆栈还原信息,还原得到子地址堆栈信息对应的子代码堆栈信息的步骤,还可以按照以
下步骤实施:
109.s103-1:调用堆栈解析服务,利用哈希算法基于解析地址信息,从堆栈解析服务运行的解析实例中,确定用于处理解析地址信息的目标实例。
110.这里,堆栈解析服务中可以运行有多个已创建的解析实例,解析实例用于将异常的地址堆栈信息还原为代码堆栈信息。具体的,解析实例具体可以为运行的机器,例如,一个解析实例即为一个服务器。
111.具体实施时,在确定任一缓存空间中均未存储有与子地址堆栈信息对应的子代码堆栈信息的情况下,可以调用flutter_retrace_tool服务,并在调用堆栈解析服务时,可以利用一致性哈希(hash)算法,对解析地址信息进行处理,确定出该解析地址信息对应的哈希值。之后,可以根据哈希值,从flutter_retrace_tool服务中正在运行的多个解析实例中,确定与该哈希值匹配的解析实例,将该解析实例作为确定出的用于处理解析地址信息的目标实例。
112.s103-2:利用目标实例,基于解析地址信息和应用对应的堆栈还原信息,还原得到子地址堆栈信息对应的子代码堆栈信息。
113.具体实施时,可以利用目标实例,根据子地址堆栈信息对应的地址符号和mapping文件中存储的各个地址符号和子代码堆栈信息的映射关系,确定出与子地址堆栈信息对应的地址符号相匹配的地址符号,将该匹配的地址符号对应的子代码堆栈信息,作为还原后得到的子地址堆栈信息对应的子代码堆栈信息。
114.在一种实施方式中,如果堆栈解析服务中不存在与解析地址信息相匹配的目标实例,或者,堆栈解析服务中不存在空闲的解析实例,还可以利用自动扩缩容的方式,在堆栈解析服务中新建解析实例,并利用新建的解析实例,基于解析地址信息和=堆栈还原信息,将子地址堆栈信息还原为子代码堆栈信息。
115.在一种实施例中,s103-2可以按照以下步骤实施:
116.s103-2-1:确定目标实例中当前存在的已创建解析进程中,是否存在与解析地址信息相匹配的第一目标解析进程。
117.这里,解析实例中可以包括一个或多个已创建解析进程,已创建解析进程用于对解析地址信息进行处理,从而还原出与解析地址信息对应的子地址堆栈信息相匹配的子代码堆栈信息。一个解析实例可以对应于多个解析地址信息,不同的已创建解析进程可以用于处理不同的解析地址信息。例如,解析实例1可以对应于解析地址信息1、解析地址信息2和解析地址信息3,解析实例中的已创建解析进程1可以处理解析地址信息1,已创建解析进程2可以处理解析地址信息2,已创建解析进程3可以处理解析地址信息3。
118.与解析地址信息相匹配的第一目标解析进程具体为:已创建解析进程中,用于根据解析地址信息,还原出子地址堆栈信息对应的子代码堆栈信息的解析进程。
119.具体实施时,在确定目标实例后,可以先确定目标实例中当前存在的各个已创建解析进程,之后,可以确定各个已创建解析进程中,是否存在与解析地址信息相匹配的第一目标解析进程,也即确定已创建解析进程中是否存在能够处理该解析地址信息的解析进程。
120.s103-2-2:在目标实例中存在第一目标解析进程的情况下,利用第一目标解析进程,基于第一目标解析进程中已加载完成的堆栈还原信息,对解析地址信息进行堆栈还原,
得到子地址堆栈信息对应的子代码堆栈信息。
121.这里,由于已创建解析进程在创建时用于对异常地址堆栈信息进行还原,所以其中必定包括已加载完成的堆栈还原信息。而第一目标解析进程为已创建解析进程中的一个解析进程,所以第一目标解析进程中必定存在已加载完成的堆栈还原信息。
122.基于此,在确定存在第一目标解析进程的情况下,利用第一目标解析进程进行堆栈还原。具体的,可以已加载完成的堆栈还原信息中存储的各个解析地址信息对应的子代码堆栈信息,确定出当前正在处理的解析地址信息对应的子代码堆栈信息,将该子代码堆栈信息作为当前正在处理的子地址堆栈信息对应的子代码堆栈信息。
123.这里,利用一致性哈希算法对解析地址信息进行处理,能够实现将在不同时刻确定的同一个解析地址信息,均发送至同一个目标实例,并利用目标实例中的已创建解析进程进行处理。如此,可以避免不同的解析实例中开启着相同的解析进程的问题,从而提高可并行处理子地址堆栈信息的数量。
124.在另一种实施例中,在目标实例中不存在第一目标解析进程的情况下,则可以新建解析进程的方式对解析地址信息对应的子地址堆栈信息进行还原。具体的,可以在目标实例中创建与解析地址信息匹配的第二目标解析进程,这里,与解析地址信息匹配的第二目标解析进程即为能够根据解析地址信息,还原出子地址堆栈信息对应的子代码堆栈信息的解析进程。
125.之后,可以在第二目标解析进程中加载在编译应用时生成并存储的堆栈还原信息。这里,由上述实施例可知,堆栈还原信息在生成后可以上传至存储设备中进行持久存储。因此,在具体实施时,在第二目标解析进程创建成功的情况下,可以根据对解析地址信息进行一致性哈希后得到的哈希值,和预先创建的存储有各种哈希值与元信息之间的对应关系的数据库(如mysql数据库),确定该哈希值对应的目标元信息。其中,元信息具体可以在存储设备中持久存储的堆栈还原信息的名称、commit id等。然后,可以利用目标元信息,从存储设备中存储的多个堆栈还原信息中,确定出目标元信息对应的堆栈还原信息。最后,可以将该堆栈还原信息加载至第二目标解析进程。
126.进一步的,可以利用第二目标解析进程,基于加载的堆栈还原信息,对解析地址信息进行堆栈还原,得到子地址堆栈信息对应的子代码堆栈信息。这里,第二目标解析进程还原得到子地址堆栈信息对应的子代码堆栈信息的步骤,可以参照上述s103-2-2中利用第一目标解析进程还原得到子代码堆栈信息的步骤,此处不再赘述。
127.另外,堆栈解析服务中也可以新建解析实例,在确定堆栈解析服务不存在与可使用的目标实例的情况下,可以先新建目标实例,并在目标实例中新建解析进程,利用新建的解析进程,还原得到子地址堆栈信息对应的子代码堆栈信息。
128.在一种实施例中,各个解析实例中的已创建解析进程可以使用最近最少使用lru算法进行调度。因此,在利用目标实例中的第一目标解析进程将子地址堆栈信息还原为子代码堆栈信息之后,还可以更新利用最近最少使用lru算法存储的第一目标解析进程的最近使用时间信息。
129.另外,针对在目标实例中创建与解析地址信息匹配的第二目标解析进程的步骤,由于目标实例中可容纳的解析进程的数量有限,因此,在创建第二目标解析实例之前,还需要确定目标实例中的已创建解析进程的数量是否满足预设数量。其中,预设数量为目标实
例可容纳的解析进程的最大数量。如果否,则可以直接在目标实例中创建第二目标解析实例。如果是,则说明目标实例中当前保存的已创建解析进程的数量已达最大,无法保存新的解析进程。从而,为了保证第二目标解析进程能够成功创建并保存在目标实例中,则可以获取存储的各个已创建解析进程对应的最近使用时间信息,并根据各个已创建解析进程对应的最近使用时间信息,从目标实例中的多个已创建解析进程中筛选出最久未使用的已创建解析进程。
130.进一步的,可以删除最久未使用的已创建解析进程,并在目标实例中创建第二目标解析进程。这样,最久未使用的已创建解析进程一般为不常用的解析进程,通过删除这种类型的解析进程再创建新的解析进程的方式,既可以保证目标实例中的解析进程的数量被控制在预设数量内,避免出现内存用完(out of memory,oom)的情况,还可以保证存储在目标实例中的解析进程均为活跃性较高的常用进程,保证了目标实例的活力。
131.在一种实施例中,多个缓存空间具体可以包括本地缓存空间和持久化远程存储空间,其中,本地缓存空间即接收异常地址堆栈信息的服务端对应的本地存储空间,本地缓存空间为一个低等级的存储空间,持久化远程存储空间为一个高等级的存储空间,对应于多个服务端。在具体实施时,本地缓存空间和持久化远程存储空间均可以为键值对(key-value)存储空间。
132.在利用第二目标解析进程,基于加载的堆栈还原信息,对解析地址信息进行堆栈还原,得到子地址堆栈信息对应的子代码堆栈信息之后,还可以将解析地址信息和还原得到的子代码堆栈信息作为一个键值对,存储至本地缓存空间和持久化远程存储空间,其中,解析地址信息可以作为键值对中的键,子代码堆栈信息可以作为键值对中的值。这样,在持久化远程存储空间对应于多个服务端的基础上,持久化远程存储空间可以存储多个服务端对应的键值对。
133.或者,在利用第一目标解析进程还原得到子地址堆栈信息对应的子代码堆栈信息的情况下,也可以将解析地址信息和还原得到的子代码堆栈信息作为一个键值对,存储至本地缓存空间和持久化远程存储空间。
134.如此,通过将解析地址信息和还原得到的子代码堆栈信息作为键值对存储至多个缓存空间中,可以在后续接收到新的异常地址堆栈信息并确定各行子地址堆栈信息后,先从缓存空间中确定是否存在对应的子代码堆栈信息,如果是,则可以直接使用,不需要在利用解析进程处理,节省了资源量。
135.在一种实施例中,在本地存储空间和持久化远程存储空间均为key-value存储空间的情况下,还可以按照以下步骤确定多个缓存空间中任一缓存空间是否存储有与子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息:
136.将与子地址堆栈信息对应的解析地址信息作为查询键,并按照多个缓存空间分别对应的查询优先级,依次从本地缓存空间和持久化远程存储空间中分别已存储的键值对中,确定是否存在与查询键相匹配的目标键值对。
137.这里,由于持久化远程存储空间中存储的键值对可以对应于多个服务端,所以在本地缓存空间中不存在与查询键相匹配的目标键值对,还可以再从持久化远程存储空间中存储的更丰富的键值对中,确定是否存在目标键值对。因此,针对查询优先级,可以设置本地缓存空间的优先级大于持久化远程存储空间的优先级,以实现分级查询。
138.具体实施时,确定出查询键之后,可以先从本地缓存空间中存储的键值对中,确定是否存在与查询键相匹配的目标键值对,如果否,再从持久化远程存储空间中存储的键值对中,确定是否存在与查询键相匹配的目标键值对。
139.进一步的,在确定本地缓存空间和持久化远程存储空间中均不存在目标键值对的情况下,确定多个缓存空间中的任一缓存空间,均未存储有与子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息。
140.在另一种实施例中,在确定任一缓存空间中已存储的键值对中,存在目标键值对的情况下,可以直接将目标键值对中的值指示的子代码堆栈信息,作为子地址堆栈信息对应的子代码堆栈信息。
141.这里,如果存储有目标键值对的缓存空间为持久化远程存储空间,还可以将该目标键值对存储至本地缓存空间中。
142.如图2所示,为本公开实施例提供的一种异常信息处理的具体实施流程示意图,具体的,可以利用异常地址堆栈接收服务(flutter_crash_sink服务)获取异常堆栈地址信息,然后可以利用堆栈还原服务(flutter_retrace服务),根据异常地址堆栈信息,确定异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息。针对每行子地址堆栈信息,可以将与该子地址堆栈信息对应的解析地址信息作为查询键,并按照多个缓存空间分别对应的查询优先级,依次从本地缓存空间和持久化远程存储空间中分别已存储的键值对中,确定是否存在与查询键相匹配的目标键值对。
143.如果是,则将目标键值对中的值指示的子代码堆栈信息,作为子地址堆栈信息对应的子代码堆栈信息。如果否,可以调用堆栈解析服务(flutter_retrace_tool服务),并利用一致性哈希(hash)算法,对解析地址信息进行处理,以从flutter_retrace_tool服务中正在运行的多个解析实例中,确定出该子地址堆栈信息对应的目标实例。
144.之后,可以确定目标实例中是否存在第一目标解析进程,如果是,则利用第一目标解析进程,还原得到子地址堆栈信息对应的子代码堆栈信息;如果否,则可以在目标实例中创建第二目标解析进程,并根据对解析地址信息进行一致性哈希后得到的哈希值,和预先创建的存储有各种哈希值与元信息之间的对应关系的mysql数据库,确定目标元信息。再利用目标元信息,从存储设备中存储的多个堆栈还原信息中,确定出目标元信息对应的堆栈还原信息并将该堆栈还原信息加载至第二目标解析进程。最后,可以利用第二目标解析进程,还原得到子地址堆栈信息对应的子代码堆栈信息。
145.本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
146.基于同一发明构思,本公开实施例中还提供了与异常信息处理方法对应的异常信息处理装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述异常信息处理方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
147.如图3所示,为本公开实施例提供的一种异常信息处理装置的示意图,包括:
148.获取模块301,用于获取应用在运行时产生的异常地址堆栈信息;所述应用基于flutter应用开发框架开发得到;
149.确定模块302,用于根据所述异常地址堆栈信息,确定所述异常地址堆栈信息中的
每一行子地址堆栈信息对应的解析地址信息;
150.还原模块303,用于针对每个所述子地址堆栈信息,若多个缓存空间中的任一缓存空间,均未存储与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息,则调用堆栈解析服务,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息。
151.在一种可能的实施方式中,所述还原模块303,在执行所述调用堆栈解析服务,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息时,用于调用所述堆栈解析服务,利用哈希算法基于所述解析地址信息,从所述堆栈解析服务运行的解析实例中,确定用于处理所述解析地址信息的目标实例;
152.利用所述目标实例,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息。
153.在一种可能的实施方式中,所述还原模块303,在执行所述利用所述目标实例,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息时,用于确定所述目标实例中当前存在的已创建解析进程中,是否存在与所述解析地址信息相匹配的第一目标解析进程;
154.在所述目标实例中存在所述第一目标解析进程的情况下,利用所述第一目标解析进程,基于第一目标解析进程中已加载完成的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息。
155.在一种可能的实施方式中,所述还原模块303,还用于在所述目标实例中不存在所述第一目标解析进程的情况下,在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程,并在所述第二目标解析进程中加载在编译所述应用时生成并存储的堆栈还原信息;
156.利用所述第二目标解析进程,基于加载的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息。
157.在一种可能的实施方式中,所述多个缓存空间包括本地缓存空间和持久化远程存储空间;
158.所述装置还包括存储模块304,用于在所述利用所述第二目标解析进程,基于加载的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息之后,将所述解析地址信息和得到的所述子代码堆栈信息作为键值对,存储至所述本地缓存空间和所述持久化远程存储空间,其中,所述解析地址信息作为所述键值对中的键,所述子代码堆栈信息作为所述键值对中的值;所述本地缓存空间为接收所述异常地址堆栈信息的服务端对应的本地缓存空间;所述持久化远程存储空间用于存储多个服务端对应的键值对。
159.在一种可能的实施方式中,所述还原模块303,还用于在所述利用所述第一目标解析进程,基于第一目标解析进程中已加载完成的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息之后,更新利用最近最少使用lru算法存储的所述第一目标解析进程的最近使用时间信息;
160.以及在执行所述在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程时,用于在所述目标实例中的已创建解析进程的数量满足预设数量的情况下,根据
各个所述已创建解析进程对应的最近使用时间信息,从多个所述已创建解析进程中筛选出最久未使用的已创建解析进程;
161.删除所述最久未使用的已创建解析进程,并在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程。
162.在一种可能的实施方式中,所述还原模块303,还用于按照以下步骤确定所述多个缓存空间中任一缓存空间是否存储有与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息:
163.将与所述子地址堆栈信息对应的解析地址信息作为查询键,并按照多个缓存空间分别对应的查询优先级,依次从所述本地缓存空间和所述持久化远程存储空间中分别已存储的键值对中,确定是否存在与所述查询键相匹配的目标键值对;
164.在确定不存在所述目标键值对的情况下,确定所述多个缓存空间中的任一缓存空间,均未存储有与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息。
165.在一种可能的实施方式中,所述还原模块303,还用于在确定存在所述目标键值对的情况下,将所述目标键值对中的值指示的子代码堆栈信息,作为所述子地址堆栈信息对应的子代码堆栈信息。
166.在一种可能的实施方式中,所述确定模块302,在执行所述根据所述异常地址堆栈信息,确定所述异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息时,用于对所述异常地址堆栈信息进行堆栈解析,确定所述异常地址堆栈信息对应的堆栈头信息和地址堆栈信息,并从所述地址堆栈信息中,拆分得到每一行子地址堆栈信息;
167.针对每一行子地址堆栈信息,基于所述子地址堆栈信息和所述堆栈头信息,确定所述子地址堆栈信息对应的解析地址信息。
168.关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
169.本公开实施例还提供了一种计算机设备,如图4所示,为本公开实施例提供的一种计算机设备结构示意图,包括:
170.处理器41、存储器42和总线43。其中,存储器42存储有处理器41可执行的机器可读指令,处理器41用于执行存储器42中存储的机器可读指令,所述机器可读指令被处理器41执行时,处理器41执行下述步骤:s101:获取应用在运行时产生的异常地址堆栈信息;应用基于flutter应用开发框架开发得到;s102:根据异常地址堆栈信息,确定异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息以及s103:针对每个子地址堆栈信息,若多个缓存空间中的任一缓存空间,均未存储与子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息,则调用堆栈解析服务,基于解析地址信息和应用对应的堆栈还原信息,还原得到子地址堆栈信息对应的子代码堆栈信息。
171.上述存储器42包括内存421和外部存储器422;这里的内存421也称内存储器,用于暂时存放处理器41中的运算数据,以及与硬盘等外部存储器422交换的数据,处理器41通过内存421与外部存储器422进行数据交换,当计算机设备运行时,处理器41与存储器42之间通过总线43通信,使得处理器41在执行上述方法实施例中所提及的执行指令。
172.上述指令的具体执行过程可以参考本公开实施例中所述的异常信息处理方法的步骤,此处不再赘述。
173.本公开实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行上述方法实施例中所述的异常信息处理方法的步骤。其中,所述存储介质可以是易失性或非易失的计算机可读取存储介质。
174.本公开实施例所提供的异常信息处理方法的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行上述方法实施例中所述的异常信息处理方法的步骤,具体可参见上述方法实施例,在此不再赘述。
175.所述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(software development kit,sdk)等等。
176.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应所述理解到,所揭露的装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
177.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
178.另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
179.所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者所述技术方案的部分可以以软件产品的形式体现出来,所述计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
180.最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。

技术特征:
1.一种异常信息处理方法,其特征在于,包括:获取应用在运行时产生的异常地址堆栈信息;所述应用基于flutter应用开发框架开发得到;根据所述异常地址堆栈信息,确定所述异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息;针对每个所述子地址堆栈信息,若多个缓存空间中的任一缓存空间,均未存储与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息,则调用堆栈解析服务,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息。2.根据权利要求1所述的方法,其特征在于,所述调用堆栈解析服务,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息,包括:调用所述堆栈解析服务,利用哈希算法基于所述解析地址信息,从所述堆栈解析服务运行的解析实例中,确定用于处理所述解析地址信息的目标实例;利用所述目标实例,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息。3.根据权利要求2所述的方法,其特征在于,所述利用所述目标实例,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息,包括:确定所述目标实例中当前存在的已创建解析进程中,是否存在与所述解析地址信息相匹配的第一目标解析进程;在所述目标实例中存在所述第一目标解析进程的情况下,利用所述第一目标解析进程,基于第一目标解析进程中已加载完成的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息。4.根据权利要求3所述的方法,其特征在于,所述方法还包括:在所述目标实例中不存在所述第一目标解析进程的情况下,在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程,并在所述第二目标解析进程中加载在编译所述应用时生成并存储的堆栈还原信息;利用所述第二目标解析进程,基于加载的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息。5.根据权利要求4所述的方法,其特征在于,所述多个缓存空间包括本地缓存空间和持久化远程存储空间;在所述利用所述第二目标解析进程,基于加载的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息之后,还包括:将所述解析地址信息和得到的所述子代码堆栈信息作为键值对,存储至所述本地缓存空间和所述持久化远程存储空间,其中,所述解析地址信息作为所述键值对中的键,所述子代码堆栈信息作为所述键值对中的值;所述本地缓存空间为接收所述异常地址堆栈信息的服务端对应的本地缓存空间;所述持久化远程存储空间用于存储多个服务端对应的键值对。
6.根据权利要求4所述的方法,其特征在于,在所述利用所述第一目标解析进程,基于第一目标解析进程中已加载完成的所述堆栈还原信息,对所述解析地址信息进行堆栈还原,得到所述子地址堆栈信息对应的子代码堆栈信息之后,还包括:更新利用最近最少使用lru算法存储的所述第一目标解析进程的最近使用时间信息;所述在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程,包括:在所述目标实例中的已创建解析进程的数量满足预设数量的情况下,根据各个所述已创建解析进程对应的最近使用时间信息,从多个所述已创建解析进程中筛选出最久未使用的已创建解析进程;删除所述最久未使用的已创建解析进程,并在所述目标实例中创建与所述解析地址信息匹配的第二目标解析进程。7.根据权利要求5所述的方法,其特征在于,所述方法还包括确定所述多个缓存空间中任一缓存空间是否存储有与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息的步骤:将与所述子地址堆栈信息对应的解析地址信息作为查询键,并按照多个缓存空间分别对应的查询优先级,依次从所述本地缓存空间和所述持久化远程存储空间中分别已存储的键值对中,确定是否存在与所述查询键相匹配的目标键值对;在确定不存在所述目标键值对的情况下,确定所述多个缓存空间中的任一缓存空间,均未存储有与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息。8.根据权利要求7所述的方法,其特征在于,所述方法还包括:在确定存在所述目标键值对的情况下,将所述目标键值对中的值指示的子代码堆栈信息,作为所述子地址堆栈信息对应的子代码堆栈信息。9.根据权利要求1所述的方法,其特征在于,所述根据所述异常地址堆栈信息,确定所述异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息,包括:对所述异常地址堆栈信息进行堆栈解析,确定所述异常地址堆栈信息对应的堆栈头信息和地址堆栈信息,并从所述地址堆栈信息中,拆分得到每一行子地址堆栈信息;针对每一行子地址堆栈信息,基于所述子地址堆栈信息和所述堆栈头信息,确定所述子地址堆栈信息对应的解析地址信息。10.一种异常信息处理装置,其特征在于,包括:获取模块,用于获取应用在运行时产生的异常地址堆栈信息;所述应用基于flutter应用开发框架开发得到;确定模块,用于根据所述异常地址堆栈信息,确定所述异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息;还原模块,用于针对每个所述子地址堆栈信息,若多个缓存空间中的任一缓存空间,均未存储与所述子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息,则调用堆栈解析服务,基于所述解析地址信息和所述应用对应的堆栈还原信息,还原得到所述子地址堆栈信息对应的子代码堆栈信息。11.一种计算机设备,其特征在于,包括:处理器、存储器,所述存储器存储有所述处理器可执行的机器可读指令,所述处理器用于执行所述存储器中存储的机器可读指令,所述机器可读指令被所述处理器执行时,所述处理器执行如权利要求1至8任意一项所述的异常
信息处理方法的步骤。12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被计算机设备运行时,所述计算机设备执行如权利要求1至8任意一项所述的异常信息处理方法的步骤。

技术总结
本公开提供了一种异常信息处理方法、装置、计算机设备和存储介质,其中,所述方法包括:获取应用在运行时产生的异常地址堆栈信息;应用基于flutter应用开发框架开发得到;根据异常地址堆栈信息,确定异常地址堆栈信息中的每一行子地址堆栈信息对应的解析地址信息;针对每个子地址堆栈信息,若多个缓存空间中的任一缓存空间,均未存储与子地址堆栈信息对应的解析地址信息相关联的子代码堆栈信息,则调用堆栈解析服务,基于解析地址信息和应用对应的堆栈还原信息,还原得到子地址堆栈信息对应的子代码堆栈信息。的子代码堆栈信息。的子代码堆栈信息。


技术研发人员:贾宁 贾晓蓬
受保护的技术使用者:北京字节跳动网络技术有限公司
技术研发日:2022.04.06
技术公布日:2022/7/5
转载请注明原文地址: https://www.8miu.com/read-16945.html

最新回复(0)