一种野指针的函数栈信息确定方法、装置及电子设备转让专利

申请号 : CN201510618656.4

文献号 : CN106557300B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李伟俞骁

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本发明实施例提供一种野指针的函数栈信息确定方法、装置及电子设备,其中方法包括:钩子内存调用函数,以在调用内存调用函数时,确定内存调用函数的栈信息;确定内存调用函数指向的内存区域,记录所确定的内存区域及内存区域所对应的内存调用函数的栈信息;当由野指针导致应用崩溃时,确定野指针所指向的内存区域;从所记录的内存区域及内存区域所对应的内存调用函数的栈信息中,确定野指针所指向的内存区域的栈信息,得到野指针的函数栈信息。本发明实施例在确定野指针的函数栈信息时,极大简化了处理逻辑,使得野指针的函数栈信息的确定较为简便。

权利要求 :

1.一种野指针的函数栈信息确定方法,其特征在于,包括:钩子内存调用函数,以在调用内存调用函数时,确定内存调用函数的栈信息;所述内存调用函数的栈信息为,表示内存调用函数被调用时的栈状态的信息;

确定内存调用函数指向的内存区域,记录所确定的内存区域及内存区域所对应的内存调用函数的栈信息;

当由野指针导致应用崩溃时,确定野指针所指向的内存区域;

从所记录的内存区域及内存区域所对应的内存调用函数的栈信息中,确定野指针所指向的内存区域的内存调用函数的栈信息,作为野指针的函数栈信息。

2.根据权利要求1所述的野指针的函数栈信息确定方法,其特征在于,所述钩子内存调用函数包括:钩子父类对象的内存调用函数。

3.根据权利要求1所述的野指针的函数栈信息确定方法,其特征在于,所述钩子内存调用函数包括:钩子内存分配函数,以在调用内存分配函数时,确定内存分配函数的栈信息;及钩子内存释放函数,以在调用内存释放函数时,确定内存释放函数的栈信息;

所述确定野指针所指向的内存区域的栈信息包括:

确定野指针所指向的内存区域的内存分配函数的栈信息,和内存释放函数的栈信息。

4.根据权利要求1-3任一项所述的野指针的函数栈信息确定方法,其特征在于,所述由野指针导致应用崩溃的确定过程包括:当应用崩溃时,分析应用崩溃时的顶层函数是否与预置函数对应,若确定应用崩溃时的顶层函数与预置函数对应,则确定是由野指针导致的应用崩溃;

或,当应用崩溃时,分析应用崩溃时的异常关键字是否与预置关键字对应,若确定应用崩溃时的异常关键字与预置关键字对应,则确定是由野指针导致的应用崩溃。

5.根据权利要求4所述的野指针的函数栈信息确定方法,其特征在于,所述确定野指针所指向的内存区域包括:在由野指针导致的应用崩溃时,若顶层函数与预置函数对应,则从顶层函数对应的寄存器中提取出野指针所指向的内存区域;

或,在由野指针导致的应用崩溃时,若异常关键字与预置关键字对应,则从所述异常关键字中解析出野指针所指向的内存区域。

6.根据权利要求1所述的野指针的函数栈信息确定方法,其特征在于,还包括:将得到的野指针的函数栈信息记录到崩溃日志中。

7.根据权利要求6所述的野指针的函数栈信息确定方法,其特征在于,所述野指针的函数栈信息包括:野指针所指向的内存区域的内存分配函数的栈信息,和内存释放函数的栈信息;

所述将得到的野指针的函数栈信息记录到崩溃日志中包括:在崩溃日志中将野指针的函数栈信息以线程的形式进行记录,其中包括:以设定名字命名线程,在所述线程下记录野指针所指向内存区域的内存分配函数的栈信息,和内存释放函数的栈信息。

8.一种野指针的函数栈信息确定装置,其特征在于,包括:钩子模块,用于钩子内存调用函数,以在调用内存调用函数时,确定内存调用函数的栈信息;所述内存调用函数的栈信息为,表示内存调用函数被调用时的栈状态的信息;

确定并记录模块,用于确定内存调用函数指向的内存区域,记录所确定的内存区域及内存区域所对应的内存调用函数的栈信息;

崩溃确定模块,用于确定由野指针导致应用崩溃;

指向内存区域确定模块,用于当由野指针导致应用崩溃时,确定野指针所指向的内存区域;

栈信息确定模块,用于从所记录的内存区域及内存区域所对应的内存调用函数的栈信息中,确定野指针所指向的内存区域的内存调用函数的栈信息,作为野指针的函数栈信息。

9.根据权利要求8所述的野指针的函数栈信息确定装置,其特征在于,所述钩子模块包括:第一钩子单元,用于钩子内存分配函数,以在调用内存分配函数时,确定内存分配函数的栈信息;

第二钩子单元,用于钩子内存释放函数,以在调用内存释放函数时,确定内存释放函数的栈信息;

所述野指针的函数栈信息包括:野指针所指向的内存区域的内存分配函数的栈信息,和内存释放函数的栈信息;

所述装置还包括:日志记录模块,用于将得到的野指针的函数栈信息记录到崩溃日志中;

所述日志记录模块包括:记录执行单元,用于在崩溃日志中将野指针的函数栈信息以线程的形式进行记录,其中包括:以设定名字命名线程,在所述线程下记录野指针所指向内存区域的内存分配函数的栈信息,和内存释放函数的栈信息。

10.一种电子设备,其特征在于,包括权利要求8-9任一项所述的野指针的函数栈信息确定装置。

11.一种电子设备,其特征在于,包括处理器和存储器;

所述存储器用于存放程序;

所述处理器用于执行所述程序,以实现如权利要求1-7任一项所述的野指针的函数栈信息确定方法的步骤。

12.一种存储介质,其特征在于,所述存储介质中存储有软件模块,所述软件模块在被处理器执行时实现如权利要求1-7任一项所述的野指针的函数栈信息确定方法的步骤。

说明书 :

一种野指针的函数栈信息确定方法、装置及电子设备

技术领域

[0001] 本发明涉及数据处理技术领域,具体涉及一种野指针的函数栈信息确定方法、装置及电子设备。

背景技术

[0002] 野指针是指向不可用内存区域的指针,应用在运行时若对野指针进行操作,将导致应用crash(崩溃);野指针导致应用(如IOS应用等)crash的原理主要为,应用的一个对象(对象为类的实例)被释放后,其对应的内存区域将成为不可用的内存区域,而其他对象在持有该对象的指针(即野指针)时,若继续使用该指针,将导致应用crash。为定位由野指针导致应用crash的问题代码,确定野指针所涉及的函数调用信息显得尤为必要。
[0003] 目前确定野指针所涉及的函数调用信息的方式主要为,重现由野指针导致的应用crash场景,从而通过辅助工具定位到野指针所涉及的函数调用信息;然而,重现由野指针导致的应用crash场景需要耗费极大的工作量,实现逻辑较为繁琐,且成功率无法保证;因此如何简便且准确的确定出野指针的函数调用信息,成为本领域技术人员需要考虑的问题。

发明内容

[0004] 有鉴于此,本发明实施例提供一种野指针的函数栈信息确定方法、装置及电子设备,以简便且准确的确定出野指针的函数调用信息。
[0005] 为实现上述目的,本发明实施例提供如下技术方案:
[0006] 一种野指针的函数栈信息确定方法,包括:
[0007] 钩子内存调用函数,以在调用内存调用函数时,确定内存调用函数的栈信息;
[0008] 确定内存调用函数指向的内存区域,记录所确定的内存区域及内存区域所对应的内存调用函数的栈信息;
[0009] 当由野指针导致应用崩溃时,确定野指针所指向的内存区域;
[0010] 从所记录的内存区域及内存区域所对应的内存调用函数的栈信息中,确定野指针所指向的内存区域的栈信息,得到野指针的函数栈信息。
[0011] 本发明实施例还提供一种野指针的函数栈信息确定装置,包括:
[0012] 钩子模块,用于钩子内存调用函数,以在调用内存调用函数时,确定内存调用函数的栈信息;
[0013] 确定并记录模块,用于确定内存调用函数指向的内存区域,记录所确定的内存区域及内存区域所对应的内存调用函数的栈信息;
[0014] 崩溃确定模块,用于确定由野指针导致应用崩溃;
[0015] 指向内存区域确定模块,用于当由野指针导致应用崩溃时,确定野指针所指向的内存区域;
[0016] 栈信息确定模块,用于从所记录的内存区域及内存区域所对应的内存调用函数的栈信息中,确定野指针所指向的内存区域的栈信息,得到野指针的函数栈信息。
[0017] 本发明实施例还提供一种电子设备,包括上述所述的野指针的函数栈信息确定装置。
[0018] 基于上述技术方案,本发明实施例提供的野指针的函数栈信息确定方法,可通过钩子(hook)内存调用函数,记录得到内存调用函数所操作的内存区域,及内存区域对应的内存调用函数的栈信息,从而在由野指针导致应用崩溃时,可通过野指针所指向的内存区域,从已记录的内存区域及内存区域所对应的内存调用函数的栈信息中,确定出野指针的函数栈信息;本发明实施例提供的野指针的函数栈信息的确定方法,涉及钩子的内存调用函数调用时的数据记录,野指针所指向的内存区域的确定,与在已记录数据中查找野指针的函数栈信息的操作,可在由野指针导致应用崩溃时,即确定出野指针的函数栈信息,不需重现由野指针导致的应用崩溃场景,极大简化了确定野指针的函数栈信息过程中所涉及的处理逻辑,使得野指针的函数栈信息的确定较为简便。

附图说明

[0019] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
[0020] 图1为本发明实施例提供的野指针的函数栈信息确定方法的流程图;
[0021] 图2为本发明实施例提供的野指针的函数栈信息确定方法的另一流程图;
[0022] 图3为本发明实施例提供的由野指针导致应用crash的确定方法流程图;
[0023] 图4为本发明实施例提供的由野指针导致应用crash的确定方法的另一流程图;
[0024] 图5为crash log的记录内容示意图;
[0025] 图6为本发明实施例提供的野指针的函数栈信息确定方法的再一流程图;
[0026] 图7为本发明实施例提供的野指针的函数栈信息确定装置的结构框图;
[0027] 图8为本发明实施例提供的钩子模块的结构框图;
[0028] 图9为本发明实施例提供的崩溃确定模块的结构框图;
[0029] 图10为本发明实施例提供的指向内存区域确定模块的结构框图;
[0030] 图11为本发明实施例提供的崩溃确定模块的另一结构框图;
[0031] 图12为本发明实施例提供的指向内存区域确定模块的另一结构框图;
[0032] 图13为本发明实施例提供的野指针的函数栈信息确定装置的另一结构框图;
[0033] 图14为本发明实施例提供的日志记录模块的结构框图;
[0034] 图15为本发明实施例提供的电子设备的硬件结构框图。

具体实施方式

[0035] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0036] 图1为本发明实施例提供的野指针的函数栈信息确定方法的流程图,该方法可应用于装载有应用的电子设备,如装载有IOS应用的电子设备,电子设备如手机、平板电脑等用户设备;参照图1,该方法可以包括:
[0037] 步骤S100、hook内存调用函数,以在调用内存调用函数时,确定内存调用函数的栈信息;
[0038] hook又称钩子技术,通过跳转或者修改函数表来实现在系统或第三方函数调用前执行到设定的函数;
[0039] 内存调用函数的栈信息(也称函数栈信息)表示的是函数被调用时的栈状态,通过函数栈信息可以回溯到函数的调用者(如回溯到函数的上一个乃至第一个调用者);可选的,本发明实施例在调用内存调用函数时,可通过hook技术,加入栈回溯指令,从而回溯到所调用的内存调用函数的栈信息;
[0040] 在本发明实施例中,野指针所涉及的函数调用信息,主要是指野指针所指向的内存区域的内存调用函数的栈信息(即野指针的函数栈信息),通过野指针的函数栈信息,可清楚的知道野指针所指向的内存区域的分配、释放所涉及的代码,从而便于问题代码的定位;
[0041] 应用运行过程中存在通过内存调用函数为对象分配、释放内存的操作;可选的,内存调用函数可以包括:为对象分配内存区域的内存分配函数,和/或,为对象释放内存区域的内存释放函数;相应的,内存调用函数的栈信息可以包括:为对象分配内存区域的栈信息,和/或,为对象释放内存区域的栈信息;
[0042] 本发明实施例可在每一个内存调用函数被调用执行时,通过hook内存调用函数,以在内存调用函数为对象释放或分配内存区域前,执行栈回溯指令,从而回溯到内存调用函数的栈信息,
[0043] 步骤S110、确定内存调用函数指向的内存区域,记录所确定的内存区域及内存区域所对应的内存调用函数的栈信息;
[0044] 内存区域所对应的内存调用函数的栈信息是指,操作该内存区域的内存调用函数的栈信息;如分配该内存区域的内存分配函数的栈信息,和释放该内存区域的内存释放函数的栈信息;
[0045] 步骤S100所回溯到的内存调用函数的栈信息将与内存调用函数当前对象释放或分配的内存区域相关联,从而记录到内存调用函数当前对象的内存区域,及内存调用函数对应的栈信息;
[0046] 可选的,内存区域可以为内存地址;
[0047] 通过步骤S100的操作,本发明实施例可记录到各内存区域在被释放或分配时,所对应的栈信息,记录得到内存区域被释放或分配时所涉及的函数(函数由栈信息反映)。
[0048] 步骤S120、当由野指针导致应用crash时,确定野指针所指向的内存区域;
[0049] 当应用crash时,本发明实施例可通过分析应用crash时的顶层函数,或异常关键字确定是否由野指针导致的应用crash;如果应用crash时的顶层函数与预置函数对应,或,应用crash时的异常关键字与预置关键字对应,则可确定是由野指针导致的应用crash;
[0050] 其中,预置函数可以是预先分析出的由野指针导致应用crash时的顶层函数,预置关键字可以是预先分析出的由野指针导致应用crash时的异常关键字;
[0051] 若是应用crash时的顶层函数与预置函数对应,则本发明实施例可在应用crash时,从所述顶层函数所对应的寄存器中获取野指针所指向的内存区域;顶层函数对应的寄存器可以认为是存放顶层函数执行数据和结果数据的寄存器;
[0052] 若是应用crash时的异常关键字与预置关键字对应,则本发明实施例可从所述异常关键字中解析出野指针所指向的内存区域。
[0053] 步骤S130、从所记录的内存区域及内存区域所对应的内存调用函数的栈信息中,确定野指针所指向的内存区域的栈信息,得到野指针的函数栈信息。
[0054] 本发明实施例提供的野指针的函数栈信息确定方法,包括:hook内存调用函数,以在调用内存调用函数时,确定内存调用函数的栈信息,同时确定内存调用函数指向的内存区域,记录所确定的内存区域及内存区域所对应的内存调用函数的栈信息;当由野指针导致应用crash时,本发明实施例可确定野指针所指向的内存区域,进而从所记录的内存区域及内存区域所对应的内存调用函数的栈信息中,确定野指针所指向的内存区域的栈信息,得到野指针的函数栈信息,从而确定出野指针所指向的内存区域的函数调用信息,为定位由野指针导致应用crash的问题代码提供了可能。
[0055] 可以看出,本发明实施例提供的野指针的函数栈信息确定方法,可通过hook内存调用函数,记录得到内存调用函数所操作的内存区域,及内存区域对应的内存调用函数的栈信息,从而在由野指针导致应用crash时,可通过野指针所指向的内存区域,从已记录的内存区域及内存区域所对应的内存调用函数的栈信息中,确定出野指针的函数栈信息;本发明实施例提供的野指针的函数栈信息的确定方法,涉及hook的内存调用函数调用时的数据记录,野指针所指向的内存区域的确定,与在已记录数据中查找野指针的函数栈信息的操作,可在由野指针导致应用crash时,即确定出野指针的函数栈信息,不需重现由野指针导致的应用crash场景,极大简化了确定野指针的函数栈信息过程中所涉及的处理逻辑,使得野指针的函数栈信息的确定较为简便。
[0056] 可选的,内存调用函数主要是针对应用程序的对象进行内存区域的分配和释放操作,而在调用一个类的函数时(如内存调用函数),最终都会调用到该类的父类的函数;因此本发明实施例在hook内存调用函数,以确定内存调用函数的栈信息时,可hook父类对象的内存调用函数,如hook父类对象的内存分配函数和内存释放函数,以在每一次调用内存分配函数时,可确定出内存分配函数的栈信息,在每一次调用内存释放函数时,可确定出内存释放函数的栈信息;
[0057] 以IOS应用为例,object-C的类都有一个自己的父类,而NSObject就是最终的父类(NSObject类是object-C中每一个对象的父类);如在调用object-C类的构造函数时,最终都要调用到NSObject类的构造函数;同样的object-C类的释放函数的调用,也会涉及到NSObject类的释放函数的调用;
[0058] 因此在IOS应用中,本发明实施例可hook NSObject对象的内存分配函数(alloc函数),和hook NSObject对象的内存释放函数(dealloc函数),从而在每一次alloc函数调用时,通过栈回溯操作,确定出alloc函数的栈信息,在每一次dealloc函数调用时,通过栈回溯操作,确定出dealloc函数的栈信息。
[0059] 可选的,内存调用函数可以包括内存分配函数和内存释放函数,本发明实施例可hook内存分配函数,确定出内存分配函数的栈信息,hook内存释放函数,确定出内存释放函数的栈信息;相应的,所确定的野指针的函数栈信息可以为野指针所指向的内存区域的内存分配函数的栈信息,和内存释放函数的栈信息;
[0060] 基于此,图2示出了本发明实施例提供的野指针的函数栈信息确定方法的另一流程图,参照图2,该方法可以包括:
[0061] 步骤S200、hook内存分配函数,以在调用内存分配函数时,确定内存分配函数的栈信息;及hook内存释放函数,以在调用内存释放函数时,确定内存释放函数的栈信息;
[0062] 通过内存分配函数的栈信息可以确定出,内存分配函数所操作的内存区域所涉及的关联函数;通过内存释放函数的栈信息可以确定出,内存释放函数所操作的内存区域所涉及的关联函数;
[0063] 步骤S210、确定内存分配函数和内存释放函数指向的内存区域,记录内存区域及对应的内存分配函数的栈信息,和内存释放函数的栈信息;
[0064] 可选的,本发明实施例可设置全局表,以通过全局表记录内存区域及对应的内存分配函数的栈信息,和内存释放函数的栈信息。
[0065] 步骤S220、当由野指针导致应用crash时,确定野指针所指向的内存区域;
[0066] 步骤S230、从所记录的内存区域对应的内存分配函数的栈信息,和内存释放函数的栈信息中,确定野指针所指向的内存区域的内存分配函数的栈信息,和内存释放函数的栈信息。
[0067] 可选的,图3示出了本发明实施例提供的由野指针导致应用crash的确定方法流程图,参照图3,该方法可以包括:
[0068] 步骤S300、当应用crash时,分析应用crash时的顶层函数是否与预置函数对应;
[0069] 步骤S310、若确定应用crash时的顶层函数与预置函数对应,则确定是由野指针导致的应用crash。
[0070] 预置函数可以是预先分析出的由野指针导致应用crash时的顶层函数;以IOS应用为例,在一种实现方式中,如果应用crash时,顶层函数为objc_msgSend,则确定是由野指针导致的应用crash;在另一种实现方式中,如果应用crash时,顶层函数为objc_release,则确定是由野指针导致的应用crash;顶层函数objc_msgSend,和objc_release为预置函数的可选形式。
[0071] 可选的,本发明实施例还可通过分析应用crash时的异常关键字来判断是否由野指针导致的应用crash;图4示出了本发明实施例提供的由野指针导致应用crash的确定方法的另一流程图,参照图4,该方法可以包括:
[0072] 步骤S400、当应用crash时,分析应用crash时的异常关键字是否与预置关键字对应;
[0073] 步骤S410、若确定应用crash时的异常关键字与预置关键字对应,则确定是由野指针导致的应用crash。
[0074] 预置关键字可以是预先分析出的由野指针导致应用crash时的异常关键字;以IOS应用为例,异常关键字可以为unrecognized selector sent to instance(未被选择器发送到实例),如果应用crash时,异常关键字为unrecognized selector sent to instance,则可确定是由野指针导致的应用crash。
[0075] 可选的,在由野指针导致的应用crash时,若顶层函数与预置函数对应,本发明实施例可通过顶层函数对应的寄存器提取出野指针所指向的内存区域;
[0076] 具体的,本发明实施例可在应用crash时,从与预置函数对应的顶层函数所对应的寄存器中识别到与预置函数相应的数据,从而从识别到的数据中提取到字符特征与野指针所指向的内存区域相应的数据,所提取的数据可视为野指针所指向的内存区域;
[0077] 以IOS应用为例,应用crash时,如果顶层函数为objc_msgSend,则可从顶层函数对应的寄存器(如寄存器RO)中提取野指针所指向的内存区域的数据,以实现野指针所指向的内存区域的确定;应用crash时,如果顶层函数为objc_release,则可从顶层函数对应的寄存器(如寄存器R0)中提取野指针所指向的内存区域的数据,以实现野指针所指向的内存区域的确定;
[0078] 可选的,在由野指针导致的应用crash时,若异常关键字与预置关键字对应,则本发明实施例可从所述异常关键字中解析出野指针所指向的内存区域;
[0079] 在IOS应用场景下,应用crash时,如果异常关键字为unrecognized selector sent to instance 0x1222c0,则本发明实施例可解析该异常关键字,从该异常关键字中提取出携带的内存区域数据(0x1222c0),从而确定出野指针所指向的内存区域;值得注意的是,此处的内存区域0x1222c0仅为用于示例说明的可选形式。
[0080] 可选的,由于应用的crash log(崩溃日志)记录了应用运行过程中的所有栈信息,通过crash log可明确的知道应用crash时的工作代码情况,因此一般的应用crash通过crash log即可定位到应用crash的问题代码;然而,由野指针导致应用crash时,野指针的释放不一定发生在应用crash的同一时刻,因此目前无法通过crash log定位到由野指针导致应用crash的问题代码;
[0081] 基于crash log为定位应用crash的问题代码的常用文件,本发明实施例可将所确定的野指针的函数栈信息记录到crash log中,以使得工作人员在由野指针导致应用crash时,可通过记录有野指针的函数栈信息的crash log,定位到野指针指向的内存区域的分配和释放代码,以便于分析出由野指针导致应用crash的问题代码;
[0082] 可选的,图5示出了crash log的记录内容,如图5所示,crash log中每个线程都有一个调用栈,图5中最上面的Thread23是线程序号,Thread23下面是调用栈;本发明实施例可将所确定的野指针的函数栈信息当作一个线程,在野指针的函数栈信息的线程下记录具体的野指针所指向内存区域的内存分配函数的栈信息,和内存释放函数的栈信息,并插入在crash log的设定位置(如crash log文件的末尾);通过这样的设置,则可通过crash log将野指针的函数栈信息当作线程来解析,以与目前的crash log解析逻辑一致,不需在野指针的函数栈信息的解析上作额外的工作;
[0083] 可选的,插入在crash log中的野指针的函数栈信息的线程,可以设定名字命名(如命名为mallochistor xx),以便于从crash log中查找到野指针的函数栈信息;
[0084] 具体的,在将野指针的函数栈信息记录在crash文件中时,本发明实施例可在crash log中将野指针的函数栈信息作为线程,以设定名字命名所述线程,在所述线程下记录野指针所指向内存区域的内存分配函数的栈信息,和内存释放函数的栈信息。
[0085] 优选的,图6示出了本发明实施例提供的野指针的函数栈信息确定方法的再一流程图,参照图6,该方法可以包括:
[0086] 步骤S500、hook NSObject对象的内存分配函数,和hookNSObject对象的内存释放函数,以在调用内存分配函数时,通过栈回溯操作,确定出内存分配函数的栈信息,在调用内存释放函数时,通过栈回溯操作,确定出内存释放函数的栈信息;
[0087] 步骤S510、确定内存分配函数和内存释放函数指向的内存区域,在全局表中记录内存区域及内存区域对应的内存分配函数的栈信息,和内存释放函数的栈信息;
[0088] 内存区域对应的内存分配函数的栈信息,和内存释放函数的栈信息,是指,操作该内存区域的内存分配函数的栈信息和内存释放函数的栈信息。
[0089] 步骤S520、当应用crash时,如果顶层函数为objc_msgSend,则确定是由野指针导致的应用crash,从顶层函数对应的寄存器中提取野指针所指向的内存区域;
[0090] 可选的,步骤S520可采用下述方式替换:当应用crash时,如果顶层函数为objc_release,则确定是由野指针导致的应用crash,从顶层函数对应的寄存器中提取野指针所指向的内存区域;
[0091] 步骤S520也可采用下述方式替换:当应用crash时,如果异常关键字为unrecognized selector sent to instance,则确定是由野指针导致的应用crash,从异常关键字中提取野指针所指向的内存区域;
[0092] 步骤S530、从全局表所记录的记录内存区域及对应的内存分配函数的栈信息,和内存释放函数的栈信息中,确定野指针所指向的内存区域的内存分配函数的栈信息,和内存释放函数的栈信息;
[0093] 其中,所确定的野指针所指向的内存区域的内存分配函数的栈信息,和内存释放函数的栈信息,即为野指针的函数栈信息。
[0094] 步骤S540、在crash log中将野指针的函数栈信息作为线程,以设定名字命名所述线程,在所述线程下记录野指针所指向内存区域的内存分配函数的栈信息,和内存释放函数的栈信息,以将野指针的函数栈信息记录在crash log中,以便通过记录有野指针的函数栈信息的crash log定位由野指针导致应用crash的问题代码。
[0095] 本发明实施例提供的野指针的函数栈信息的确定方法,处理逻辑大幅简化,使得野指针的函数栈信息的确定较为简便。
[0096] 下面对本发明实施例提供的野指针的函数栈信息确定装置进行介绍,下文描述的野指针的函数栈信息确定装置可与上文描述的野指针的函数栈信息确定方法相互对应参照。
[0097] 图7为本发明实施例提供的野指针的函数栈信息确定装置的结构框图,该装置可应用于装载有应用的电子设备中,参照图7,该装置可以包括:
[0098] 钩子模块100,用于hook内存调用函数,以在调用内存调用函数时,确定内存调用函数的栈信息;
[0099] 确定并记录模块200,用于确定内存调用函数指向的内存区域,记录所确定的内存区域及内存区域所对应的内存调用函数的栈信息;
[0100] 崩溃确定模块300,用于确定由野指针导致应用crash;
[0101] 指向内存区域确定模块400,用于当由野指针导致应用crash时,确定野指针所指向的内存区域;
[0102] 栈信息确定模块500,用于从所记录的内存区域及内存区域所对应的内存调用函数的栈信息中,确定野指针所指向的内存区域的栈信息,得到野指针的函数栈信息。
[0103] 可选的,钩子模块100可通过hook父类对象的内存调用函数,以实现hook内存调用函数;
[0104] 可选的,图8示出了本发明实施例提供的钩子模块100的一种可选结构,参照图8,钩子模块100可以包括:
[0105] 第一钩子单元110,用于hook内存分配函数,以在调用内存分配函数时,确定内存分配函数的栈信息;
[0106] 第二钩子单元120,用于hook内存释放函数,以在调用内存释放函数时,确定内存释放函数的栈信息;
[0107] 对应的,栈信息确定模块400所确定的野指针所指向的内存区域的栈信息可以包括:野指针所指向的内存区域的内存分配函数的栈信息,和内存释放函数的栈信息。
[0108] 可选的,图9示出了崩溃确定模块300的一种可选结构,参照图9,崩溃确定模块300可以包括:
[0109] 第一崩溃确定单元310,用于当应用crash时,分析应用crash时的顶层函数是否与预置函数对应,若确定应用crash时的顶层函数与预置函数对应,则确定是由野指针导致的应用crash;
[0110] 对应的,图10示出了指向内存区域确定模块400的一种可选结构,参照图10,指向内存区域确定模块400可以包括:
[0111] 第一指向内存区域确定单元410,用于在由野指针导致的应用crash时,若顶层函数与预置函数对应,则从顶层函数对应的寄存器中提取出野指针所指向的内存区域。
[0112] 可选的,图11示出了本发明实施例提供的崩溃确定模块300的另一种可选结构,参照图11,崩溃确定模块300可以包括:
[0113] 第二崩溃确定单元320,用于当应用crash时,分析应用crash时的异常关键字是否与预置关键字对应,若确定应用crash时的异常关键字与预置关键字对应,则确定是由野指针导致的应用crash;
[0114] 对应的,图12示出了本发明实施例提供的指向内存区域确定模块400的另一种可选结构,参照图12,指向内存区域确定模块400可以包括:
[0115] 第二指向内存区域确定单元420,用于在由野指针导致的应用crash时,若异常关键字与预置关键字对应,则从所述异常关键字中解析出野指针所指向的内存区域。
[0116] 可选的,图13示出了本发明实施例提供的野指针的函数栈信息确定装置的另一结构框图,结合图7和图13所示,该装置还可以包括:
[0117] 日志记录模块600,用于将得到的野指针的函数栈信息记录到crash log中。
[0118] 可选的,图14示出了本发明实施例提供的日志记录模块600的一种可选结构,参照图14,日志记录模块600可以包括:
[0119] 记录执行单元610,用于在crash log中将野指针的函数栈信息作为线程,以设定名字命名所述线程,在所述线程下记录野指针所指向内存区域的内存分配函数的栈信息,和内存释放函数的栈信息。
[0120] 本发明实施例还提供一种电子设备,该电子设备可以包括上述所述的确定野指针的函数栈信息的装置;采用本发明实施例提供的电子设备进行野指针的函数栈信息的确定,可实现处理逻辑大幅简化,且较为简便的野指针的函数栈信息的确定。
[0121] 本发明实施例提供的电子设备可以如手机、平板电脑、笔记本电脑等用户设备;图15示出了本发明实施例提供的电子设备的硬件结构框图,参照图15,该电子设备可以包括:
处理器1,通信接口2,存储器3和通信总线4;
[0122] 其中处理器1、通信接口2、存储器3通过通信总线4完成相互间的通信;
[0123] 可选的,通信接口2可以为通信模块的接口,如GSM模块的接口;
[0124] 处理器1,用于执行程序;
[0125] 存储器3,用于存放程序;
[0126] 程序可以包括程序代码,所述程序代码包括计算机操作指令。
[0127] 处理器1可能是一个中央处理器CPU,或者是特定集成电路ASIC(Application Specific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路。
[0128] 存储器3可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。
[0129] 其中,程序可具体用于:
[0130] 钩子内存调用函数,以在调用内存调用函数时,确定内存调用函数的栈信息;
[0131] 确定内存调用函数指向的内存区域,记录所确定的内存区域及内存区域所对应的内存调用函数的栈信息;
[0132] 当由野指针导致应用崩溃时,确定野指针所指向的内存区域;
[0133] 从所记录的内存区域及内存区域所对应的内存调用函数的栈信息中,确定野指针所指向的内存区域的栈信息,得到野指针的函数栈信息。
[0134] 本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
[0135] 专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
[0136] 结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
[0137] 对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。