数据处理方法、装置、电子设备及可读存储介质与流程

未命名 07-27 阅读:79 评论:0


1.本发明涉及计算机技术领域,尤其涉及一种数据处理方法、装置、电子设备及可读存储介质。


背景技术:

2.在日常程序开发中,应用程序难免会发生崩溃,而从应用程序导出的崩溃日志里都是一堆十六进制内存地址的集合,可读性较差,这些十六进制的堆栈信息组成的崩溃日志对崩溃问题的解决几乎毫无帮助。因此,需要对崩溃日志进行符号化,所谓符号化就是把崩溃日志转化为源代码的过程。符号化成功后的内容也称调试信息,调试信息即为源码信息,就是源代码,只有符号化成功后,开发人员能看懂源码信息才可以继续排查问题。
3.目前,针对组件符号化的局限性较高:例如,通过symbolicatecrash脚本进行符号化需要一个完整且固定格式.ips的崩溃文件,且symbolicatecrash在未来的xcode版本将要被废弃。
4.因此,如何降低组件符号化的局限性,成为亟待解决的问题。


技术实现要素:

5.本发明实施例提供一种数据处理方法、装置、电子设备及可读存储介质,以降低组件符号化方法的局限性。
6.本发明实施例第一方面提供了一种数据处理方法,所述方法包括:
7.获取应用程序中目标组件的加载地址和编码信息,所述目标组件是所述应用程序中需要还原调试信息的任一组件;
8.通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址;
9.根据所述目标组件的加载地址和起始地址,得到地址偏移量;
10.根据所述地址偏移量、所述编码信息以及所述目标组件的崩溃内存地址,生成所述目标组件崩溃时的调试信息。
11.可选的,所述根据所述地址偏移量、所述编码信息以及所述目标组件的崩溃内存地址,生成所述目标组件崩溃时的调试信息,包括:
12.根据所述地址偏移量和所述崩溃内存地址,得到文件地址;
13.根据所述编码信息中的源码信息对应的源码地址和所述文件地址,得到崩溃偏移;
14.根据所述崩溃偏移和所述源码信息,得到所述目标组件崩溃时的调试信息。
15.可选的,所述获取应用程序中目标组件的编码信息的步骤,包括:
16.利用目标系统指令确定所述目标组件的编码信息,所述目标系统指令包括nm指令;
17.所述编码信息中的源码信息以及所述源码地址是按照以下步骤确定的:
18.按照地址由小到大的顺序遍历所述编码信息的各个行的地址,直到查找到大于所述文件地址的当前行的地址时停止遍历;
19.将所述当前行的上一行的地址对应的信息确定为所述源码信息,以及,将所述当前行的上一行的地址确定为所述源码地址。
20.可选的,所述获取应用程序中目标组件的加载地址,包括:
21.通过程序工程中的image list命令或编写的源代码,获取所有组件的加载地址;
22.从所述所有组件的加载地址中,选取所述目标组件的加载地址。
23.可选的,在所述通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址之前,所述方法还包括:
24.判断本地是否存在所述目标组件;
25.在本地不存在所述目标组件的情况下,下载所述目标组件。
26.可选的,所述通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址,包括:
27.通过machoview打开所述目标组件,得到所述目标组件中的目标代码路径下的代码段;
28.分析所述代码段以从所述代码段中确定所述目标代码段,并根据所述目标代码段,获取所述目标组件的起始地址。
29.本发明实施例第二方面提供了一种数据处理装置,所述装置包括:
30.第一地址获取模块,用于获取应用程序中目标组件的加载地址和编码信息,所述目标组件是所述应用程序中需要还原调试信息的任一组件;
31.第二地址获取模块,用于通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址;
32.偏移量确定模块,用于根据所述目标组件的加载地址和起始地址,得到地址偏移量;
33.调试信息还原模块,用于根据所述地址偏移量、所述编码信息以及所述目标组件的崩溃内存地址,生成所述目标组件崩溃时的调试信息。
34.可选的,所述调试信息还原模块,包括:
35.第三地址获取模块,用于根据所述地址偏移量和所述崩溃内存地址,得到文件地址;
36.崩溃偏移确定模块,用于根据所述编码信息中的源码信息对应的源码地址和所述文件地址,得到崩溃偏移;
37.调试信息还原子模块,用于根据所述崩溃偏移和所述源码信息,得到所述目标组件崩溃时的调试信息。
38.可选的,所述第一地址获取模块,包括:编码信息获取模块,用于获取应用程序中目标组件的编码信息;
39.所述编码信息获取模块,包括:编码信息获取子模块,用于利用目标系统指令确定所述目标组件的编码信息,所述目标系统指令包括nm指令;
40.所述崩溃偏移确定模块,包括:源码信息确定模块,用于确定所述编码信息中的源码信息以及所述源码地址;
41.所述源码信息确定模块,包括:
42.遍历模块,用于按照地址由小到大的顺序遍历所述编码信息的各个行的地址,直到查找到大于所述文件地址的当前行的地址时停止遍历;
43.源码信息确定子模块,用于将所述当前行的上一行的地址对应的信息确定为所述源码信息,以及,将所述当前行的上一行的地址确定为所述源码地址。
44.可选的,所述第一地址获取模块,包括:
45.加载地址获取子模块,用于通过程序工程中的image list命令或编写的源代码,获取所有组件的加载地址;
46.第一地址获取子模块,从所述所有组件的加载地址中,选取所述目标组件的加载地址。
47.可选的,所述装置还包括:
48.判断模块,在所述通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址之前,判断本地是否存在所述目标组件;
49.下载模块,用于在本地不存在所述目标组件的情况下,下载所述目标组件。
50.可选的,所述第二地址获取模块,包括:
51.代码段确定子模块,用于通过machoview打开所述目标组件,得到所述目标组件中的目标代码路径下的代码段;
52.起始地址确定子模块,用于分析所述代码段以从所述代码段中确定所述目标代码段,并根据所述目标代码段,获取所述目标组件的起始地址。
53.本发明实施例第三方面提供一种电子设备,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如本发明第一方面所述的数据处理方法的步骤。
54.本发明实施例第四方面提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如本发明第一方面所述的数据处理方法的步骤。
55.通过本实施例的数据处理方法,首先,获取到应用程序中目标组件的加载地址和起始地址,确定目标组件的地址偏移量;然后根据地址偏移量、获取到的目标组件的编码信息以及目标组件的崩溃内存地址,还原目标组件崩溃时的调试信息。如此,本方法不再依赖于于.ips格式的文件,可以还原任意组件的崩溃堆栈,从而降低了组件符号化的局限性。
附图说明
56.为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
57.图1是本发明一实施例示出的一种数据处理方法的流程图;
58.图2是本发明一实施例示出的一种ios中还原系统符号调试信息的流程示意图;
59.图3是本发明一实施例提供的数据处理装置的结构框图;
60.图4是本发明一实施例示出的一种电子设备的示意图。
具体实施方式
61.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
62.请参考图1,图1是本发明一实施例示出的一种数据处理方法的流程图。本实施例提供的数据处理方法可应用于终端。在本实施例中,终端可以是指电脑、计算机。如图1所示,本实施例的数据处理方法可以包括以下步骤:
63.步骤s11:获取应用程序中目标组件的加载地址和编码信息,所述目标组件是所述应用程序中需要还原调试信息的任一组件。
64.本实施例中,终端可以获取到应用程序(app)中目标组件的加载地址和编码信息(即地址编码信息)。其中,目标组件是应用程序中需要还原调试信息的任一组件,该应用程序即为发生崩溃的应用程序,而本实施例的组件可以包括系统库,例如动态库、静态库等,也可以包括构成应用程序的其他组件。例如,在一实施例中,本实施例的组件可以为可以复用的组件,例如,对于能根据各种素材和组织形式生成app的app构建项目而言,可以根据一个具有完备组件库以及这些组件的依赖关系,组合成一个个应用程序app,其中用于构建app的个组件则可以为上述的目标组件,当然在本技术实施例中,目标组件也可以包括针对某一应用程序单独设置的组件,对此本技术实施例不加以限定。而组件的加载地址(load address)是每个二进制文件在操作系统中堆栈的起点,对于应用程序来说,每次应用程序启动,加载地址都不相同。
65.此外,在一可选实施例中,应用程序可以是ios上发生奔溃的应用程序,组件可以为ios系统库,常见的ios系统库有coredata.framework:数据库、mapkit.framework:地图、coreanimation.framework:动画等。而该实施例的目的为还原ios上的应用程序中的目标ios系统库的系统符号。
66.步骤s12:通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址。
67.本实施例中,终端可以通过定位目标组件中的目标代码路径下的目标代码段,从而根据目标代码段确定出该目标组件的起始地址。
68.步骤s13:根据所述目标组件的加载地址和起始地址,得到地址偏移量。
69.本实施例中,终端获取到目标组件的加载地址和目标组件的起始地址后,可以通过目标组件的加载地址和起始地址,得到目标组件的地址偏移量。
70.其中,在一实施例中,可以基于aslr规则,根据目标组件的加载地址和起始地址,计算得到目标组件的地址偏移量。
71.其中,aslr是一种防止攻击者定位攻击代码位置,针对缓冲区溢出的安全保护技术,可以使某些敏感数据(例如app登录注册、支付相关代码)配置到一个恶意程序无法事先获知的地址,令攻击者难以进行攻击。其中,aslr随机值与内存地址有如下换算关系:aslr地址随机偏移量=加载地址-起始地址。
72.因此,在该实施例中,目标组件的地址偏移量=目标组件的加载地址-目标组件的起始地址。
73.步骤s14:根据所述地址偏移量、所述编码信息以及所述目标组件的崩溃内存地址,生成所述目标组件崩溃时的调试信息。
74.本实施例中,终端获取到目标组件的地址偏移量、目标组件的编码信息,以及目标组件的崩溃内存地址后,即可根据组件的地址偏移量、目标组件的编码信息,以及目标组件的崩溃内存地址,还原目标组件崩溃时的调试信息,生成目标组件崩溃时的调试信息。
75.其中,目标组件的崩溃内存地址可以是终端根据崩溃文件(即崩溃日志),从崩溃文件中确定出的目标组件崩溃运行时的内存地址。
76.在本实施例中,不再通过symbolicatecrash脚本来还原组件符号调试信息,而是通过aslr,根据获取到的目标组件的加载地址和起始地址,确定出目标组件的地址偏移量;再根据地址偏移量、获取到的目标组件的编码信息以及目标组件的崩溃内存地址,还原目标组件崩溃时的调试信息。如此,本实施例不仅不依赖于.ips格式的文件,可以还原任意组件的崩溃堆栈,从而降低了组件符号化的局限性。
77.结合以上实施例,在一实施方式中,本发明实施例还提供了一种数据处理方法。在该方法中,上述步骤s14具体可以包括步骤s21-步骤s23:
78.步骤s21:根据所述地址偏移量和所述崩溃内存地址,得到文件地址。
79.本实施例中,终端可以根据目标组件的地址偏移量和目标组件的崩溃内存地址,得到应用程序在磁盘内的文件地址。
80.在一种实施例中,可以是基于aslr规则,根据目标组件的地址偏移量和目标组件的崩溃内存地址,计算得到应用程序在磁盘内的文件地址:应用程序在磁盘内的文件地址=目标组件的崩溃内存地址-目标组件的地址偏移量。
81.步骤s22:根据所述编码信息中的源码信息对应的源码地址和所述文件地址,得到崩溃偏移。
82.本实施例中,终端可以从系统指令确定出的目标组件的编码信息中,确定出应用程序崩溃运行的源码信息,根据应用程序崩溃运行的源码信息确定出源码信息所对应的、应用程序崩溃运行的源码地址,从而根据应用程序崩溃运行的源码地址和应用程序在磁盘内的文件地址,得到此行目标组件的崩溃偏移。本实施例是以“行”为维度,还原目标组件的堆栈。
83.在一种实施例中,可以是基于aslr规则,根据应用程序崩溃运行的源码地址和应用程序在磁盘内的文件地址,计算得到目标组件的崩溃偏移:目标组件的崩溃偏移=应用程序在磁盘内的文件地址-应用程序崩溃运行的源码地址。
84.步骤s23:根据所述崩溃偏移和所述源码信息,得到所述目标组件崩溃时的调试信息。
85.本实施例中,终端得到目标组件的崩溃偏移后,可以根据目标组件的崩溃偏移和应用程序崩溃运行的源码信息,得到目标组件崩溃时的调试信息。具体的,可以是将应用程序崩溃运行的源码信息加上目标组件的崩溃偏移,得到目标组件崩溃时的调试信息,从而实现应用程序中目标组件符号调试信息的还原。
86.在本实施例中,通过地址偏移量和崩溃内存地址,得到文件地址;根据源码信息对应的源码地址以及得到的文件地址,计算地址所在行的目标组件的崩溃偏移,从而根据崩溃偏移和对应的源码信息,还原目标组件崩溃时的调试信息。本实施例是以“行”为维度还
原目标组件堆栈,使用成本小,比较轻量级;可以还原崩溃日志中任意行堆栈的调式信息,而无需还原整篇崩溃日志的调试信息,从而解决了symbolicatecrash符号化无法单独还原某一行堆栈的调试信息,只能还原整篇崩溃日志的问题,进一步降低了组件符号化的局限性。
87.结合以上实施例,在一实施方式中,本发明实施例还提供了一种数据处理方法。在该方法中,上述步骤s11中的“获取应用程序中目标组件的编码信息”可以包括步骤s31,上述步骤s22中“编码信息中的源码信息”以及“源码地址”是按照以下步骤s32和s33确定的:
88.步骤s31:利用目标系统指令确定所述目标组件的编码信息,所述目标系统指令包括nm指令。
89.本实施例中,终端可以利用目标系统指令确定出目标组件的地址编码信息。其中,本实施例的系统指令指的是linux命令,linux命令是对linux系统进行管理的命令。对于linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,linux系统管理的命令是它正常运行的核心,与之前的dos命令类似。linux命令在系统中有两种类型:内置shell命令和linux命令。具体的,本实施例中的目标系统指令包括nm指令,终端可以利用系统nm指令工具得到目标组件的地址编码信息。
90.步骤s32:按照地址由小到大的顺序遍历所述编码信息的各个行的地址,直到查找到大于所述文件地址的当前行的地址时停止遍历。
91.本实施例中,终端利用系统nm指令工具得到目标组件的编码信息,该编码信息实际为目标组件的地址编码信息,地址编码信息包括:地址及地址对应的编码信息,nm-m指令将目标组件的地址编码信息按照地址由小到大的顺序进行排列。终端根据获取到的应用程序在磁盘内的文件地址,在目标组件的地址编码信息的地址中进行查找,直到查找到大于应用程序在磁盘内的文件地址的当前行的地址时停止查找;也即,终端按照地址由小到大的顺序遍历目标组件的地址编码信息的各个行的地址,直到查找到大于应用程序在磁盘内的文件地址的当前行的地址时停止遍历。
92.步骤s33:将所述当前行的上一行的地址对应的信息确定为所述源码信息,以及,将所述当前行的上一行的地址确定为所述源码地址。
93.本实施例中,终端将停止遍历时当前行的上一行的地址所对应的编码信息确定为应用程序崩溃运行的源码信息,将当前行的上一行的地址确定为应用程序崩溃运行的源码地址,该源码地址与源码信息对应。
94.在本实施例中,通过nm-m指令将目标组件的编码信息按地址大小的顺序排列,从而按照地址由小到大的顺序遍历目标组件的编码信息的各个行的地址,直到查找到大于文件地址的当前行的地址时停止遍历,以确定目标行的应用程序崩溃运行的源码地址以及应用程序崩溃运行的源码信息,从而在编码信息中精准确定想要还原的目标行的源码地址及源码信息,以从“行”为维度还原目标组件堆栈提供基础。
95.结合以上实施例,在一实施方式中,本发明实施例还提供了一种数据处理方法。该方法中上述步骤s11中的“获取应用程序中目标组件的加载地址”具体可以包括步骤s41和步骤s42:
96.步骤s41:通过程序工程中的image list命令或编写的源代码,获取所有组件的加载地址。
97.本实施例中,终端可以通过两种方式获取应用程序中所有组件的加载地址。其中,第一种方式为:通过程序工程xcode获取应用程序中所有组件的加载地址;具体的,可以是基于xcode通过调试命令image list输出所有组件的加载地址。
98.第二种方式为:通过编写的源代码,遍历应用程序中所有的动态库,确定出所有动态库的加载地址。其中动态库至少包括:组件和app自定义动态库。
99.需要说明的是,本实施例可以自由选择获取所有组件的加载地址的方式,本实施例对此不作任何限制。
100.步骤s42:从所述所有组件的加载地址中,选取所述目标组件的加载地址。
101.本实施例中,终端在获取到应用程序中所有组件的加载地址后,可以从所有组件中选择目标组件,并从所有组件的加载地址中确定目标组件的加载地址。
102.在本实施例中,终端通过xcode工程/代码可以一次性保存应用程序中全部的动态库,从而使得获取应用程序中所有组件的加载地址更加方便高效。
103.结合以上实施例,在一实施方式中,本发明实施例还提供了一种数据处理方法。在该方法中,在上述步骤s12之前,还可以包括步骤s51和步骤s52:
104.步骤s51:判断本地是否存在所述目标组件。
105.本实施例考虑到相关组件符号化方法中,是通过bugly/友盟等第三方平台进行监控,会出现由于第三方平台组件缺失,导致组件无法还原调试信息的情况,为了避免上述问题,本实施例在获取目标组件的起始地址之前,需要判断本地是否存在该目标组件。
106.步骤s52:在本地不存在所述目标组件的情况下,下载所述目标组件。
107.本实施例中,在确定出本地存在目标组件的情况下,可以直接通过定位目标组件中的目标代码路径下的目标代码段,确定目标组件的起始地址。而在确定出本地不存在目标组件的情况下,终端需要下载目标组件,从而使得本地存在有该目标组件,然后通过定位目标组件中目标代码路径下的目标代码段,确定目标组件的起始地址。
108.在本实施例中,通过判断本地是否存在目标组件,以及在本地不存在目标组件的情况下,自行下载需要的目标组件进行调试信息的还原,从而避免了第三方平台因组件缺失导致的调试信息还原失败问题。
109.结合以上实施例,在一实施方式中,本发明实施例还提供了一种数据处理方法。在该方法中,上述步骤s12具体可以包括步骤s61和s62:
110.步骤s61:通过machoview打开所述目标组件,得到所述目标组件中的目标代码路径下的代码段。
111.本实施例中,可以通过终端上安装的machoview(mach-o文件浏览器)打开目标组件,从而得到目标组件的多个目标路径,例如可以是lg_segment_64(

),再从多个目标路径中确定出目标代码路径,例如可以是lg_segment_64(__text),从而根据目标代码路径确定出目标代码路径下的代码段。
112.步骤s62:分析所述代码段以从所述代码段中确定所述目标代码段,并根据所述目标代码段,获取所述目标组件的起始地址。
113.本实施例中,目标代码路径下的代码段可以有一个或多个,在得到目标代码路径下的代码段之后,可以对代码段进行分析,从而从代码段中确定出目标代码段,该目标代码段用于指示目标组件的起始地址,从而根据该目标代码段,获取到该目标组件的起始地址。
114.在本实施例中,通过machoview可以直接确定目标组件动态库的所有信息,从而得到目标组件的起始地址,相较于通过每次输入的系统指令获取动态库的相关信息,更加简单、方便、高效。
115.在一可选实施方式中,组件为系统库,在该方法中,首先需要记录下工程里所有系统库的load address,这样在项目上线后终端都可以找到,从而确定出目标系统库的加载地址;然后,下载好目标系统库,通过machoview可以确定目标系统库的起始地址,从而根据目标系统库的加载地址和起始地址得到alsr地址偏移量;接下来,利用崩溃内存地址与计算出来的地址偏移量换算出文件;然后,利用系统nm指令工具确定出目标系统库的源码地址与编码信息,根据上一步取出的文件地址去编码信息里查找就可以找到程序崩溃运行的源码信息,根据文件地址和源码地址计算出崩溃偏移,从而根据源码信息和崩溃偏移还原了目标系统库崩溃时的调试信息。
116.具体的,参见图2,图2是本发明一实施例示出的一种ios中还原系统符号调试信息的流程示意图。如图2所示,一种ios中还原系统符号调试信息的方法可以包括以下步骤:
117.1、根据程序工程(xcode)或源代码获取应用程序中所有系统库的加载地址,从中确定出目标系统库的加载地址。其中,可以是在xcode控制面板通过调试命令image list输出所有系统库的加载地址,也可以是通过代码,遍历应用程序中所有的动态库(系统库和app自定义动态库等),确定出应用程序中所有的动态库的加载地址。
118.2、判断本地是否存在目标系统库,在不存在的情况下,下载目标系统库,从而通过machoview打开下载好的目标系统库,确定出目标系统库的起始地址。具体的,可以是通过machoview打开目标系统库,得到目标系统库中的目标代码路径下的代码段,然后分析代码段以从代码段中确定目标代码段,并根据目标代码段获取到目标系统库的起始地址。
119.3、根据加载地址和起始地址,计算目标系统库的随机地址偏移量(aslr slide);其中,目标系统库的随机地址偏移量=加载地址-起始地址。
120.4、在崩溃日志中确定出目标系统库崩溃运行时的崩溃内存地址,其中,崩溃日志可以是.ips或bugly格式。
121.5、利用目标系统库崩溃运行时的崩溃内存地址,以及,目标系统库的随机地址偏移量,计算应用程序在磁盘内的文件地址;其中,文件地址=崩溃内存地址-slide。
122.6、利用系统nm指令确定出目标系统库的编码信息(即地址编码信息,包括地址和地址对应的编码信息),nm-m指令可以将目标系统库的编码信息按照地址大小的顺序排序。然后利用文件地址在编码信息的地址中查找,当找到某一行地址大于文件地址时停止,当前行的上一行就是我们需要的正确信息,该正确信息中包括源码地址和源码信息,源码地址和源码信息对应。
123.7、根据文件地址和源码地址,确定出此行目标系统库的崩溃偏移,其中,崩溃偏移=文件地址-源码地址。
124.8、根据崩溃偏移和源码信息组装源码调试信息,其中,调试信息=源码信息+崩溃偏移,从而实现ios中目标系统库调试信息的还原。
125.通过本实施例提供的ios中还原系统符号调试信息的方法,可以以行为维度还原系统库堆栈,使用成本小,比较轻量级;不依赖于.ips格式的文件,可以还原任意系统崩溃堆栈;可以自行下载需要的系统库然后进行还原调试信息,避免了第三方平台因系统库缺
失导致的还原失败的问题。
126.需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。
127.基于同一发明构思,本发明一实施例提供了一种数据处理装置300,该数据处理装置300可应用于终端。参考图3,图3是本发明一实施例提供的数据处理装置的结构框图。如图3所示,数据处理装置300包括:
128.第一地址获取模块301,用于获取应用程序中目标组件的加载地址和编码信息,所述目标组件是所述应用程序中需要还原调试信息的任一组件;
129.第二地址获取模块302,用于通过定位所述目标组件中目标代码路径下的目标代码段,确定所述目标组件的起始地址;
130.偏移量确定模块303,用于根据所述目标组件的加载地址和起始地址,得到地址偏移量;
131.调试信息还原模块304,用于根据所述地址偏移量、所述编码信息以及所述目标组件的崩溃内存地址,生成所述目标组件崩溃时的调试信息。
132.可选的,所述调试信息还原模块304,包括:
133.第三地址获取模块,用于根据所述地址偏移量和所述崩溃内存地址,得到文件地址;
134.崩溃偏移确定模块,用于根据所述编码信息中的源码信息对应的源码地址和所述文件地址,得到崩溃偏移;
135.调试信息还原子模块,用于根据所述崩溃偏移和所述源码信息,得到所述目标组件崩溃时的调试信息。
136.可选的,所述第一地址获取模块301,包括:编码信息获取模块,用于获取应用程序中目标组件的编码信息;
137.所述编码信息获取模块,包括:编码信息获取子模块,用于利用目标系统指令确定所述目标组件的编码信息,所述目标系统指令包括nm指令;
138.所述崩溃偏移确定模块,包括:源码信息确定模块,用于确定所述编码信息中的源码信息以及所述源码地址;
139.所述源码信息确定模块,包括:
140.遍历模块,用于按照地址由小到大的顺序遍历所述编码信息的各个行的地址,直到查找到大于所述文件地址的当前行的地址时停止遍历;
141.源码信息确定子模块,用于将所述当前行的上一行的地址对应的信息确定为所述源码信息,以及,将所述当前行的上一行的地址确定为所述源码地址。
142.可选的,所述第一地址获取模块301,包括:
143.加载地址获取子模块,用于通过程序工程中的image list命令或编写的源代码,获取所有组件的加载地址;
144.第一地址获取子模块,从所述所有组件的加载地址中,选取所述目标组件的加载
地址。
145.可选的,所述装置300还包括:
146.判断模块,在所述通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址之前,判断本地是否存在所述目标组件;
147.下载模块,用于在本地不存在所述目标组件的情况下,下载所述目标组件。
148.可选的,所述第二地址获取模块302,包括:
149.代码段确定子模块,用于通过machoview打开所述目标组件,得到所述目标组件中的目标代码路径下的代码段;
150.起始地址确定子模块,用于分析所述代码段以从所述代码段中确定所述目标代码段,并根据所述目标代码段,获取所述目标组件的起始地址。
151.基于同一发明构思,本发明另一实施例提供一种电子设备400,如图4所示。图4是本发明一实施例示出的一种电子设备的示意图。该电子设备包括处理器401、存储器402及存储在存储器402上并可在处理器401上运行的计算机程序,所述计算机程序被所述处理器执行时实现本发明上述任一实施例所述的数据处理方法中的步骤。
152.基于同一发明构思,本发明另一实施例提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现如本发明上述任一实施例所述的数据处理方法中的步骤。
153.本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
154.需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
155.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
156.上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,均属于本发明的保护之内。
157.本领域普通技术人员可以意识到,结合本发明实施例中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
158.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
159.在本发明所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
160.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
161.另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
162.所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。
163.以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

技术特征:
1.一种数据处理方法,其特征在于,所述方法包括:获取应用程序中目标组件的加载地址和编码信息,所述目标组件是所述应用程序中需要还原调试信息的任一组件;通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址;根据所述目标组件的加载地址和起始地址,得到地址偏移量;根据所述地址偏移量、所述编码信息以及所述目标组件的崩溃内存地址,生成所述目标组件崩溃时的调试信息。2.根据权利要求1所述的数据处理方法,其特征在于,所述根据所述地址偏移量、所述编码信息以及所述目标组件的崩溃内存地址,生成所述目标组件崩溃时的调试信息,包括:根据所述地址偏移量和所述崩溃内存地址,得到文件地址;根据所述编码信息中的源码信息对应的源码地址和所述文件地址,得到崩溃偏移;根据所述崩溃偏移和所述源码信息,得到所述目标组件崩溃时的调试信息。3.根据权利要求2所述的数据处理方法,其特征在于,所述获取应用程序中目标组件的编码信息的步骤,包括:利用目标系统指令确定所述目标组件的编码信息,所述目标系统指令包括nm指令;所述编码信息中的源码信息以及所述源码地址是按照以下步骤确定的:按照地址由小到大的顺序遍历所述编码信息的各个行的地址,直到查找到大于所述文件地址的当前行的地址时停止遍历;将所述当前行的上一行的地址对应的信息确定为所述源码信息,以及,将所述当前行的上一行的地址确定为所述源码地址。4.根据权利要求1所述的数据处理方法,其特征在于,所述获取应用程序中目标组件的加载地址,包括:通过程序工程中的image list命令或编写的源代码,获取所有组件的加载地址;从所述所有组件的加载地址中,选取所述目标组件的加载地址。5.根据权利要求1所述的数据处理方法,其特征在于,在所述通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址之前,所述方法还包括:判断本地是否存在所述目标组件;在本地不存在所述目标组件的情况下,下载所述目标组件。6.根据权利要求1所述的数据处理方法,其特征在于,所述通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址,包括:通过machoview打开所述目标组件,得到所述目标组件中的目标代码路径下的代码段;分析所述代码段以从所述代码段中确定所述目标代码段,并根据所述目标代码段,获取所述目标组件的起始地址。7.一种数据处理装置,其特征在于,所述装置包括:第一地址获取模块,用于获取应用程序中目标组件的加载地址和编码信息,所述目标组件是所述应用程序中需要还原调试信息的任一组件;第二地址获取模块,用于通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址;
偏移量确定模块,用于根据所述目标组件的加载地址和起始地址,得到地址偏移量;调试信息还原模块,用于根据所述地址偏移量、所述编码信息以及所述目标组件的崩溃内存地址,生成所述目标组件崩溃时的调试信息。8.根据权利要求7所述的数据处理装置,其特征在于,所述调试信息还原模块,包括:第三地址获取模块,用于根据所述地址偏移量和所述崩溃内存地址,得到文件地址;崩溃偏移确定模块,用于根据所述编码信息中的源码信息对应的源码地址和所述文件地址,得到崩溃偏移;调试信息还原子模块,用于根据所述崩溃偏移和所述源码信息,得到所述目标组件崩溃时的调试信息。9.根据权利要求8所述的数据处理装置,其特征在于,所述第一地址获取模块,包括:编码信息获取模块,用于获取应用程序中目标组件的编码信息;所述编码信息获取模块,包括:编码信息获取子模块,用于利用目标系统指令确定所述目标组件的编码信息,所述目标系统指令包括nm指令;所述崩溃偏移确定模块,包括:源码信息确定模块,用于确定所述编码信息中的源码信息以及所述源码地址;所述源码信息确定模块,包括:遍历模块,用于按照地址由小到大的顺序遍历所述编码信息的各个行的地址,直到查找到大于所述文件地址的当前行的地址时停止遍历;源码信息确定子模块,用于将所述当前行的上一行的地址对应的信息确定为所述源码信息,以及,将所述当前行的上一行的地址确定为所述源码地址。10.根据权利要求7所述的数据处理装置,其特征在于,所述第一地址获取模块,包括:加载地址获取子模块,用于通过程序工程中的image list命令或编写的源代码,获取所有组件的加载地址;第一地址获取子模块,从所述所有组件的加载地址中,选取所述目标组件的加载地址。11.根据权利要求7所述的数据处理装置,其特征在于,所述装置还包括:判断模块,在所述通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址之前,判断本地是否存在所述目标组件;下载模块,用于在本地不存在所述目标组件的情况下,下载所述目标组件。12.根据权利要求7所述的数据处理装置,其特征在于,所述第二地址获取模块,包括:代码段确定子模块,用于通过machoview打开所述目标组件,得到所述目标组件中的目标代码路径下的代码段;起始地址确定子模块,用于分析所述代码段以从所述代码段中确定所述目标代码段,并根据所述目标代码段,获取所述目标组件的起始地址。13.一种电子设备,其特征在于,包括:处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至6中任一项所述的数据处理方法的步骤。14.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至6中任一项所述的数据处理方法的步骤。

技术总结
本发明实施例提供了一种数据处理方法、装置、电子设备及可读存储介质,涉及计算机技术领域。该方法包括:获取应用程序中目标组件的加载地址和编码信息,所述目标组件是所述应用程序中需要还原调试信息的任一组件;通过定位所述目标组件中的目标代码路径下的目标代码段,确定所述目标组件的起始地址;根据所述目标组件的加载地址和起始地址,得到地址偏移量;根据所述地址偏移量、所述编码信息以及所述目标组件的崩溃内存地址,生成所述目标组件崩溃时的调试信息。通过本实施例的方法,能够降低组件符号化方法的局限性。降低组件符号化方法的局限性。降低组件符号化方法的局限性。


技术研发人员:周影杰 彭飞 刘孟
受保护的技术使用者:五八同城信息技术有限公司
技术研发日:2023.03.22
技术公布日:2023/7/25
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐