具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
为便于对本申请实施例的理解,下面将结合附图以具体实施例做进一步的解释说明,实施例并不构成对本申请实施例的限定。
本申请实施例提供的日志信息的获取方法及装置,适用于从终端设备上安装的应用程序的日志文件中获取目标信息的场景,尤其适用于从终端设备上安装的应用程序的崩溃日志文件中获取目标信息的场景。此处,崩溃日志文件是由终端设备的操作系统(如,IOS和Mac OS等)在应用程序出现异常而崩溃后记录的日志文件,该崩溃日志文件中通常记录的是十六进制的内存地址(也称原始信息),其对应唯一的通用唯一识别码(Universally UniqueIdentifier,UUID)。崩溃日志文件对应的UUID也可以为与其对应的应用程序的UUID。
需要说明的是,为了确定应用程序崩溃的原因,则需要对相应的崩溃日志文件进行解析,也即将崩溃日志文件中的原始信息转换成可阅读的信息。
图1为本申请一种实施例提供的日志信息的获取方法流程图。所述方法的执行主体可以为具有处理能力的设备:服务器或者系统或者装置,如图1所示,所述方法具体包括:
步骤110,获取应用程序对应的日志文件。
日志文件是用于记录系统消息的文件,包括两种类型:记录故障信息的日志文件和记录非故障信息的日志文件,其中,记录故障信息的日志文件也称崩溃日志文件,该类日志文件是由终端设备的操作系统(如,IOS)在应用程序出现异常而崩溃后记录的文件,在此说明书中,以日志文件为崩溃日志文件进行说明。
步骤110中可以通过两种方式获取应用程序对应的日志文件:第一种方式是,接收由终端设备上传的应用程序对应的日志文件;第二种方式是,通过Xcode的导出工具(Organizer)可以将IOS终端设备中的设备日志(DeviceLog)导出成日志文件(也称为真机导出的日志文件),其中,Xcode是开发IOS终端设备上安装的应用程序的集成开发环境(Integrated DevelopmentEnvironment,IDE)工具平台。
步骤120,从所述日志文件中提取所述应用程序的第一标识。
其中,步骤120具体可以为:从所述日志文件中包含所述应用程序的名称的代码行中提取所述应用程序的第一标识。
举例来说,假设应用程序的名称为“Xxxx”,且假设日志文件为崩溃日志文件,则从崩溃日志文件中包含“Xxxx”的代码行中提取应用程序的第一标识。而在崩溃日志文件中,包含“Xxxx”的代码行一般为崩溃日志文件的二进制图像(Binary Images)区域的第一行,具体如下所示:
0x10003c000-0x10245bfff+Xxxx arm64<59880be686f93c2cacd543078049cfbd>/private/var/mobile/Containers/Bundle/Application/18A9A558-AC3B-4FAE-B727-754E8C7190D7/Xxxx.app/Xxxx
从上述代码行中提取尖括号中的字符串“59880be686f93c2cacd543078049cfbd”作为名称为“Xxxx”的应用程序的第一标识。
步骤130,根据所述第一标识,从预设的存储单元中查找所述应用程序对应的符号文件的位置信息,其中,所述符号文件是预定义的用于记录所述日志文件中的原始信息与目标信息的对应关系的文件。
其中,步骤130中的预设的存储单元是通过如下步骤创建的:
步骤A:从所述应用程序的安装包中获取所述应用程序对应的程序逻辑文件,并根据所述应用程序的安装包,确定所述符号文件的位置信息,其中,所述程序逻辑文件是预定义的用于记录所述应用程序的第二标识的计算机程序可识别文件。
此处,程序逻辑文件也称二进制文件,其是在应用程序的源代码编译时生成的,用于记录所述应用程序的第二标识的计算机程序可识别文件,该程序逻辑文件包含在应用程序的安装包中,其中,应用程序的安装包是在对应用程序的源代码编译后,并执行打包操作时生成的。举例来说,当应用程序的名称为“Xxxx”时,则生成的程序逻辑文件的名称可以为“Xxxx”。此外,还需要说明的是,程序逻辑文件中记录的第二标识与日志文件中的第一标识均为应用程序的UUID,唯一的区别在于格式不同,在将日志文件中的第一标识经过预处理,如,将第一标识中包含的小写字母转换成大写字母,并按照8444格式添加分割线之后,就可以得到程序文件中记录的第二标识。
此外,在对应用程序的源代码编译时,还生成对应的符号文件,符号文件包含符号信息(也称调试信息),符号信息就是源代码中每个对象的名称。例如变量、函数、类型等,它们都有一个名称,以及其它的相关信息:变量有类型、地址等信息;函数有返回值类型、参数类型、地址等信息;类型有长度等信息。上述生成的符号文件也包含在应用程序的安装包中,且存放在预先设定的目录下,如,在应用程序的名称为“Xxxx”时,上述生成的符号文件可以存储在目录“Xxxx.DSYM”下,该目录在应用程序的安装包中对应的路径信息即为确定的符号文件的位置信息。举例来说,当应用程序的名称为“Xxxx”时,则确定的符号文件的位置信息可以为“/path/to/Xxxx.dSYM/Contents/Resources/DWARF/Xxxx”。
步骤B:从所述程序逻辑文件中提取所述应用程序的第二标识。
在一种具体实现方式中,当程序逻辑文件的名称为“Xxxx”时,则可以对程序逻辑文件执行指令:$dwarfdump-u Xxxx,以提取程序逻辑文件中包含的应用程序的第二标识,在一种方式中,在执行上述指令后获取到的应用程序的信息如下所示:
59880BE6-86F9-3C2C-ACD5-43078049CFBD(arm64)Xxxx
此处,获取的信息包含三部分内容:第二标识、CPU架构和二进制文件名。在一种具体实现方式中,还需要从上述获取到的信息中提取出第二标识,即最终提取到的第二标识为:DCEDE8C5-F91C-38AA-BBC8-41657B934D22。
可选地,为了减小应用程序的压缩包的大小,可以在对应用程序执行打包之前,对上述程序逻辑文件执行如下指令:
$strip+x Xxxx
通过上述指令的执行来过滤程序逻辑文件中的符号信息;或者,也可以通过修改应用程序的配置文件的配置项来过滤程序逻辑文件中的符号信息,如前述例子,可以修改Xxxx的配置文件Info.plist中的配置项“Strip DebugSymbols During Copy”为YES;以及修改“Strip Linked Product”为YES,来实现上述符号信息的过滤。需要说明的是,此处,程序逻辑文件中的符号信息与符号文件中的符号信息是一致的,所以,在此不作赘述。
步骤C:将所述应用程序的第二标识与所述符号文件的位置信息的对应关系存储到所述预设的存储单元中。
举例来说,创建的预设的存储单元可以如表1所示:
表1
字段名 |
|
id |
本次打包的id,自增量 |
app_name |
Xxxx |
app_id |
com.xxx.Xxxx |
dsym_path |
/path/to/Xxxx.dSYM/Contents/Resources/DWARF/Xxxx |
archi_arm64 |
59880BE6-86F9-3C2C-ACD5-43078049CFBD |
即表1中存储了从程序逻辑文件中提取的应用程序的第二标识,同时也存储了符号文件的位置信息,且应用程序的第二标识与符号文件的位置信息之间是一一对应的关系,也即预设的存储单元中存储了应用程序的第二标识与符号文件的位置信息的对应关系。
当然,表1只是预设的存储单元的一种具体实现方式,在实际应用中,也可以在表1中增加其它字段,或者删除部分字段,本申请对此不作限定。
可以理解的是,当终端设备上安装的应用程序的个数为多个时,则终端设备的操作系统需要记录多个应用程序的日志文件,因此,需要通过多个预设的存储单元存储多个应用程序的第二标识与符号文件的对应关系。也即应用程序与预设的存储单元也是一一对应的关系。在一种优选的方式中,当与应用程序对应的预设的存储单元为表时,多个表的字段名可以相同,不同的是字段内容。
还需要说明的是,表1中记录的行数和当前表1对应的应用程序的打包次数相关。
回到步骤130中,步骤130中根据所述第一标识,从预设的存储单元中查找所述应用程序对应的符号文件的位置信息具体可以包括:
步骤1301,对所述第一标识进行预处理,得到目标标识。
其中,预处理可以包括字符串的大小写转换以及在指定的位置添加下划线等。如前述例子,提取的第一标识为字符串:59880be686f93c2cacd543078049cfbd,将上述字符串中的小写字母转换为大写字母,并按照8444格式添加下划线(即在分别在间隔8、4、4和4个字符的位置添加下划线)之后,得到的目标标识为:59880BE6-86F9-3C2C-ACD5-43078049CFBD。
步骤1302,将所述目标标识与所述预设的存储单元中的第二标识进行比对,将比对一致的第二标识对应的符号文件的位置信息作为所述查找到的所述符号文件的位置信息。
如前述例子,可以将目标标识“59880BE6-86F9-3C2C-ACD5-43078049CFBD”与表1中记录的应用程序的第二标识进行比对,因为目标标识与表1中第一行记录的字段“archi_arm64”的内容比对一致,因此,将第一行记录中字段“dsym_path”对应的内容“/path/to/Xxxx.dSYM/Contents/Resources/DWARF/Xxxx”作为查找到的所述符号文件的位置信息。
步骤140,根据查找到的所述符号文件的位置信息以及预设的脚本文件,对所述日志文件进行解析,得到所述日志文件的所述目标信息。
此处,预设的脚本文件可以是Xcode提供的反解关键脚本文件(symbolicatecrash),该预设的脚本文件存储在Xcode软件目录下。优选地,该预设的脚本文件可以是perl脚本。在一种具体实现方式中,可以在/Applications/Xcode.app/目录下执行命令:
$find.-name"symbolicatecrash"-type f
通过上述命令即可找到预设的脚本文件,现有技术中在执行该预设的脚本文件时,首先从程序逻辑文件中获取符号信息,之后根据获取到的符号信息,对应用程序的日志文件进行解析,以得到日志文件的目标信息。然而,本申请中为了减小应用程序的压缩包,对二进制文件中的符号信息进行了删除,在执行上述预设的脚本文件时,不能获取到符号信息,也即不能对日志文件进行正确解析,所以本申请可以对预设的脚本文件进行修改。在一种具体实现方式中,可以通过如下方式进行修改:
首先通过文本编辑器打开预设的脚本文件,之后在预设的脚本文件中查找如下代码段:
print STDERR"Did not find executable for dsym\n"if$opt{v};
return
并进行修改,使得修改后的预设的脚本文件可以支持从输入的位置信息读取符号文件。
回到步骤140中,步骤140还可以进一步包括:
将所述符号文件的位置信息和所述日志文件输入预设的脚本文件,以使所述预设的脚本文件根据所述符号文件的位置信息,读取所述符号文件,并使所述脚本文件根据读取的所述符号文件对所述日志文件进行解析,得到所述日志文件的所述目标信息。
如前述例子中,可以将符号文件的位置信息“/path/to/Xxxx.dSYM/Contents/Resources/DWARF/Xxxx”输入修改后的预设的脚本文件,使得修改后的预设的脚本文件可以根据上述位置信息,读取到应用程序对应的符号文件。在一个具体例子中,原始信息为十六进制的内存地址信息,目标信息为所述应用程序对应的源代码中的函数名和/或变量名以及文件名。也即,根据读取到的符号文件中的符号信息对日志文件中的十六进制的内存地址信息进行解析,得到当前应用程序中出错的函数名和/或变量名以及文件名,以便于分析人员根据分析得到的函数名和/或变量名以及文件名,对该应用程序进行维护。
本申请提供的日志信息的获取方法,获取应用程序对应的日志文件;从所述日志文件中提取所述应用程序的第一标识;根据所述第一标识,从预设的存储单元中查找所述应用程序对应的符号文件的位置信息,其中,所述符号文件是预定义的用于记录所述日志文件中的原始信息与目标信息的对应关系的文件;根据查找到的所述符号文件的位置信息以及预设的脚本文件,对所述日志文件进行解析,得到所述日志文件的所述目标信息。由此,可以实现方便而快速地获取日志文件的目标信息。此外,本申请的方法可以直接从原始的日志文件中获取目标信息,不需要对原始的日志文件进行二次加工,其可以应用到所有业务场景和平台环境。
与上述日志信息的获取方法对应地,本申请实施例还提供的一种日志信息的获取装置,如图2所示,该装置包括:获取单元201、提取单元202、查找单元203和解析单元204;
获取单元201,用于获取应用程序对应的日志文件。
提取单元202,用于从获取单元201获取的所述日志文件中提取所述应用程序的第一标识。
提取单元202具体用于:从所述日志文件中包含所述应用程序的名称的代码行中提取所述应用程序的第一标识。
查找单元203,用于根据提取单元202提取的所述第一标识,从预设的存储单元中查找所述应用程序对应的符号文件的位置信息,其中,所述符号文件是预定义的用于记录所述日志文件中的原始信息与目标信息的对应关系的文件。
其中,所述原始信息可以为十六进制的内存地址信息,所述目标信息可以为所述应用程序对应的源代码中的函数名和/或变量名以及文件名。
查找单元203具体可以包括:预处理单元2031和比对单元2032;
预处理单元2031,用于对所述第一标识进行预处理,得到目标标识;
比对单元2032,用于将预处理单元2031处理得到的所述目标标识与所述预设的存储单元中的第二标识进行比对,将比对一致的第二标识对应的符号文件的位置信息作为所述查找到的所述符号文件的位置信息。
解析单元204,用于根据查找单元203查找到的所述符号文件的位置信息以及预设的脚本文件,对所述日志文件进行解析,得到所述日志文件的所述目标信息。
解析单元204具体用于:将所述符号文件的位置信息和所述日志文件输入预设的脚本文件,以使所述预设的脚本文件根据所述符号文件的位置信息,读取所述符号文件,并使所述脚本文件根据读取的所述符号文件对所述日志文件进行解析,得到所述日志文件的所述目标信息。
可选地,所述装置还包括:存储单元205;
获取单元201,还用于从所述应用程序的安装包中获取所述应用程序对应的程序逻辑文件,并根据所述应用程序的安装包,确定所述符号文件的位置信息,其中,所述程序逻辑文件是预定义的用于记录所述应用程序的第二标识的计算机程序可识别文件;
提取单元202,还用于从获取单元201获取的所述程序逻辑文件中提取所述应用程序的第二标识;
存储单元205,用于将提取单元202提取的所述应用程序的第二标识与所述符号文件的位置信息的对应关系存储到所述预设的存储单元中。
本申请实施例装置的各功能模块的功能,可以通过上述方法实施例的各步骤来实现,因此,本申请提供的装置的具体工作过程,在此不复赘述。
本申请提供的日志信息的获取装置,获取单元201获取应用程序对应的日志文件;提取单元202从所述日志文件中提取所述应用程序的第一标识;查找单元203根据所述第一标识,从预设的存储单元中查找所述应用程序对应的符号文件的位置信息,其中,所述符号文件是预定义的用于记录所述日志文件中的原始信息与目标信息的对应关系的文件;解析单元204根据所述符号文件的位置信息以及预设的脚本文件,对所述日志文件进行解析,得到所述日志文件的所述目标信息。由此,可以实现方便而快速地获取日志文件的目标信息。
专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的对象及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述的具体实施方式,对本申请的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本申请的具体实施方式而已,并不用于限定本申请的保护范围,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。