CN112905378B - 崩溃信息解析方法、装置、电子设备和可读存储介质 - Google Patents

崩溃信息解析方法、装置、电子设备和可读存储介质 Download PDF

Info

Publication number
CN112905378B
CN112905378B CN202110236712.3A CN202110236712A CN112905378B CN 112905378 B CN112905378 B CN 112905378B CN 202110236712 A CN202110236712 A CN 202110236712A CN 112905378 B CN112905378 B CN 112905378B
Authority
CN
China
Prior art keywords
information
address
crash
function
memory
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
CN202110236712.3A
Other languages
English (en)
Other versions
CN112905378A (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.)
Guangzhou Huya Technology Co Ltd
Original Assignee
Guangzhou Huya 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 Guangzhou Huya Technology Co Ltd filed Critical Guangzhou Huya Technology Co Ltd
Priority to CN202110236712.3A priority Critical patent/CN112905378B/zh
Publication of CN112905378A publication Critical patent/CN112905378A/zh
Application granted granted Critical
Publication of CN112905378B publication Critical patent/CN112905378B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0766Error or fault reporting or storing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/079Root cause analysis, i.e. error or fault diagnosis

Abstract

本申请提供一种崩溃信息解析方法、装置、电子设备和可读存储介质,基于崩溃时崩溃地址对应的出错的so文件名称查找对应的so文件在内存中的起始地址,进而基于起始地址起导出在内存中的共享函数库信息,根据共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息。该方案不需要将so文件映射到内存,因此,避免了额外的内存开销。并且,该方案无需在映射后的so文件中通过解析elf格式进行查找,而是基于起始地址从内存中已有的共享函数库信息中查找,避免了由于通过elf格式文件去获取函数信息存在的可能因为信息不全而获取失败的问题。该方案可提高解析成功率,且避免对内存的额外开销。

Description

崩溃信息解析方法、装置、电子设备和可读存储介质
技术领域
本申请涉及计算机技术领域,具体而言,涉及一种崩溃信息解析方法、装置、电子设备和可读存储介质。
背景技术
在安卓系统中,终端设备应用程序发生崩溃时,需要获取崩溃堆栈信息以用于崩溃原因分析。而直接基于崩溃堆栈信息仅能获取崩溃进程的崩溃地址,但根据崩溃地址很难直观定位到具体的崩溃原因,因此,需要将崩溃地址进行解析转换为具体的函数信息,从而确定崩溃原因。
现有技术中,在解析崩溃地址时所采用的方式是在本地的相关目录下查找共享函数库文件,如so文件,将so文件通过匿名内存共享映射到内存中,再基于崩溃地址在映射后的so文件中通过解析elf文件格式以查找对应的函数信息。但是,so文件具有section节和program段两种数据结构,而so文件在内存加载运行只需要一些必要的program段信息,因此不同系统和编译器在编译so文件的时候只会保存必要段信息而不是标准的elf格式的所有信息,这将会导致如果通过elf文件标准信息(例如section节表)去获取函数符号信息可能会因为信息不全从而获取失败。
发明内容
本申请的目的包括,例如,提供了一种崩溃信息解析方法、装置、电子设备和可读存储介质,其能够提高解析成功率,且避免对内存的额外开销。
本申请的实施例可以这样实现:
第一方面,本申请提供一种崩溃信息解析方法,所述方法包括:
获取崩溃时崩溃地址对应的、出错的共享函数库文件名称;
获得具有所述共享函数库文件名称的共享函数库文件在内存中的起始地址;
基于所述起始地址导出在内存中的共享函数库信息;
根据所述共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息。
在可选的实施方式中,所述获取崩溃时崩溃地址对应的、出错的共享函数库文件名称的步骤,包括:
获取崩溃时的崩溃地址以及崩溃地址对应的崩溃进程的堆栈信息;
遍历所述堆栈信息中的每个栈帧信息,获得栈帧信息中保存的出错的共享函数库文件名称。
在可选的实施方式中,所述根据所述共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息的步骤,包括:
根据所述共享函数库信息获得函数列表,所述函数列表包含多个函数以及各所述函数在所述共享函数库文件中的相对偏移地址;
基于获取的崩溃地址以及各所述函数的相对偏移地址,查找所述函数列表以获得所述崩溃地址对应的出错的被调函数的信息。
在可选的实施方式中,所述相对偏移地址包括相对起始地址和相对终止地址;
所述基于获取的崩溃地址以及各所述函数的相对偏移地址,查找所述函数列表以获得所述崩溃地址对应的出错的被调函数的信息的步骤,包括:
根据各所述函数的相对起始地址、相对终止地址和所述共享函数库文件在内存中的起始地址,获得各所述函数的地址范围;
将所述崩溃地址与各所述函数的地址范围进行比对,获得所述崩溃地址所属的目标地址范围;
获得所述函数列表中所述目标地址范围对应的函数信息,基于所述函数信息获得所述崩溃进程发生崩溃时出错的被调函数的信息。
在可选的实施方式中,所述基于所述起始地址导出在内存中的共享函数库信息的步骤,包括:
通过所述起始地址查找内存中的动态链接信息,导出设定地址范围内的共享函数库信息。
在可选的实施方式中,所述获得具有所述共享函数库文件名称的共享函数库文件在内存中的起始地址的步骤,包括:
根据所述共享函数库文件名称和预设的应用程序接口,查找对应的共享函数库文件在内存中的起始地址。
在可选的实施方式中,所述被调函数的信息包括被调函数的函数名以及被调函数的函数符号。
第二方面,本申请提供一种崩溃信息解析装置,所述装置包括:
名称获取模块,用于获取崩溃时崩溃地址对应的、出错的共享函数库文件名称;
地址获取模块,用于获得具有所述共享函数库文件名称的共享函数库文件在内存中的起始地址;
导出模块,用于基于所述起始地址导出在内存中的共享函数库信息;
信息获取模块,用于根据所述共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息。
第三方面,本申请提供一种电子设备,包括一个或多个存储介质和一个或多个与存储介质通信的处理器,一个或多个存储介质存储有处理器可执行的机器可执行指令,当电子设备运行时,处理器执行所述机器可执行指令,以执行前述实施方式中任意一项所述的方法步骤。
第四方面,本申请提供一种计算机可读存储介质,所述计算机可读存储介质存储有机器可执行指令,所述机器可执行指令被执行时实现前述实施方式中任意一项所述的方法步骤。
本申请实施例的有益效果包括,例如:
本申请提供一种崩溃信息解析方法、装置、电子设备和可读存储介质,基于崩溃时崩溃地址对应的出错的so文件名称查找对应的so文件在内存中的起始地址,进而基于起始地址起导出在内存中的共享函数库信息,根据共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息。该方案不需要将so文件映射到内存,因此,避免了额外的内存开销。并且,该方案无需在映射后的so文件中通过解析elf格式进行查找,而是基于起始地址从内存中已有的共享函数库信息中查找,避免了由于通过elf格式文件去获取函数信息存在的可能因为信息不全而获取失败的问题。该方案可提高解析成功率,且避免对内存的额外开销。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本申请实施例提供的电子设备的结构框图;
图2为本申请实施例提供的崩溃信息解析方法的流程图;
图3为本申请实施例提供的崩溃信息解析方法中,共享函数库文件名称获取方法的流程图;
图4为本申请实施例提供的崩溃信息解析方法中,被调函数信息获取方法的流程图;
图5为本申请实施例提供的崩溃信息解析方法中,被调函数信息获取方法的另一流程图;
图6为本申请实施例提供的崩溃信息解析装置的功能模块框图。
图标:10-电子设备;100-处理器;200-存储器;300-崩溃信息解析装置;310-名称获取模块;320-地址获取模块;330-导出模块;340-信息获取模块。
具体实施方式
目前,终端设备的安卓应用在发生native崩溃时,会通过中断信号机制进行崩溃捕获,同时进行堆栈抓取,从而后续通过该堆栈分析崩溃原因以进行问题修复。但是,堆栈中每一个框架内只有共享文件库名称以及崩溃的内存地址,仅仅从基于内存地址是很难快速定位到具体的代码问题的。因此,需要对内存地址进行解析以转换成具体的函数符号,甚至是源码文件行数。
这个解析过程涉及到系统库和私有库(即公司自行研发),私有库因为在编译的时候存储了带有排错信息的符号,因此,在崩溃解析时,可以直接借助该排错信息符号并通过例如addr2line、objdump等命令将内存地址直接进行符号化。在进行内存地址符号化后,即可帮助研发人员快速定位到问题所在。
但是,系统库是终端设备自带的,并没有对应的带排错信息的符号,因此,针对系统库无法像私有库一样通过上述方式对内存地址进行符号化。
目前,针对系统库的内存地址的符号化处理,一种方式是直接不进行处理,研发人员通过一定方式去查找对应的so文件,进行反编译后通过内存地址查找附近可疑的函数。但是,由于实际场景中,大多数人员不具备这种专业能力,且查找结果的精确度不能保证。
还有一种方式是,通过在本地的相关目录下查找so文件,并将so文件映射到内存中,再基于崩溃地址在映射后的so文件中通过解析elf文件格式以查找对应的函数信息。但是,这种方式中,由于so文件具有section节和program段两种数据结构,而so文件在内存加载运行只需要一些必要的program段信息,因此不同系统和编译器在编译so文件的时候只会保存必要段信息而不是标准的elf格式的所有信息,这将会导致如果通过elf文件标准信息(例如section节表)去获取函数符号信息可能会因为信息不全从而获取失败。
基于上述研究,本申请提供一种崩溃信息解析方案,该方案无需查找so文件并且进行内存映射,而是基于崩溃时崩溃地址对应的出错的so文件名称查找对应的so文件在内存中的起始地址,进而基于起始地址起导出内存中的共享函数库信息,根据共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息。如此,可以需要将so文件映射到内存中,因此,避免了额外的内存开销。并且,该方案无需在映射后的so文件中通过解析elf格式进行查找,而是基于起始地址从内存中已有的共享函数库信息中查找,避免了由于通过elf格式文件去获取函数信息存储的可能因为信息不全而获取失败的问题。可以提高解析成功率,且避免对内存的额外开销。
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
需要说明的是,在不冲突的情况下,本申请的实施例中的特征可以相互结合。
如图1所示,本申请实施例提供了一种电子设备10,可以包括存储器200和处理器100,该存储器200内可以设置有机器可执行指令,该机器可执行指令包括崩溃信息解析装置300。
其中,所述存储器200和处理器100之间直接或间接地电性连接,以实现数据的传输或交互。例如,相互之间可通过一条或多条通讯总线或信号线实现电性连接。所述崩溃信息解析装置300包括至少一个可以软件或固件(firmware)的形式存储于所述存储器200中的软件功能模块。所述处理器100用于执行所述存储器200中存储的可执行的计算机程序,例如,所述崩溃信息解析装置300所包括的软件功能模块及计算机程序等,以实现本申请实施例提供的崩溃信息解析方法。
可选地,所述存储器200可以是,但不限于,随机存取存储器(Random AccessMemory,RAM),只读存储器(Read Only Memory,ROM),可编程只读存储器(ProgrammableRead-Only Memory,PROM),可擦除只读存储器(Erasable Programmable Read-OnlyMemory,EPROM),电可擦除只读存储器(Electric Erasable Programmable Read-OnlyMemory,EEPROM)等。
所述处理器100可以是一种通用处理器,包括中央处理器(Central ProcessingUnit,CPU)、网络处理器(Network Processor,NP)、片上系统(System on Chip,SoC)等;还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
可以理解,图1所示的结构仅为示意,所述电子设备10还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置,例如,还可以包括用于与其它设备进行信息交互的通信单元。
其中,所述电子设备10的具体类型不受限制,可以根据实际应用需求进行选择,只要具有一定的数据处理能力即可,例如,在一种可以替代的示例中,所述电子设备10包括智能手机、平板电脑、个人数字助手等终端设备。
结合图2,本申请实施例还提供一种可应用于上述电子设备10的崩溃信息解析方法。其中,该崩溃信息解析方法有关的流程所定义的方法步骤可以由所述电子设备10实现。下面将对图2所示的具体流程进行详细阐述。
步骤S110,获取崩溃时崩溃地址对应的、出错的共享函数库文件名称。
步骤S120,获得具有所述共享函数库文件名称的共享函数库文件在内存中的起始地址。
步骤S130,基于所述起始地址导出在内存中的共享函数库信息。
步骤S140,根据所述共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息。
本实施例中,所述的共享函数库文件即为安卓系统下的so文件,即动态链接库,其为在C或C++下编译出来的。共享函数库文件中包含多个函数,所述的被调函数即为被动态调用的函数。共享函数库文件中的函数在被动态调用并运行后,保存相关信息至内存中。
在应用发生崩溃时,可以相应获得崩溃时的崩溃地址,该崩溃地址为在内存中的崩溃绝对地址。并且,可获得出错而导致崩溃的共享函数库文件名称。由于共享函数库文件中的函数被调用而在内存保存相关信息,相应地,在该共享函数库文件中的信息被加载至内存时,在内存中将具有加载时的起始地址。
而从共享函数库文件的相关信息被加载至内存中的起始地址开始,基于该起始地址开始查找则可以导出出错的共享函数库文件中的在内存中的动态链接相关信息,即对应的共享函数库信息。本实施例中,可通过读取进程的如/proc/self/maps文件,从而获得对应的共享函数库信息。
该共享函数库信息并不是整个共享函数库文件映射后的信息,而是共享函数库文件中函数运行所必须的动态链接相关信息。在获得崩溃时的崩溃地址的情况下,若想要能够快速定位到具体的出错原因,则需要获得引起该崩溃的具体的函数信息。因此,在获得出错的共享函数库文件在内存中的共享函数库信息以及崩溃地址后,则可从该共享函数库信息中查找可与该崩溃地址匹配的函数信息,即出错的被调函数的信息。
在本实施例中,被调函数的信息包括被调函数的函数名以及被调函数的函数符号。
本实施例所提供的崩溃信息解析方法,无需如现有技术中的在本地相关目录下查找出错的so文件,并将so文件映射至内存,再通过解析elf格式来查找被调函数信息,而是采用获取so文件中信息加载至内存中的起始地址,基于该起始地址获得内存中已有的so信息,进而查找获得被调函数信息。因此,本实施例所提供的方案,无需将so文件整个映射到内存,避免了额外的内存开销。且避免了现有技术中,由于通过elf格式文件获取函数信息存在的可能因为信息不全而导致失败的问题。该方案可提高解析成功率,且避免对内存的额外开销。
本实施例中,应用发生崩溃时,设备将采集崩溃信息,该崩溃信息中包含相应的堆栈信息,请参阅图3,上述在获取出错的共享函数文件名称时,可以通过以下方式实现:
步骤S111,获取崩溃时的崩溃地址以及崩溃地址对应的崩溃进程的堆栈信息。
步骤S112,遍历所述堆栈信息中的每个栈帧信息,获得栈帧信息中保存的出错的共享函数库文件名称。
堆栈是计算机中广泛应用的技术,基于堆栈具有的数据进出LIFO特性,常应用于保存中断断点、保留子程序调用返回点、保存CPU现场数据等,也可以用于程序间传递参数。
应用崩溃时,会通过中断信号机制进行崩溃捕获,同时进行堆栈抓取。本实施例中,可通过sp寄存器(堆栈指针寄存器)获取崩溃时崩溃进程的堆栈信息。
堆栈由一个或多个栈帧组成,每个栈帧对应于对尚未返回的终止函数或过程的调用。本实施例中,遍历堆栈信息中的每个栈帧信息,其中,栈帧信息中包含有出错的共享函数库文件名称。此外,栈帧信息中还包含与出错的共享函数库文件名称对应的共享函数库文件在内存中的起始地址。
共享函数库文件在内存中的起始地址,实质为共享函数库文件中的函数动态加载至内存时的起始地址。该起始地址为在内存中的绝对地址,而共享函数库文件内部包含相对偏移位置,因此,实施时,共享函数库文件在内存中的起始地址,相对于共享函数库文件内部而言,即为其相对偏移量为0的情况下的地址。
本实施例中,考虑到有可能出现主动查找的方式难以获得共享函数库文件的起始地址的情况,因此,作为一种可能的实施方式,可以根据出错的共享函数库文件名称和预设的应用程序接口,查找对应的共享函数库文件在内存中的起始地址。该预设的应用程序接口例如可以是在android 7.0后增加的接口。
在获得共享函数库文件加载至内存中的起始地址的情况下,该共享函数库文件中的相关函数的调用信息将从该起始地址开始保存在内存中。因此,在内存的从该起始地址开始的一段空间内将保存有相关函数的动态链接信息。
基于此,本实施例中,可通过上述的起始地址查找内存中的动态链接信息,导出设定地址范围内的共享函数库信息。其中,该设定地址范围可以是根据共享函数库文件中被调函数的相关信息来确定。
基于获得的共享函数库信息以及获取的崩溃地址可获得出错的被调函数的信息,请参阅图4,该步骤可以通过以下方式实现:
步骤S141,根据所述共享函数库信息获得函数列表,所述函数列表包含多个函数以及各所述函数在所述共享函数库文件中的相对偏移地址。
步骤S142,基于获取的崩溃地址以及各所述函数的相对偏移地址,查找所述函数列表以获得所述崩溃地址对应的出错的被调函数的信息。
本实施例中,共享函数库信息在内存中以函数列表形式保存,该函数列表中保存的即为出错的共享函数库文件中所有被调用的函数的相关信息。具体地,包含多个被调用的函数,各函数的如函数名、函数符号,以及各函数在共享函数库文件中的相对偏移地址。也即,在函数列表中函数名、函数符号与函数的相对偏移地址是一一对应的。
在获得崩溃时的崩溃地址,以及共享函数库文件在内存中的起始地址、函数列表中各函数在共享函数库文件中的相对偏移地址的情况下,通过地址匹配的方式,则可以确定与崩溃地址匹配的函数,即出错的被调函数,进而获得出错的被调函数的如函数名、函数符号等信息。
本实施例中,各函数在共享函数库文件中的相对偏移地址可能为一定范围内的地址,也即相对偏移地址包括相对起始地址和相对终止地址,因此,上述在匹配崩溃地址和符号的相对偏移地址时,请参阅图5,可通过以下方式实现:
步骤S1421,根据各所述函数的相对起始地址、相对终止地址和所述共享函数库文件在内存中的起始地址,获得各所述函数的地址范围。
步骤S1422,将所述崩溃地址与各所述函数的地址范围进行比对,获得所述崩溃地址所属的目标地址范围。
步骤S1423,获得所述函数列表中所述目标地址范围对应的函数信息,基于所述函数信息获得所述崩溃进程发生崩溃时出错的被调函数的信息。
本实施例中,由于共享函数库文件在内存中的起始地址为绝对地址,而各函数具有在共享函数库文件中的相对起始地址和相对终止地址。因此,可以将各函数的相对起始地址和相对终止地址转换为在内存中的绝对地址。进而确定各函数在内存中的绝对的地址范围。
在崩溃地址和各函数的地址范围确定的情况下,即可将崩溃地址与各函数的地址范围进行比对,从而确定崩溃地址处于哪个地址范围内。在确定崩溃地址处于的地址范围,则该地址范围对应的函数即为出错的被调函数。
本实施例所提供的崩溃信息解析方法,通过基于出错的共享函数库文件加载至内存中的起始地址,以直接查找已加载至内存中的动态链接信息,从而获得出错的被调函数的信息。避免了现有技术中需要将so文件整体映射至内存所存在的额外的内存开销的问题,且避免了现有技术中需从映射后的so文件并通过elf格式文件进行查找,存在的可能由于信息不全导致的查找失败的问题。本实施例所提供的崩溃信息解析方法可提高解析成功率,且降低对内存的开销。
以下示例性的示出了采用本实施例所提供的崩溃信息解析方法进行解析所获得的函数信息。在进行解析之前,获得的堆栈中的相关信息如下:
0 libc.so+0x1dc70
1 libhycrashreport.so!crasher_test::dolllegalCopy[crasher.cpp:79+0x14]
2 libart.so+0x5689e0
3 base.apk(deleted)+0x1b75ae
4 base.apk(delated)+0x1b75ae
5 libart.so+0x55fc4c
6 libart.so+0xcfd60
7 base.apk(delated)+0x1b75ae
8 dalvik-LinearAlloc(delated)+0x4b94
9 base.apk(deleted)+0x1b75ae
10 boot-core-libart.vdex+0x189ade
11 dalvik-LinearAlloc(deleted)+0x4b94
12 dalvik-LinearAlloc(deleted)+0x4b94
13 libat.co+0x283de0
在通过本实施例所提供的崩溃信息解析方法进行处理后,相应地可得到如下的堆栈信息:
Crashed thread info start
0 libc.so+0x1dc70(c16rtomb+0x0000000b)
1 libhycrashreport.so!crasher_test::dolllegalCopy[crasher.cpp:79+0x14]
2 libart.so+0x5689e0(_end+0x000f36cf)
3 base.apk(deleted)+0x1b75ae
4 base.apk(delated)+0x1b75ae
5 libart.so+0x55fc4c(_end+0x000ea93b)
6 libart.so+0xcfd60
(_ZN3art11ClassLinker16CheckSystemClassEPNS_6ThreadENS_6Handle INS_6mirror5ClassEEEPKc+0x0000019f)
7 base.apk(delated)+0x1b75ae
8 dalvik-LinearAlloc(delated)+0x4b94
9 base.apk(deleted)+0x1b75ae
10 boot-core-libart.vdex+0x189ade
11 dalvik-LinearAlloc(deleted)+0x4b94
12 dalvik-LinearAlloc(deleted)+0x4b94
13 libat.co+0x283de0
(_ZlsRNSt3_113basic_ostreamlcNS_11char_traitslcEEEERK14jobjectRefType+0x000204eb)
由上可见,上述信息通过本实施例的崩溃信息解析方法处理后,其中,序列为0(libc.so)、2(libart.so)、5(libart.so)、6(libart.so)、13(libart.so)的系统库对应的崩溃地址都能通过该方式完整解析出来。其中,如下所示为在运行期间解析系统库后并与崩溃地址对应的函数符号信息:
0 c16rtomb 0x0000000b
2_end 0x000f36cf
5_end 0x000ea93b
6_ZN3art11ClassLinker16CheckSystemClassEPNS_6ThreadENS
_6HandleINS_6mirror5ClassEEEPKc 0x0000019f
13_ZlsRNSt3_113basic_ostreamlcNS_11char
_traitslcEEEERK14jobjectRefType 0x000204eb
通过本实施例提供的崩溃信息解析方案,可以极大提升对崩溃问题的定位和解决效率,从而以保障安卓应用的质量和稳定性。
结合图6,本申请实施例还提供一种可应用于上述电子设备10的崩溃信息解析装置300。其中,所述崩溃信息解析装置300可以包括名称获取模块310、地址获取模块320、导出模块330以及信息获取模块340。
名称获取模块310,用于获取崩溃时崩溃地址对应的、出错的共享函数库文件名称;
在本实施例中,所述名称获取模块310可用于执行图2所示的步骤S110,关于所述名称获取模块310的相关内容可以参照前文对步骤S110的描述。
地址获取模块320,用于获得具有所述共享函数库文件名称的共享函数库文件在内存中的起始地址;
在本实施例中,所述地址获取模块320可用于执行图2所示的步骤S120,关于所述地址获取模块320的相关内容可以参照前文对步骤S120的描述。
导出模块330,用于基于所述起始地址导出在内存中的共享函数库信息;
在本实施例中,所述导出模块330可用于执行图2所示的步骤S130,关于所述导出模块330的相关内容可以参照前文对步骤S130的描述。
信息获取模块340,用于根据所述共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息。
在本实施例中,所述信息获取模块340可用于执行图2所示的步骤S140,关于所述信息获取模块340的相关内容可以参照前文对步骤S140的描述。
在一种可能的实施方式中,上述名称获取模块310可以用于通过以下方式获得出错的共享函数库文件名称:
获取崩溃时的崩溃地址以及崩溃地址对应的崩溃进程的堆栈信息;
遍历所述堆栈信息中的每个栈帧信息,获得栈帧信息中保存的出错的共享函数库文件名称。
在一种可能的实施方式中,上述信息获取模块340可以用于通过以下方式获得出错的被调函数的信息:
根据所述共享函数库信息获得函数列表,所述函数列表包含多个函数以及各所述函数在所述共享函数库文件中的相对偏移地址;
基于获取的崩溃地址以及各所述函数的相对偏移地址,查找所述函数列表以获得所述崩溃地址对应的出错的被调函数的信息。
在一种可能的实施方式中,所述相对偏移地址包括相对起始地址和相对终止地址,上述信息获取模块340具体可以用于:
根据各所述函数的相对起始地址、相对终止地址和所述共享函数库文件在内存中的起始地址,获得各所述函数的地址范围;
将所述崩溃地址与各所述函数的地址范围进行比对,获得所述崩溃地址所属的目标地址范围;
获得所述函数列表中所述目标地址范围对应的函数信息,基于所述函数信息获得所述崩溃进程发生崩溃时出错的被调函数的信息。
在一种可能的实施方式中,上述导出模块330具体可以用于:
通过所述起始地址查找内存中的动态链接信息,导出设定地址范围内的共享函数库信息。
在一种可能的实施方式中,上述地址获取模块320具体可以用于:
根据所述共享函数库文件名称和预设的应用程序接口,查找对应的共享函数库文件在内存中的起始地址。
在一种可能的实施方式中,所述被调函数的信息包括被调函数的函数名以及被调函数的函数符号。
在本申请实施例中,对应于上述的崩溃信息解析方法,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,该计算机程序运行时执行上述崩溃信息解析方法的各个步骤。
其中,前述计算机程序运行时执行的各步骤,在此不再一一赘述,可参考前文对所述崩溃信息解析方法的解释说明。
综上所述,本申请实施例提供的崩溃信息解析方法、装置、电子设备和可读存储介质,基于崩溃时崩溃地址对应的出错的so文件名称查找对应的so文件在内存中的起始地址,进而基于起始地址起导出在内存中的共享函数库信息,根据共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息。该方案不需要将so文件映射到内存,因此,避免了额外的内存开销。并且,该方案无需在映射后的so文件中通过解析elf格式进行查找,而是基于起始地址从内存中已有的共享函数库信息中查找,避免了由于通过elf格式文件去获取函数信息存在的可能因为信息不全而获取失败的问题。该方案可提高解析成功率,且避免对内存的额外开销。
在本申请实施例所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置和方法实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,电子设备,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (9)

1.一种崩溃信息解析方法,其特征在于,所述方法包括:
获取崩溃时崩溃地址对应的、出错的共享函数库文件名称;
获得具有所述共享函数库文件名称的共享函数库文件在内存中的起始地址;
基于所述起始地址导出在内存中的共享函数库信息;
根据所述共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息;
所述根据所述共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息的步骤,包括:
根据所述共享函数库信息获得函数列表,所述函数列表包含多个函数以及各所述函数在所述共享函数库文件中的相对偏移地址;基于获取的崩溃地址以及各所述函数的相对偏移地址,查找所述函数列表以获得所述崩溃地址对应的出错的被调函数的信息。
2.根据权利要求1所述的崩溃信息解析方法,其特征在于,所述获取崩溃时崩溃地址对应的、出错的共享函数库文件名称的步骤,包括:
获取崩溃时的崩溃地址以及崩溃地址对应的崩溃进程的堆栈信息;
遍历所述堆栈信息中的每个栈帧信息,获得栈帧信息中保存的出错的共享函数库文件名称。
3.根据权利要求1所述的崩溃信息解析方法,其特征在于,所述相对偏移地址包括相对起始地址和相对终止地址;
所述基于获取的崩溃地址以及各所述函数的相对偏移地址,查找所述函数列表以获得所述崩溃地址对应的出错的被调函数的信息的步骤,包括:
根据各所述函数的相对起始地址、相对终止地址和所述共享函数库文件在内存中的起始地址,获得各所述函数的地址范围;
将所述崩溃地址与各所述函数的地址范围进行比对,获得所述崩溃地址所属的目标地址范围;
获得所述函数列表中所述目标地址范围对应的函数信息,基于所述函数信息获得崩溃进程发生崩溃时出错的被调函数的信息。
4.根据权利要求1所述的崩溃信息解析方法,其特征在于,所述基于所述起始地址导出在内存中的共享函数库信息的步骤,包括:
通过所述起始地址查找内存中的动态链接信息,导出设定地址范围内的共享函数库信息。
5.根据权利要求1所述的崩溃信息解析方法,其特征在于,所述获得具有所述共享函数库文件名称的共享函数库文件在内存中的起始地址的步骤,包括:
根据所述共享函数库文件名称和预设的应用程序接口,查找对应的共享函数库文件在内存中的起始地址。
6.根据权利要求1-5任意一项所述的崩溃信息解析方法,其特征在于,所述被调函数的信息包括被调函数的函数名以及被调函数的函数符号。
7.一种崩溃信息解析装置,其特征在于,用于实现权利要求1-6任意一项所述的方法,所述装置包括:
名称获取模块,用于获取崩溃时崩溃地址对应的、出错的共享函数库文件名称;
地址获取模块,用于获得具有所述共享函数库文件名称的共享函数库文件在内存中的起始地址;
导出模块,用于基于所述起始地址导出在内存中的共享函数库信息;
信息获取模块,用于根据所述共享函数库信息以及获取的崩溃地址获得出错的被调函数的信息。
8.一种电子设备,其特征在于,包括一个或多个存储介质和一个或多个与存储介质通信的处理器,一个或多个存储介质存储有处理器可执行的机器可执行指令,当电子设备运行时,处理器执行所述机器可执行指令,以执行权利要求1-6中任意一项所述的方法步骤。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有机器可执行指令,所述机器可执行指令被执行时实现权利要求1-6中任意一项所述的方法步骤。
CN202110236712.3A 2021-03-03 2021-03-03 崩溃信息解析方法、装置、电子设备和可读存储介质 Active CN112905378B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110236712.3A CN112905378B (zh) 2021-03-03 2021-03-03 崩溃信息解析方法、装置、电子设备和可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110236712.3A CN112905378B (zh) 2021-03-03 2021-03-03 崩溃信息解析方法、装置、电子设备和可读存储介质

Publications (2)

Publication Number Publication Date
CN112905378A CN112905378A (zh) 2021-06-04
CN112905378B true CN112905378B (zh) 2024-03-08

Family

ID=76107784

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110236712.3A Active CN112905378B (zh) 2021-03-03 2021-03-03 崩溃信息解析方法、装置、电子设备和可读存储介质

Country Status (1)

Country Link
CN (1) CN112905378B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114020504B (zh) * 2021-10-19 2022-08-09 北京五八信息技术有限公司 一种数据处理方法、装置、电子设备及存储介质
CN114020505B (zh) * 2021-10-19 2022-12-23 北京五八信息技术有限公司 一种数据处理方法、装置、电子设备及存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2002312192A (ja) * 2001-04-11 2002-10-25 Toshiba Corp ダイナミックリンクライブラリィのロード先アドレス認識方法、コンピュータ装置、記録媒体、及びプログラム
JP2006113935A (ja) * 2004-10-18 2006-04-27 Hitachi Ltd ダイナミックリンクライブラリ呼び出しコード生成方法、プログラム、および、装置
CN106681782A (zh) * 2016-12-09 2017-05-17 北京奇虎科技有限公司 一种编译安卓安装包的动态链接库so文件的方法和装置
CN111813641A (zh) * 2020-06-19 2020-10-23 北京字节跳动网络技术有限公司 崩溃信息收集的方法、装置、介质和设备
CN112099982A (zh) * 2020-09-08 2020-12-18 北京字节跳动网络技术有限公司 一种崩溃信息定位方法、装置、介质和电子设备

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2002312192A (ja) * 2001-04-11 2002-10-25 Toshiba Corp ダイナミックリンクライブラリィのロード先アドレス認識方法、コンピュータ装置、記録媒体、及びプログラム
JP2006113935A (ja) * 2004-10-18 2006-04-27 Hitachi Ltd ダイナミックリンクライブラリ呼び出しコード生成方法、プログラム、および、装置
CN106681782A (zh) * 2016-12-09 2017-05-17 北京奇虎科技有限公司 一种编译安卓安装包的动态链接库so文件的方法和装置
CN111813641A (zh) * 2020-06-19 2020-10-23 北京字节跳动网络技术有限公司 崩溃信息收集的方法、装置、介质和设备
CN112099982A (zh) * 2020-09-08 2020-12-18 北京字节跳动网络技术有限公司 一种崩溃信息定位方法、装置、介质和电子设备

Also Published As

Publication number Publication date
CN112905378A (zh) 2021-06-04

Similar Documents

Publication Publication Date Title
CN112905378B (zh) 崩溃信息解析方法、装置、电子设备和可读存储介质
CN109814524B (zh) 一种车辆诊断方法、装置及系统
CN106547782B (zh) 日志信息的获取方法及装置
CN111367595B (zh) 数据处理方法、程序运行方法、装置及处理设备
CN107015904B (zh) 堆栈的保护方法及装置
CN110851351A (zh) 部署环境测试方法、装置、计算机设备及存储介质
CN112363937B (zh) 差异覆盖率测试方法、装置、计算机设备和存储介质
CN110866258A (zh) 快速定位漏洞方法、电子装置及存储介质
CN111353143A (zh) 敏感权限检测方法、装置及存储介质
CN112612756A (zh) 异常文件的修复方法、装置、设备及存储介质
CN112083851A (zh) Bios配置选项的界面定位方法和装置、服务器、计算机可读存储介质
CN116795486A (zh) 一种容器镜像文件提纯的分析方法、装置、存储介质及终端
CN108763053B (zh) 埋点名称的生成方法及终端设备
CN112363758A (zh) 一种获取开源项目第三方组件信息的方法及装置
CN110244954B (zh) 一种应用程序的编译方法及设备
CN110377499B (zh) 一种对应用程序进行测试的方法及装置
CN111143790B (zh) 代码混淆方法、装置、设备及存储介质
CN111191235B (zh) 可疑文件分析方法、装置和计算机可读存储介质
CN113918384A (zh) 数据保存方法、装置、设备及存储介质
CN106844205B (zh) 驱动程序调试方法及系统
CN106940772B (zh) 变量对象的跟踪方法及装置
CN112612471B (zh) 代码处理方法、装置、设备及存储介质
CN113238889B (zh) 一种漏洞的问题定位方法及装置、存储介质、终端
CN114818645B (zh) 基于数据主体的自动化报告生成方法、装置、设备及介质
CN112527660B (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
GR01 Patent grant
GR01 Patent grant