CN114968347A - 堆栈还原方法、装置、存储介质及电子设备 - Google Patents
堆栈还原方法、装置、存储介质及电子设备 Download PDFInfo
- Publication number
- CN114968347A CN114968347A CN202110194112.5A CN202110194112A CN114968347A CN 114968347 A CN114968347 A CN 114968347A CN 202110194112 A CN202110194112 A CN 202110194112A CN 114968347 A CN114968347 A CN 114968347A
- Authority
- CN
- China
- Prior art keywords
- module
- stack
- file
- information
- symbol
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/74—Reverse engineering; Extracting design information from source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请公开了涉及计算机技术领域的堆栈还原方法、装置、存储介质及电子设备,该方法包括获取应用程序运行中的堆栈信息;获取该堆栈信息中每一个栈帧中的模块标识和模块内偏移地址;根据该模块标识符得到该模块标识对应的符号表文件;该符号表文件用于描述运行于不同平台的应用程序的模块的映射信息;该映射信息包括模块内偏移地址与堆栈还原信息的对应关系,该堆栈还原信息包括源文件路径、行号或函数;在该符号表文件的索引中查询该模块内偏移地址对应的符号区域;在该符号表文件的符号区域中进行查询,得到该模块内偏移地址对应的堆栈还原信息。本申请可以应用于跨平台场景并显著提升基于符号表文件进行堆栈还原的效率。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及堆栈还原方法、装置、存储介质及电子设备。
背景技术
函数调用堆栈是指一个应用程序在运行的过程中,通过还原堆栈即可知道该应用程序调用的机器指令信息对应的源码信息,通过掌握源码信息开发者可以对于程序进行调试和修改。
目前的还原堆栈通常依赖于操作系统供应商提供的具备还原堆栈功能的组件。比如,对于Android操作系统,可以依赖谷歌官方使用并提供给开发者的addr2line工具进行堆栈还原,对于iOS操作系统,可以依赖苹果官方使用并提供给开发者的Atos工具进行堆栈还原。
可见,对于不同的操作系统通常需要适配不同的堆栈还原工具,平台相关性过高影响了堆栈还原的跨平台应用,并且平台提供的addr2line、Atos性能普遍较低,难以满足用户对于堆栈还原日益提高的性能要求。
发明内容
为了提升提供跨平台进行高效率堆栈还原的能力,本申请实施例提供堆栈还原方法、装置、存储介质及设备。
一方面,本申请提供了一种堆栈还原方法,所述方法包括:
获取应用程序运行中的堆栈信息;
获取所述堆栈信息中每一个栈帧中的模块标识和模块内偏移地址;
根据所述模块标识符得到所述模块标识对应的符号表文件;所述符号表文件用于描述运行于不同平台的应用程序的模块的映射信息;所述映射信息包括模块内偏移地址与堆栈还原信息的对应关系,所述堆栈还原信息包括源文件路径、行号或函数;
在所述符号表文件的索引中查询所述模块内偏移地址对应的符号区域;
在所述符号表文件的符号区域中进行查询,得到所述模块内偏移地址对应的堆栈还原信息。
另一方面,本申请提供一种堆栈还原装置,所述装置包括:
堆栈信息获取模块,用于获取应用程序运行中的堆栈信息;
栈帧信息获取模块,用于获取所述堆栈信息中每一个栈帧中的模块标识和模块内偏移地址;
符号表文件获取模块,用于根据所述模块标识符得到所述模块标识对应的符号表文件;所述符号表文件用于描述运行于不同平台的应用程序的模块的映射信息;所述映射信息包括模块内偏移地址与堆栈还原信息的对应关系,所述堆栈还原信息包括源文件路径、行号或函数;
符号区域定位模块,用于在所述符号表文件的索引中查询所述模块内偏移地址对应的符号区域;
堆栈还原信息查询模块,用于在所述符号表文件的符号区域中进行查询,得到所述模块内偏移地址对应的堆栈还原信息。
另一方面,本申请提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有至少一条指令或至少一段程序,所述至少一条指令或至少一段程序由处理器加载并执行以实现上述的一种堆栈还原方法。
另一方面,本申请提供了一种堆栈还原设备,其特征在于,包括至少一个处理器,以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述至少一个处理器通过执行所述存储器存储的指令实现上述的一种堆栈还原方法。
另一方面,本申请提供了一种计算机程序产品,该计算机程序产品包括计算机指令,该计算机指令存储在计算机可读存储介质中。电子设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该电子设备执行上述堆栈还原方法。
本申请提供了堆栈还原方法、装置、存储介质及设备。本申请可以对于不同平台的目标文件进行对应的函数信息表以及调试信息表的提取,并且根据提取结果生成跨平台的符号表文件,从而使得符号表文件的生成不依赖平台环境。通过生成待索引的符号表文件,可以显著提升基于符号表文件进行堆栈还原的效率。
附图说明
为了更清楚地说明本申请实施例或相关技术中的技术方案和优点,下面将对实施例或相关技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它附图。
图1是本申请提供的Android Native层堆栈内的堆栈信息的示意图;
图2是本申请提供的Android Native层堆栈内的堆栈信息还原后的示意图;
图3是本申请实施例提供的一种堆栈还原方法的流程示意图;
图4是本申请提供的构建应用程序的模块标识对应的符号表文件的方法的流程示意图;
图5是本申请提供的ELF文件格式的示意图;
图6是本申请提供的根据所述函数信息表和所述调试信息表生成中间符号表的示意图;
图7是本申请提供的访问所述函数表节区得到函数信息表的方法流程示意图;
图8是本申请提供的访问所述调试信息表节区得到调试信息表的流程示意图;
图9是本申请提供的根据所述函数信息表和所述调试信息表生成中间符号表流程示意图;
图10是本申请提供的符号表文件生成过程示意图;
图11是本申请提供的一种堆栈还原方法文件转换的示意图;
图12是本申请提供的本申请还原速度示意图;
图13是本申请提供的堆栈还原方法的应用示意图;
图14是本申请提供的堆栈还原装置框图;
图15是本申请提供的一种用于实现本申请实施例所提供的方法的设备的硬件结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或服务器不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
为了使本申请实施例公开的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请实施例进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请实施例,并不用于限定本申请实施例。
以下,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。在本实施例的描述中,除非另有说明,“多个”的含义是两个或两个以上。为了便于理解本申请实施例上述的技术方案及其产生的技术效果,本申请实施例首先对于相关专业名词进行解释:
iOS平台:由苹果公司开发的移动操作系统。iOS与苹果公司的MacOS操作系统一样,属于类Unix的商业操作系统。
Mac平台:由苹果公司开发的个人消费型计算机系列产品的操作系统。Mac是一套由苹果开发的运行于Macintosh系列电脑上的操作系统。Mac是首个在商用领域成功的图形用户界面操作系统,是基于混合内核的图形化操作系统,突出了形象的图标和人机对话。
Linux平台:是一套免费使用和自由传播的支持多用户、多任务、支持多线程和多中央处理器的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
AndroidNative平台:由美国谷歌公司开发的基于Linux内核的自由及开放源代码的操作系统。
Dwarf:一种调试文件的格式,被许多编译器和调试器用来支持源码级别的调试。通过Dwarf调试信息,开发者可以查找到程序运行堆栈中的PC寄存器地址对应的代码文件和行号,从而方便调试和定位问题。在Linux平台Dwarf信息存储在编译构建生成的debug版本的so后缀的文件里面;在iOS平台Dwarf信息存储在编译构建生成的dsym后缀的文件里面。
so文件:so文件是Linux平台的程序函数库,即编译好的可以供其他程序使用的代码和数据。so文件动态链接库,可以通过C或C++编译出来的。Linux下的so文件时不能直接运行的,也可以被称为共享库。可以根据安卓公司提供的符号表提取工具提取so文件中的函数信息表和调试信息表。
dSYM文件:iOS平台中,dSYM文件是指具有调试信息的文件。可以根据苹果公司提供的符号表提取工具提取dSYM文件中的函数信息表和调试信息表。
ELF文件:在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件,是Linux的主要可执行文件格式。
Mach-O:Mach-O(MachObject)是一种基于Mach内核的文件格式。iOS系统生成的可执行程序或者动态库文件的存储布局格式被称之为Mach-O格式。Mach-O可以有一个或多个架构。多个架构的称为FAT文件。
FatMach-O:具备多个架构的Mach-O文件。
相关技术中,当应用程序出现报错,比如发生崩溃之后,开发人员可以调取堆栈信息,如图1所示,其示出了AndroidNative层堆栈内的堆栈信息的示意图。可以看到,堆栈信息中包括难以理解的字符串内容,这种难以理解的机器指令信息不利于开发人员进行代码调试,有必要对其进行堆栈还原。请参考图2,其示出了AndroidNative层堆栈内的堆栈信息还原后的示意图。从这个图中可以清楚地定位到崩溃原因来自源码文件的哪一行,这更加有利于开发人员进行代码调试。比如对于图1框选的崩溃处,通过对比图2可以明显看出崩溃发生于/BuglyNative/jni/native_exception_handler.c的第888行,从而显著降低开发人员代码调试难度。
少量堆栈信息的还原对效率要求往往并不高,但是如果需要批量还原很多堆栈信息,甚至是对海量的堆栈信息提供还原服务,则目前的官方平台提供的堆栈还原工具的堆栈还原效率难以匹配,并且目前的堆栈还原难以跨平台应用。为了跨平台对外提供高效率的堆栈还原服务,本申请提供堆栈还原方法、装置、存储介质及电子设备。
以下介绍本申请的一种堆栈还原方法,图3示出了本申请实施例提供的一种堆栈还原方法的流程示意图,本申请提供了如实施例或流程图上述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的系统或服务器产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境),上述方法可以包括:
S101.获取应用程序运行中的堆栈信息。
本申请实施例中应用程序可以是运行于iOS、Mac,AndroidNative或Linux平台的应用程序。
S102.获取所述堆栈信息中每一个栈帧中的模块标识和模块内偏移地址。
应用程序依赖于至少一个模块运行,本申请实施例中模块可以包括应用程序的主程序对应的模块和/或动态库对应的模块,每个模块具有唯一的模块标识。
S103.根据所述模块标识符得到所述模块标识对应的符号表文件;所述符号表文件用于描述运行于不同平台的应用程序的模块的映射信息;所述映射信息包括模块内偏移地址与堆栈还原信息的对应关系,所述堆栈还原信息包括源文件路径、行号或函数。
本申请中可以为每个应用程序的各个模块均对应生成一个符号表文件,当应用程序出错时,通过模块标识可以定位到其对应的符号表文件,根据符号表文件对应用程序的堆栈信息进行还原。
本申请中符号表文件可以基于跨平台语言开发,比如Java,并且基于自定义的文件格式制作得到,可以跨平台运行,本申请实施例并不限定符号表文件的运行平台,比如本申请中符号表文件可以运行于iOS、Mac,Android Native和Linux平台。通过查询所述符号表文件,可以根据模块内偏移地址定位到所述模块内偏移地址对应的源文件路径和行号,从而精准定位在源文件中的崩溃位置;若由于一些原因,比如调试信息不足,难以准确定位到源文件路径和行号,也可以根据模块内偏移地址查询到所述模块内偏移地址对应的函数,从而可以定位在源文件中出现崩溃的函数。源文件路径、行号和函数作为堆栈还原信息可以为开发人员进行代码调试提供较大帮助。
S104.在所述符号表文件的索引中查询所述模块内偏移地址对应的符号区域。
在一个实施例中,所述符号表文件的索引用于根据模块内偏移地址得到符号区域,在符号区域中查询模块内偏移地址对应的堆栈还原信息相较于对符号表文件进行全文查询可以明显提升效率。本申请中索引可以基于二叉树、红黑树等索引结构创建,本申请不限定索引的具体结构。在一个实施例中,可以基于二分法在所述符号表文件的索引中查询所述模块内偏移地址对应的符号区域,本申请并不限制具体的查询索引的方法。
S105.在所述符号表文件的符号区域中进行查询,得到所述模块内偏移地址对应的堆栈还原信息。
为了得到可以跨平台运行的符号表文件,本申请还提供构建应用程序中的模块标识对应的符号表文件的方法,如图4所示,包括:
S201.对所述应用程序的源代码进行编译,得到所述应用程序中各个模块对应的具有调试信息的目标文件。
本申请可以跨平台读取运行于iOS、Mac,Android Native或Linux平台的目标文件,对不同平台的目标文件进行相应的处理,最终得到符号表文件。
以Android平台为例,目标文件可以是so后缀的文件,so后缀的文件是ELF文件格式,请参考图5,其示出了ELF文件格式的示意图,被框选的两个部分按照从上到下的顺序分别为文件头部和文件的具体内容。根据ELF文件格式可以进行后续的函数表节区和调试信息表节区的定位和读取。在一些实施例中,可以使用安卓平台官方提供的工具进行函数表节区和调试信息表节区的定位和读取。
以iOS平台为例,目标文件可以是dSYM后缀的文件,dSYM后缀的文件是MACH-O或FAT MACH-O文件格式,根据MACH-O或FAT MACH-O格式文件格式可以进行后续的函数表节区和调试信息表节区的定位和读取。在一些实施例中,可以使用苹果平台官方提供的工具进行函数表节区和调试信息表节区的定位和读取。
S202.定位所述每个目标文件的函数表节区,访问所述函数表节区得到函数信息表,所述函数信息表表征模块内偏移地址与函数的映射关系。
具体地,以Android平台为例,可以根据ELF文件格式定位函数表节区,并基于ELF文件格式解析得到函数信息表,具体地,可以使用安卓平台官方提供的工具进行ELF文件格式解析;以iOS平台为例,可以根据MACH-O或FAT MACH-O文件格式定位函数表节区,并基于MACH-O或FAT MACH-O文件格式解析得到函数信息表,具体地,可以使用苹果平台官方提供的工具进行MACH-O或FAT MACH-O文件格式解析。
S203.定位所述每个目标文件的调试信息表节区,访问所述调试信息表节区得到调试信息表,所述调试信息表表征模块内偏移地址与调试信息的映射关系,所述调试信息包括源文件路径和行号。
具体地,以Android平台为例,可以根据ELF文件格式定位调试信息表节区;以iOS平台为例,可以根据MACH-O或FAT MACH-O文件格式定位调试信息表节区。在调试信息表节区,可以根据Dwarf的格式进行数据解析,从而得到调试信息表。在实际操作时,可以根据不同的平台相应选择工具进行调试信息表节区的定位和调试信息表的获取。
S204.根据所述函数信息表和所述调试信息表生成中间符号表。
请参考图6,其示出了根据所述函数信息表和所述调试信息表生成中间符号表的示意图,通过定位目标文件中的函数表节区和调试信息表节区,对所述函数表节区和调试信息表节区的数据进行解析,从而得到函数信息表和调试信息表,将所述函数信息表和调试信息表进行排序合并后可以得到中间符号表。该中间符号表可以为一种可视化符号表文件,本申请实施例中该可视化符号表文件为SYMBOL文件。
S205.根据所述中间符号表构建索引,根据所述索引和所述中间符号表得到符号表文件,所述符号表文件中记录有所述每个目标文件对应的模块的模块标识。
本公开中模块标识对应的符号表文件可以为STIF文件(Symbol Table IndexFile,STIF),STIF文件不仅包括SYMBOL文件的内容,也包括索引,还可以通过压缩减小数据量。
本申请中的符号表文件中的数据按照模块内偏移地址升序进行排序,从而可以快速检索到模块内偏移地址对应的堆栈还原信息,以便于提升堆栈还原的效率。为了提升符号表文件的生成效率,结合符合表文件的内容特点,本申请实施例进一步提供了访问所述函数表节区得到函数信息表的方法,如图7所示,包括:
S2021.获取存储对象。
S2022.顺序读取所述函数表节区的函数信息表数据。
S2023.对所述函数信息表数据的读取结果进行函数信息表分片存储,所述函数信息表分片存储包括:在所述函数信息表数据的读取结果中顺序得到每一条第一映射记录;所述第一映射记录包括模块内偏移地址以及与所述模块偏移地址对应的函数;若所述存储对象空闲空间充足,则将所述第一映射记录存储在所述存储对象中;若所述存储对象空闲空间不足,则生成与所述存储对象中当前存储的第一映射记录相对应的第一临时文件,清空所述存储对象,将所述第一映射记录存储在所述存储对象中。
本申请中通过将第一临时文件作为第一映射记录的存储载体,可以将函数信息表以分片的形式存储在至少一个第一临时文件中,通过对所述函数信息表数据的读取结果进行函数信息表分片存储,得到以第一临时文件形式记录的函数信息表。
在一个实施例中,在顺序得到每一条第一映射记录之后,还包括判断所述存储对象空闲空间是否充足的步骤,所述判断所述存储对象空闲空间是否充足,包括:计算所述存储对象的空闲空间,若所述空闲空间大于或等于待存储的第一映射记录的数据量,则可以判定所述存储对象的空闲空间充足,否则,可以判定所述存储对象的空闲空间不足。
在一个示例性的实施方式中,可以获取判定阈值,若所述空闲空间大于或等于所述判定阈值,则可以判定所述存储对象的空闲空间充足,否则,可以判定所述存储对象的空闲空间不足。所述判定阈值可以大于等于第一映射记录的数据量的最大值,示例性的,若第一映射记录的数据量在100-300字节之间,则可以将300或大于300的字节数设定为所述判定阈值。
上述判定阈值的设定方法可以保证基于所述判定阈值判定为空闲空间充足的存储对象的存储空间足够存储待存储的第一映射记录,不会出现由于存储空间不足而产生的存储失败。这种实施方式不必获取待存储的第一映射记录的数据量,可以提升对存储对象的空闲空间是否充足的判断速度。
在另一个示例性的实施方式中,可以获取存储对象中当前已有的第一映射记录的数量,若所述数量小于预设的数量阈值,则可以判定所述存储对象的空闲空间充足,否则,可以判定所述存储对象的空闲空间不足。示例性的,所述数量阈值可以由所述存储对象的容量和映射记录参考值相除得到,其中,所述映射记录参考值可以大于等于第一映射记录的数据量的最大值。示例性的,若第一映射记录的数据量在100-200字节之间,则可以将200设定为所述映射记录参考值,所述存储对象为2600字节,则数量阈值为2600/200=13。
示例性的,若所述数量阈值为50,则第1-50条第一映射记录可以被直接存储在所述存储对象中,当读取到第51条第一映射记录时,所述存储对象空闲空间不足,则首先将前面50条第一映射记录生成一个第一临时文件。清空所述存储对象后,将所述第51条第一映射记录存储在所述存储对象中,则所述第51条第一映射记录成为所述存储对象中的第一条记录。
上述数量阈值的设定方法可以保证基于所述数量阈值判定为空闲空间充足的存储对象的存储空间足够存储待存储的第一映射记录,不会出现由于存储空间不足而产生的存储失败。这种实施方式不必获取待存储的第一映射记录的数据量以及存储对象的空闲空间,可以进一步提升对存储对象的空闲空间是否充足的判断速度。
在一个实施方式中,所述存储对象可以是数组,堆,容器等,本申请不限定存储对象的具体形式。所述生成与所述存储对象中当前存储的第一映射记录相对应的第一临时文件,包括按照所述存储对象中当前存储的第一映射记录的模块内偏移地址的升序顺序,对所述第一映射记录进行排序,将排序结果存储在所述第一临时文件中。
按照前文示例所述,第1-50条第一映射记录可以被存储在一个第一临时文件之中,随着函数信息表分片存储的处理进程的执行,第51-100条第一映射记录也被存储在另一个第一临时文件之中,以此类推,可以得到多个第一临时文件。
S2024.当所述函数信息表分片存储处理完毕后,若所述存储对象不为空,则生成与所述存储对象中当前存储的第一映射记录相对应的第一临时文件。
S2025.根据全部所述第一临时文件,得到所述函数信息表。
示例性的,若已经在步骤S2023中生成了M个第一临时文件,并且所述存储对象不为空,则将所述存储对象中的当前存储的第一映射记录存储为新的第一临时文件,共得到M+1个第一临时文件,这M+1个第一临时文件即可作为所述函数信息表的存储载体。
本申请中可以根据目标文件的格式解析函数表节区的数据,得到函数信息表,将函数信息表存储在至少一个第一临时文件中,每个第一临时文件都是按照模块内偏移地址升序进行排序,这与中间符号表以及最终得到的符号表文件的数据的排序规则一致,以便于提升最终得到的符号表文件的生成效率。
本申请实施例进一步提供了访问所述调试信息表节区得到调试信息表,如图8所示,包括:
S2031.获取存储对象。
在一个可行的实施例中,步骤S2031中可以复用步骤S2021中的存储对象,以节省存储对象资源。若步骤S2031中复用步骤S2021中的存储对象,可以在生成全部第一临时文件后,清空所述存储对象,以便于在步骤S2031中对于所述存储对象进行复用。
在另一个可行的实施例中,步骤S2031中使用的存储对象也可以不同于步骤S2021中的存储对象,这种情况下调试信息表和函数信息表的获取过程互不干扰,可以并行运行,提升符号表文件的构建速度。
S2032.顺序读取所述调试信息表节区的调试信息表数据。
S2033.对所述调试信息表数据的读取结果进行调试信息表分片存储,所述调试信息表分片存储包括:在所述调试信息表数据的读取结果中顺序得到每一条第二映射记录;所述第二映射记录包括模块内偏移地址、与所述模块内偏移地址对应的源文件路径以及与所述模块内偏移地址对应的行号;若所述存储对象空闲空间充足,则将所述第二映射记录存储在所述存储对象中;若所述存储对象空闲空间不足,则生成与所述存储对象中当前存储的第二映射记录相对应的第二临时文件;清空所述存储对象,将所述第二映射记录存储在所述存储对象中。
所述生成与所述存储对象中当前存储的第二映射记录相对应的第二临时文件,包括:按照所述存储对象中当前存储的第二映射记录的模块内偏移地址的升序顺序,对所述第二映射记录进行排序,将排序结果存储在所述第二临时文件中。
本申请中步骤S2033中对所述调试信息表数据的读取结果进行调试信息表分片存储的过程与步骤S2023中对所述函数信息表数据的读取结果进行函数信息表分片存储的过程基于相同发明构思,在此不再赘述。
S2034.当所述调试信息表分片存储处理完毕后,若所述存储对象不为空,则生成与所述存储对象中当前存储的第二映射记录相对应的第二临时文件。
在一个实施例中,还可以在生成全部第二临时文件后,清空所述存储对象。
S2035.根据全部所述第二临时文件,得到所述调试信息表。
本申请中步骤S2034-S2035与前文所述的步骤S2024-S2025基于相同发明构思,在此不再赘述。
本申请中可以根据目标文件的格式解析调试信息表节区的数据,得到调试信息表,调试信息表存储在至少一个第二临时文件中,每个第二临时文件都是按照模块内偏移地址升序进行排序,这与中间符号表以及最终得到的符号表文件的数据的排序规则一致,以便于提升最终得到的符号表文件的生成效率。
在将函数信息表存储于第一临时文件,以及将调试信息表存储于第二临时文件后,可以基于存储结果生成中间符号表,如图9所示,包括:
S2041.获取用于存储所述函数信息表的各个所述第一临时文件和用于存储所述调试信息表的各个所述第二临时文件。
S2042.读取各个所述第一临时文件中的第一映射记录,以及读取各个所述第二临时文件中的第二映射记录。
S2043.按照各个待排序记录中模块内偏移地址升序的顺序对所述各个待排序记录进行排序,根据排序结果得到中间符号表,所述待排序记录包括第一映射记录和第二映射记录。
请参考图10,其示出了符号表文件生成过程示意图。在对目标文件的函数表节区和调试信息表节区进行读取时,可以顺次将读取结果存储在符号数组(存储对象)中,当符号数组空间不足时,可以将符号数组中的数据按照模块内偏移地址升序的顺序排序后存储在临时文件(第一临时文件和第二临时文件)中,并且通过对各个临时文件进行归并排序得到符号表文件。通过顺次读取并生成排序后的临时文件的方式可以在数据读取过程中进行数据的初步排序,提升归并排序的速度。并且通过将函数表节区和调试信息表节区的数据存储在多个临时文件中的形式,可以避免内存中被读入大量数据而产生的内存溢出风险。
请参考图11,其示出本申请提供的一种堆栈还原方法文件转换的示意图,从目标文件中提取函数信息表和调试信息表,然后可以根据函数信息表和调试信息表生成可以可视化的中间符号表,根据中间符号表生成索引,可以得到带有索引的二进制的符号表文件,带有索引的符号表文件包括索引和符号信息,所述符号信息记录有模块内偏移地址与堆栈还原信息的对应关系。本申请中的符号表文件基于跨平台技术生成,也可以应用于跨平台的场景之中,受平台限制较小。并且依赖于符号表文件中的索引,可以提升堆栈还原的速度。以索引支持基于二分法查找符号区域为例,可以将堆栈还原的时间复杂度控制在O(logN),与之形成对应的,没有索引的场景中,堆栈还原的时间复杂度为O(N)。经过相关测试数据分析可知,本申请提供的堆栈还原方法的堆栈还原速度比苹果和谷歌官方工具提升10倍。请参考图12,其示出了本申请还原速度示意图。对于数据大小为204MB的dSYM文件:使用Atos工具进行堆栈还原耗时2.109秒,而使用本申请进行堆栈还原耗时0.138秒。
本申请实施例中可以基于上述提供的堆栈还原方法为海量用户提供堆栈还原服务。在一个实施例中,可以封装符号表文件制作组件,所述符号表文件制作组件用于构建应用程序中各个模块对应的符号表文件;封装堆栈还原组件,所述堆栈还原组件用于获取应用程序运行中的堆栈信息;获取所述堆栈信息中每一个栈帧中的模块标识和模块内偏移地址;根据所述模块标识符得到所述模块标识对应的符号表文件;在所述符号表文件的索引中查询所述模块内偏移地址对应的符号区域;在所述符号表文件的符号区域中进行查询,得到所述模块内偏移地址对应的堆栈还原信息。
将符号表文件制作组件提供给开发人员,可以让开发人员在应用程序开发的过程中自行根据开发得到的应用程序的相关文件制作对应的符号表文件,而封装堆栈还原组件可以运行在提供堆栈还原服务的平台,使得平台可以根据开发人员的上报的堆栈信息和符号表文件为开发人员提供堆栈还原服务。
请参考图13,其示出了本申请提供的堆栈还原方法的应用示意图。客户端对于不同的目标文件可以使用对应的符号表提取工具进行提取,生成中间符号表,然后根据中间符号表生成符号表文件的索引,并将带有索引的符号表文件传输至提供堆栈还原服务的服务器。客户端将堆栈信息上报至服务器,可以触发服务器根据符号表文件对堆栈信息进行还原,得到还原后的堆栈。通过服务器向客户端提供堆栈还原服务的形式,可以支持大数据量堆栈信息的还原,客户端只需要将符号表文件以及堆栈信息上传至服务器,即可得到堆栈还原结果,降低了客户端的压力,以减轻了开发人员负担。
示例性的,本申请实施例可以将上述的堆栈还原方法应用于堆栈还原服务系统,所述堆栈还原服务系统可以包括客户端和服务器。
服务器在本申请实施例中可以包括获取各个客户端上传的符号表文件以及堆栈信息,根据符号表文件对堆栈信息进行还原,将还原结果反馈至客户端。本申请实施例中服务器可以基于云技术(Cloud technology)构建,云技术是指在广域网或局域网内将硬件、软件、网络等系列资源统一起来,实现数据的计算、储存、处理和共享的一种托管技术。云技术(Cloud technology)基于云计算商业模式应用的网络技术、信息技术、整合技术、管理平台技术、应用技术等的总称,可以组成资源池,按需所用,灵活便利。云计算技术将变成重要支撑。
客户端可以在本地生成应用程序的各个模块对应的符号表文件,将符号表文件上传至服务器。运行所述应用程序,当所述应用程序发生崩溃时,提取堆栈信息,将堆栈信息上报至服务器,请求服务器对上述堆栈信息进行还原,并查看堆栈还原结果。
具体地,上述客户端可以包括智能手机、台式电脑、平板电脑、笔记本电脑、数字助理、智能可穿戴设备等各种可以具备通信能力和显示能力的实体设备,也可以包括运行于实体设备中的软体。
具体地,上述服务器可以包括一个独立运行的服务器,或者分布式服务器,或者由多个服务器组成的服务器集群。服务器可以包括有网络通信单元、处理器和存储器等等。
本申请实施例提供的一种堆栈还原方法可以对于不同平台的目标文件进行对应的函数信息表以及调试信息表的提取,并且根据提取结果生成跨平台的符号表文件,从而使得符号表文件的生成不依赖平台环境。通过生成带有索引的符号表文件,可以显著提升基于符号表文件进行堆栈还原的效率。
本申请实施例还公开了一种堆栈还原装置,如图14所示,上述装置100包括:
堆栈信息获取模块101,用于获取应用程序运行中的堆栈信息;
栈帧信息获取模块102,用于获取所述堆栈信息中每一个栈帧中的模块标识和模块内偏移地址;
符号表文件获取模块103,用于根据所述模块标识符得到所述模块标识对应的符号表文件;所述符号表文件用于描述运行于不同平台的应用程序的模块的映射信息;所述映射信息包括模块内偏移地址与堆栈还原信息的对应关系,所述堆栈还原信息包括源文件路径、行号或函数;
符号区域定位模块104,用于在所述符号表文件的索引中查询所述模块内偏移地址对应的符号区域;
堆栈还原信息查询模块105,用于在所述符号表文件的符号区域中进行查询,得到所述模块内偏移地址对应的堆栈还原信息。
具体地,本申请实施例公开一种堆栈还原装置与上述对应的方法实施例均基于相同发明构思。详情请参见方法实施例,在此不再赘述。
本申请实施例还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述一种堆栈还原方法。
本申请实施例还提供了一种计算机可读存储介质,上述计算机可读存储介质可以存储有多条指令。上述指令可以适于由处理器加载并执行本申请实施例上述的一种堆栈还原方法。
进一步地,图15示出了一种用于实现本申请实施例所提供的方法的设备的硬件结构示意图,上述设备可以参与构成或包含本申请实施例所提供的装置或系统。如图15所示,设备10可以包括一个或多个(图中采用102a、102b,……,102n来示出)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)、用于存储数据的存储器104、以及用于通信功能的传输装置106。除此以外,还可以包括:显示器、输入/输出接口(I/O接口)、通用串行总线(USB)端口(可以作为I/O接口的端口中的一个端口被包括)、网络接口、电源和/或相机。本领域普通技术人员可以理解,图15所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,设备10还可包括比图15中所示更多或者更少的组件,或者具有与图15所示不同的配置。
应当注意到的是上述一个或多个处理器102和/或其他数据处理电路在本文中通常可以被称为“数据处理电路”。该数据处理电路可以全部或部分的体现为软件、硬件、固件或其他任意组合。此外,数据处理电路可为单个独立的处理模块,或全部或部分的结合到设备10(或移动设备)中的其他元件中的任意一个内。如本申请实施例中所涉及到的,该数据处理电路作为一种处理器控制(例如与接口连接的可变电阻终端路径的选择)。
存储器104可用于存储应用软件的软件程序以及模块,如本申请实施例中上述的方法对应的程序指令/数据存储装置,处理器102通过运行存储在存储器104内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的一种堆栈还原方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至设备10。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括设备10的通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络适配器(NetworkInterfaceController,NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(RadioFrequency,RF)模块,其用于通过无线方式与互联网进行通讯。
显示器可以例如触摸屏式的液晶显示器(LCD),该液晶显示器可使得用户能够与设备10(或移动设备)的用户界面进行交互。
需要说明的是:上述本申请实施例先后顺序仅仅为了描述,不代表实施例的优劣。且上述对本申请特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本申请中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置和服务器实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,上述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上上述仅为本申请的较佳实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (10)
1.一种堆栈还原方法,其特征在于,所述方法包括:
获取应用程序运行中的堆栈信息;
获取所述堆栈信息中每一个栈帧中的模块标识和模块内偏移地址;
根据所述模块标识符得到所述模块标识对应的符号表文件;所述符号表文件用于描述运行于不同平台的应用程序的模块的映射信息;所述映射信息包括模块内偏移地址与堆栈还原信息的对应关系,所述堆栈还原信息包括源文件路径、行号或函数;
在所述符号表文件的索引中查询所述模块内偏移地址对应的符号区域;
在所述符号表文件的符号区域中进行查询,得到所述模块内偏移地址对应的堆栈还原信息。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括构建所述模块标识对应的符号表文件,所述构建所述模块标识对应的符号表文件,包括:
对所述应用程序的源代码进行编译,得到所述应用程序中各个模块对应的具有调试信息的目标文件;
定位所述每个目标文件的函数表节区,访问所述函数表节区得到函数信息表,所述函数信息表表征模块内偏移地址与函数的映射关系;
定位所述每个目标文件的调试信息表节区,访问所述调试信息表节区得到调试信息表,所述调试信息表表征模块内偏移地址与调试信息的映射关系,所述调试信息包括源文件路径和行号;
根据所述函数信息表和所述调试信息表生成中间符号表;
根据所述中间符号表构建索引,根据所述索引和所述中间符号表得到符号表文件,所述符号表文件中记录有所述每个目标文件对应的模块的模块标识。
3.根据权利要求2所述的方法,其特征在于:
所述访问所述函数表节区得到函数信息表,包括:
获取存储对象;
顺序读取所述函数表节区的函数信息表数据;
对所述函数信息表数据的读取结果进行函数信息表分片存储,所述函数信息表分片存储包括:在所述函数信息表数据的读取结果中顺序得到每一条第一映射记录;所述第一映射记录包括模块内偏移地址以及与所述模块偏移地址对应的函数;若所述存储对象空闲空间充足,则将所述第一映射记录存储在所述存储对象中;若所述存储对象空闲空间不足,则生成与所述存储对象中当前存储的第一映射记录相对应的第一临时文件,清空所述存储对象,将所述第一映射记录存储在所述存储对象中;
当所述函数信息表分片存储处理完毕后,若所述存储对象不为空,则生成与所述存储对象中当前存储的第一映射记录相对应的第一临时文件;
根据全部所述第一临时文件,得到所述函数信息表;
所述访问所述调试信息表节区得到调试信息表,包括:
获取存储对象;
顺序读取所述调试信息表节区的调试信息表数据;
对所述调试信息表数据的读取结果进行调试信息表分片存储,所述调试信息表分片存储包括:在所述调试信息表数据的读取结果中顺序得到每一条第二映射记录;所述第二映射记录包括模块内偏移地址、与所述模块内偏移地址对应的源文件路径以及与所述模块内偏移地址对应的行号;若所述存储对象空闲空间充足,则将所述第二映射记录存储在所述存储对象中;若所述存储对象空闲空间不足,则生成与所述存储对象中当前存储的第二映射记录相对应的第二临时文件;清空所述存储对象,将所述第二映射记录存储在所述存储对象中;
当所述调试信息表分片存储处理完毕后,若所述存储对象不为空,则生成与所述存储对象中当前存储的第二映射记录相对应的第二临时文件;
根据全部所述第二临时文件,得到所述调试信息表。
4.根据权利要求3所述的方法,其特征在于:
所述生成与所述存储对象中当前存储的第一映射记录相对应的第一临时文件,包括:按照所述存储对象中当前存储的第一映射记录的模块内偏移地址的升序顺序,对所述第一映射记录进行排序,将排序结果存储在所述第一临时文件中;
所述生成与所述存储对象中当前存储的第二映射记录相对应的第二临时文件,包括:按照所述存储对象中当前存储的第二映射记录的模块内偏移地址的升序顺序,对所述第二映射记录进行排序,将排序结果存储在所述第二临时文件中。
5.根据权利要求4所述的方法,其特征在于,所述根据所述函数信息表和所述调试信息表生成中间符号表,包括:
获取用于存储所述函数信息表的各个所述第一临时文件和用于存储所述调试信息表的各个所述第二临时文件;
读取各个所述第一临时文件中的第一映射记录,以及读取各个所述第二临时文件中的第二映射记录;
按照各个待排序记录中模块内偏移地址升序的顺序对所述各个待排序记录进行排序,根据排序结果得到中间符号表,所述待排序记录包括第一映射记录和第二映射记录。
6.根据权利要求5所述的方法,其特征在于,所述在所述符号表文件的索引中查询所述模块内偏移地址对应的符号区域,包括:基于二分法在所述符号表文件的索引中查询所述模块内偏移地址对应的符号区域。
7.根据权利要求2-6中任意一项所述的方法,其特征在于,所述方法还包括:
封装符号表文件制作组件,所述符号表文件制作组件用于构建应用程序中各个模块对应的符号表文件;
封装堆栈还原组件,所述堆栈还原组件用于获取应用程序运行中的堆栈信息;获取所述堆栈信息中每一个栈帧中的模块标识和模块内偏移地址;根据所述模块标识符得到所述模块标识对应的符号表文件;在所述符号表文件的索引中查询所述模块内偏移地址对应的符号区域;在所述符号表文件的符号区域中进行查询,得到所述模块内偏移地址对应的堆栈还原信息。
8.一种堆栈还原装置,其特征在于,所述装置包括:
堆栈信息获取模块,用于获取应用程序运行中的堆栈信息;
栈帧信息获取模块,用于获取所述堆栈信息中每一个栈帧中的模块标识和模块内偏移地址;
符号表文件获取模块,用于根据所述模块标识符得到所述模块标识对应的符号表文件;所述符号表文件用于描述运行于不同平台的应用程序的模块的映射信息;所述映射信息包括模块内偏移地址与堆栈还原信息的对应关系,所述堆栈还原信息包括源文件路径、行号或函数;
符号区域定位模块,用于在所述符号表文件的索引中查询所述模块内偏移地址对应的符号区域;
堆栈还原信息查询模块,用于在所述符号表文件的符号区域中进行查询,得到所述模块内偏移地址对应的堆栈还原信息。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有至少一条指令或至少一段程序,所述至少一条指令或至少一段程序由处理器加载并执行以实现如权利要求1至7中任一项所述的一种堆栈还原方法。
10.一种电子设备,其特征在于,包括至少一个处理器,以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述至少一个处理器通过执行所述存储器存储的指令实现如权利要求1至7中任一项所述的一种堆栈还原方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110194112.5A CN114968347A (zh) | 2021-02-20 | 2021-02-20 | 堆栈还原方法、装置、存储介质及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110194112.5A CN114968347A (zh) | 2021-02-20 | 2021-02-20 | 堆栈还原方法、装置、存储介质及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114968347A true CN114968347A (zh) | 2022-08-30 |
Family
ID=82954677
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110194112.5A Pending CN114968347A (zh) | 2021-02-20 | 2021-02-20 | 堆栈还原方法、装置、存储介质及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114968347A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116244160A (zh) * | 2023-05-09 | 2023-06-09 | 江苏博云科技股份有限公司 | 一种无侵入性能分析方法、系统、电子设备及存储介质 |
-
2021
- 2021-02-20 CN CN202110194112.5A patent/CN114968347A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116244160A (zh) * | 2023-05-09 | 2023-06-09 | 江苏博云科技股份有限公司 | 一种无侵入性能分析方法、系统、电子设备及存储介质 |
CN116244160B (zh) * | 2023-05-09 | 2023-08-04 | 江苏博云科技股份有限公司 | 一种无侵入性能分析方法、系统、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112800095B (zh) | 一种数据处理方法、装置、设备及存储介质 | |
CN106796521B (zh) | 独立于产品发布的api版本控制 | |
CN111258680A (zh) | 资源加载方法和装置、存储介质及电子装置 | |
CN110795697A (zh) | 逻辑表达式的获取方法、装置、存储介质以及电子装置 | |
CN110955434B (zh) | 软件开发包处理方法、装置、计算机设备和存储介质 | |
CN114968347A (zh) | 堆栈还原方法、装置、存储介质及电子设备 | |
US12008171B2 (en) | Program download method for intelligent terminal with memory card identifier and intelligent terminal with memory card identifier | |
CN111901453B (zh) | 一种标识生成方法、装置、计算机设备和存储介质 | |
CN117806961A (zh) | 一种芯片测试程序生成方法、装置、电子设备及存储介质 | |
CN111367512B (zh) | 一种应用程序开发中创建Android库模块依赖关系的方法及装置 | |
CN112256252B (zh) | 接口生成方法、装置、存储介质及电子设备 | |
CN114201382A (zh) | 测试用例生成方法、装置、存储介质和电子设备 | |
CN113656044B (zh) | 安卓安装包压缩方法、装置、计算机设备及存储介质 | |
CN114003457A (zh) | 数据获取方法和装置、存储介质及电子设备 | |
CN112148590B (zh) | 一种代码覆盖率的确定方法、装置及设备 | |
CN113704120A (zh) | 数据传输方法、装置、设备及存储介质 | |
CN108334313A (zh) | 用于大型soc研发的持续集成方法、装置及代码管理系统 | |
CN114691496A (zh) | 单元测试方法、装置、计算设备及介质 | |
CN114567571A (zh) | 性能测试方法、装置、电子设备和计算机可读存储介质 | |
CN111221558A (zh) | 一种半自动化资源更新的方法及系统 | |
CN117785493B (zh) | 嵌入式系统的硬件资源访问方法、装置及服务器 | |
CN111414335B (zh) | 一种数据文件查找方法和装置 | |
CN116700840B (zh) | 文件执行方法、装置、电子设备及可读存储介质 | |
CN111966553B (zh) | 一种基于用例池的ssd测试方法、系统、终端及存储介质 | |
CN111097175B (zh) | 一种模拟器的确定方法、装置及存储介质 |
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 |