掌桥专利:专业的专利平台
掌桥专利
首页

内存池内存错误分析识别方法、电子设备及存储介质

文献发布时间:2024-04-18 19:58:53


内存池内存错误分析识别方法、电子设备及存储介质

技术领域

本发明涉及计算机信息技术中内存管理相关技术领域,具体地说是一种内存池内存错误分析识别方法、电子设备及存储介质。

背景技术

内存池是一种动态内存分配与管理技术,通常情况下,程序员习惯直接使用new,delete,malloc,free等API申请和释放内存,这样导致的后果就是:当程序运行的时间很长时,由于所申请的内存块的大小不定,频繁使用时会造成大量的内存碎片从而降低程序和操作系统的性能。

内存泄漏是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存越界是指程序中已动态分配的堆内存由于某种原因程序访问了非申请内存区域外的其他内存区域,导致程序错误系统崩溃等严重后果。

重复释放是指程序中已动态分配的堆内存释放后再次进行释放时会出现找不到要释放对象的错误。

悬空指针是指指针指向的内存已经被释放,但程序还在对已释放的内存进行访问,由此而产生的错误称为悬空指针。

当前主流的内存池实现对于内存错误的分析与识别功能与性能都有所欠缺,有的识别的内存错误种类较少,有的识别的精确度不高,还有的识别到的时机较晚。

故如何针对可能出现的内存错误进行分析与识别,并将识别到的错误返回给用户,提升系统的稳定性是目前亟待解决的技术问题。

发明内容

本发明的技术任务是提供一种内存池内存错误分析识别方法、电子设备及存储介质,来解决如何针对可能出现的内存错误进行分析与识别,并将识别到的错误返回给用户,提升系统的稳定性的问题。

本发明的技术任务是按以下方式实现的,一种内存池内存错误分析识别方法,该方法是采用内存Red Zone(内存禁区,即不允许用户读写的内存区域)与LLVM代码插桩技术,通过LLVM代码插桩技术实现动态、实时对内存越界的检测,进而实现快速检测及识别重复释放错误、内存泄漏错误、内存越界错误及悬空指针错误;具体如下:

为每块内存前面和后面额外增加一块Red Zone内存区域;

每块内存的头部Red Zone内存区域增加两部分内存信息:内存头部相关信息(Header Information)及内存头部标识区域(Header Tag);

在每块内存的尾部Red Zone内存区域增加内存的尾部标识(Tail Tag)。

作为优选,内存头部相关信息包括申请的内存大小及申请内存的程序调用栈信息;

更优地,内存头部标识区域选择特定的数值进行标记内存已分配状态;其中,特定的数值没有具体要求,只要事先确定好即可,不过建议选择不常出现的数据为好,比如0xA7A700000000A7A7,0x8C8C000092920000,0x3D3D65650000B1B1等等。

内存的尾部标识选择特定的数值进行标记对应区域为内存尾部;其中,特定的数值没有具体要求,只要事先确定好即可,不过建议选择不常出现的数据为好,比如0xA7A700000000A7A7,0x8C8C000092920000,0x3D3D65650000B1B1等等。

更优地,识别重复释放错误具体如下:

通过在释放内存时,检查待释放内存的内存头部标识区域(Header Tag)中是否为内存分配状态:

若是内存分配状态,则正常;

若不是内存分配状态,则识别为重复释放错误。

更优地,识别内存越界错误具体如下:

通过内存的尾部标识(Tail Tag)进行检测:

若内存的尾部标识被改写成非预定义值,则必定发生内存越界;

若内存越界的范围不在内存的尾部标识(Tail Tag)区域,当发生内存越界错误时,则会出现漏检测的现象,此时通过引入LLVM代码插桩技术进行内存越界识别;

其中,内存越界的范围不在内存的尾部标识(Tail Tag)区域包括如下情况:

①内存的内存头部标识区域(Header Tag)前面;

②内存的尾部标识(Tail Tag)区域后面无法被识别。

更优地,通过引入LLVM代码插桩技术进行内存越界识别具体如下:

通过添加自定义的pass识别越界的发生,在pass中遍历所有函数(Function)、遍历所有函数的代码块(Basic Block)及遍历所有代码块的指令(Instruction),在所有指令中识别所有加载(load)与存储(store)指令,加载(load)与存储(store)指令对内存读、写的地方增加检测所访问的区域是否为申请的内存区域:

若不是,则识别为内存越界。

其中,pass是LLVM编译器开发的结构化技术,用于完成编译对象(如IR)的转换、分析或优化等功能,这里就是自定义实现一个对IR侧重在分析方面的pass,以此来识别越界的发生。

更优地,识别悬空指针错误具体如下:

通过内存越界中LLVM代码插桩技术的检测的方式在读写访问内存时检测内存头部标识区域(Header Tag)是否为分配状态识别悬空指针错误。

更优地,识别内存泄漏错误具体如下:

在程序退出时进行检测:

若程序退出后还有内存是未释放状态,则识别为内存泄漏,通过内存头部相关信息(Header Information)中记录的调用栈信息确定是哪块代码中发生的内存泄漏。

一种电子设备,包括:存储器和至少一个处理器;

其中,所述存储器上存储有计算机程序;

所述至少一个处理器执行所述存储器存储的计算机程序,使得所述至少一个处理器执行如上述的内存池内存错误分析识别方法。

一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,所述计算机程序可被处理器执行以实现如上述的内存池内存错误分析识别方法。

LLVM是一个现代化、可扩展的编译器。编译器通常可以分为三个模块:前端,进行词法分析、语法分析、语义分析、生成中间表示;优化器,中间表示优化,比如去除无用的变量或者无用的计算,来提高代码运行效率;后端,生成目标机器码。LLVM的优化器是由很多pass组成的流水线(pipeline),pass用于完成对IR的转换、分析或优化。在优化时,pass被实例化,并被添加到pass管理器中。pass管理器以流水线的方式将各个独立的pass衔接起来,然后以预定义顺序遍历每个pass,根据pass实例返回值启动、停止或重复运行不同pass。在每个pass对相应的IR对象进行遍历处理时,可以进行编译时代码插桩操作。LLVM框架允许用户编写自己的LLVM Pass,其在llvm/IR目录下提供了许多的头文件,如llvm/IR/Instructions.h等,可以使用其中的Value,Function,ReturnInst等丰富的类来获取程序运行信息并在中间语言(LLVM IR)级别进行精确而细粒度的程序插桩。用户自定义的pass可以注册到已有的默认的流水线中,也可以独立加载运行。

LLVM编译器框架的核心概念是任务调度和执行。编译器开发者将IR分解为不同的处理对象,并将其处理过程实现为单独的pass类型。pass是一种编译器开发的结构化技术,用于完成编译对象(如IR)的转换、分析或优化等功能。pass的执行就是编译器对编译对象进行转换、分析和优化的过程,pass构建了这些过程所需要的分析结果。在编译器初始化时,pass被实例化,并被添加到pass管理器中。pass管理器以流水线的方式将各个独立的pass衔接起来,然后以预定义顺序遍历每个pass,根据pass实例返回值启动、停止或重复运行不同pass。

本发明的内存池内存错误分析识别方法、电子设备及存储介质具有以下优点:

(一)本发明采用内存Red Zone(内存禁区,即不允许写入的内存区域)与LLVM代码插桩的的技术,Red Zone中头部包含Header Information与Header Tag分别记录内存信息与内存的malloc(已经被分配的内存)标识,Red Zone中尾部包含Tail Tag记录内存尾部的标识,通过LLVM代码插桩技术实现了动态、实时对内存越界的检测;本发明可快速检测、识别重复释放、内存泄漏、内存越界、悬空指针四类内存错误;

(二)本发明的内存错误检测的方式检测的错误类型更多;

(三)本发明内存错误检测的方式识别内存错误的精确度更高;

(四)本发明的内存池中针对可能出现的内存错误进行分析与识别,将识别到的错误返回给用户,提升系统的稳定性,内存错误的识别类型包含:重复释放、内存泄漏、内存越界、悬空指针,针对这四类错误类型进行逐一描述识别的机制。

附图说明

下面结合附图对本发明进一步说明。

附图1为内存池内存错误分析识别方法的流程框图;

附图2为内存结构Red Zone的示意图;

附图3为内存结构Red Zone详细示意图。

具体实施方式

参照说明书附图和具体实施例对本发明的内存池内存错误分析识别方法、电子设备及存储介质作以下详细地说明。

实施例1:每块内存的头部Red Zone内存区域增加两部分内存信息:内存头部相关信息及内存头部标识区域

本实施例提供了一种内存池内存错误分析识别方法,该方法是采用内存Red Zone(内存禁区,即不允许用户读写的内存区域)与LLVM代码插桩技术,通过LLVM代码插桩技术实现动态、实时对内存越界的检测,进而实现快速检测及识别重复释放错误、内存泄漏错误、内存越界错误及悬空指针错误;具体如下:

S1、为每块内存前面和后面额外增加一块Red Zone内存区域;

S2、每块内存的头部Red Zone内存区域增加两部分内存信息:内存头部相关信息(Header Information)及内存头部标识区域(Header Tag);

S3、在每块内存的尾部Red Zone内存区域增加内存的尾部标识(Tail Tag)。

本实施例步骤S2中的内存头部相关信息包括申请的内存大小及申请内存的程序调用栈信息;

本实施例中的内存头部标识区域选择特定的数值进行标记内存已分配状态;其中,特定的数值没有具体要求,只要事先确定好即可,不过建议选择不常出现的数据为好,比如0xA7A700000000A7A7,0x8C8C000092920000,0x3D3D65650000B1B1等等。

内存的尾部标识选择特定的数值进行标记对应区域为内存尾部;其中,特定的数值没有具体要求,只要事先确定好即可,不过建议选择不常出现的数据为好,比如0xA7A700000000A7A7,0x8C8C000092920000,0x3D3D65650000B1B1等等。

本实施例中的识别重复释放错误具体如下:

通过在释放内存时,检查待释放内存的内存头部标识区域(Header Tag)中是否为内存分配状态:

若是内存分配状态,则正常;

若不是内存分配状态,则识别为重复释放错误。

本实施例中的识别内存越界错误具体如下:

通过内存的尾部标识(Tail Tag)进行检测:

若内存的尾部标识被改写成非预定义值,则必定发生内存越界;

若内存越界的范围不在内存的尾部标识(Tail Tag)区域,当发生内存越界错误时,则会出现漏检测的现象,此时通过引入LLVM代码插桩技术进行内存越界识别;

其中,内存越界的范围不在内存的尾部标识(Tail Tag)区域包括如下情况:

①内存的内存头部标识区域(Header Tag)前面;

②内存的尾部标识(Tail Tag)区域后面无法被识别。

本实施例中,通过引入LLVM代码插桩技术进行内存越界识别具体如下:

通过添加自定义的pass识别越界的发生,在pass中遍历所有函数(Function)、遍历所有函数的代码块(Basic Block)及遍历所有代码块的指令(Instruction),在所有指令中识别所有加载(load)与存储(store)指令,加载(load)与存储(store)指令对内存读、写的地方增加检测所访问的区域是否为申请的内存区域:

若不是,则识别为内存越界。

其中,pass是LLVM编译器开发的结构化技术,用于完成编译对象(如IR)的转换、分析或优化等功能,这里就是自定义实现一个对IR侧重在分析方面的pass,以此来识别越界的发生。

本实施例中的识别悬空指针错误具体如下:

通过内存越界中LLVM代码插桩技术的检测的方式在读写访问内存时检测内存头部标识区域(Header Tag)是否为分配状态识别悬空指针错误。

本实施例中的识别内存泄漏错误具体如下:

在程序退出时进行检测:

若程序退出后还有内存是未释放状态,则识别为内存泄漏,通过内存头部相关信息(Header Information)中记录的调用栈信息确定是哪块代码中发生的内存泄漏。

实施例2:

本发明实施例还提供了一种电子设备,包括:存储器和处理器;

其中,存储器存储计算机执行指令;

处理器执行所述存储器存储的计算机执行指令,使得处理器执行本发明任一实施例中的内存池内存错误分析识别方法。

处理器可以是中央处理单元(CPU),还可以是其他通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通过处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

存储器可用于储存计算机程序和/或模块,处理器通过运行或执行存储在存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现电子设备的各种功能。存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器还可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,只能存储卡(SMC),安全数字(SD)卡,闪存卡、至少一个磁盘存储期间、闪存器件、或其他易失性固态存储器件。

实施例3:

本发明实施例还提供了一种计算机可读存储介质,其中存储有多条指令,指令由处理器加载,使处理器执行本发明任一实施例中的内存池内存错误分析识别方法。具体地,可以提供配有存储介质的系统或者装置,在该存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机(或CPU或MPU)读出并执行存储在存储介质中的程序代码。

在这种情况下,从存储介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此程序代码和存储程序代码的存储介质构成了本发明的一部分。

用于提供程序代码的存储介质实施例包括软盘、硬盘、磁光盘、光盘(如CD-ROM、CD-R、CD-RW、DVD-ROM、DVD-RYM、DVD-RW、DVD+RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上下载程序代码。

此外,应该清楚的是,不仅可以通过执行计算机所读出的程序代码,而且可以通过基于程序代码的指令使计算机上操作的操作系统等来完成部分或者全部的实际操作,从而实现上述实施例中任意一项实施例的功能。

此外,可以理解的是,将由存储介质读出的程序代码写到插入计算机内的扩展板中所设置的存储器中或者写到与计算机相连接的扩展单元中设置的存储器中,随后基于程序代码的指令使安装在扩展板或者扩展单元上的CPU等来执行部分和全部实际操作,从而实现上述实施例中任一实施例的功能。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

相关技术
  • 内存装配位置校验方法及装置、存储介质及电子设备
  • 一种内存池的管理方法、装置、设备及可读存储介质
  • 一种内存优化的数据文件格式转化方法、装置及存储介质
  • 内存优化方法、装置、计算机装置以及存储介质
  • 一种内存共享方法、容器管理平台及计算机可读存储介质
  • 共享内存池的分页设备管理方法、电子设备及存储介质
  • 共享内存池的分页设备管理方法、电子设备及存储介质
技术分类

06120116506187