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

一种检测VPP内存泄露的系统、方法、存储介质及设备

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


一种检测VPP内存泄露的系统、方法、存储介质及设备

技术领域

本发明属于通信技术领域,具体涉及一种检测VPP内存泄露的系统、方法、存储介质及设备。

背景技术

VPP是一种报文高性能转发框架,是由Cisco提供的一种高性能转发框架的开源版本。其内存管理的方案是先申请一大片堆空间,后续使用内存都是从该堆空间中分配,使用的是一套独立的内存管理系统,与原生linux的内存管理机制不同,由此导致,在VPP开发过程中,内存泄露问题极易出现,且没有有效的定位手段。

在基于VPP框架的转发设备开发过程中,由于VPP的内存管理机制与Linux标准的malloc/free机制不同,对于出现了内存泄露或者内存重复释放的情况,当前没有很好的方案进行定位,且由于VPP中使用了大量的宏对内存操作的相关接口进行了多次封装,无法使用gdb或者perf等当前通用的一些内存泄露定位工具进行定位。VPP的内存泄露问题定位有如下两个比较大的问题:

① 缺乏定位VPP框架内存泄露的手段,除了大批量测试行为可能暴露一些内存泄露问题外,基本没有别的手段可以发现VPP框架编码过程中出现的内存泄露。

② 无法有效定位内存泄露的位置,由于VPP框架中使用了大量的宏提供了一套通用数据类型的处理接口,导致多次封装后,内存操作接口的位置也无法确定,即使发现了编码过程中出现了内存泄露问题,也无法快速有效的确定内存泄露位置。

申请号为CN201610825597.2的现有专利公开了一种内存泄露定位方法及电子设备,当内存单元通过申请接口函数被申请时,保存内存单元与函数调用栈的标识的映射关系,函数调用栈保存有通过申请接口函数申请内存单元的函数调用关系,内存单元包括块内存或页面内存;当内存单元通过释放接口函数被释放时,清除内存单元与内存单元对应的函数调用栈的标识的映射关系;根据多次统计的与每个函数调用栈的标识存在映射关系的内存单元的内存大小,确定存在内存泄露的函数调用栈和函数。本发明实施例用于内存泄露定位。

然而,该现有技术是通过重写Linux原生的内存操作接口,对内存操作接口申请或者释放时,在内存块内写入自定义信息,通过自定义信息查看对应内存是否存在内存泄露问题,或者使用Hook技术,在内存操作接口的入口执行自定义代码,记录或修改内存操作的信息。这些技术只能实现对Linux原生内存管理机制的内存泄露问题定位,对于使用了特有内存操作接口、独立内存管理机制的VPP框架而言,均无法使用,无法感知到内存使用情况。

发明内容

本发明的目的在于提供一种检测VPP内存泄露的系统、方法、存储介质及设备,旨在解决上述的问题,通过记录VPP从堆空间中获取可用内存及将内存释放的行为,对操作内存的行为进行分析,从而获取到出现内存泄露的位置以及泄露的内存大小。

本发明主要通过以下技术方案实现:

一种检测VPP内存泄露的系统,包括依次设置的内存泄露检查模块、归并模块、内存泄露分析模块,所述内存泄露检查模块包括第一级检查模块、第二级检查模块、第三级检查模块;所述第一级检查模块用于获取包括数据类型、函数堆栈、操作位置、内存操作地址的内存操作的外层信息,所述第二级检查模块用于获取高级数据结构的内嵌基础结构的包括内存操作行为及内存操作地址的分解信息,所述第三级检查模块用于获取包括堆空间主地址、内存操作类型、内存操作地址的内存操作核心信息;所述归并模块分别与第一级检查模块、第二级检查模块、第三级检查模块连接,且用于加载所有的内存操作记录信息,将同一次内存操作的信息合并为一条详细信息,最终输出内存操作详细信息至内存泄露分析模块;所述内存泄露分析模块用于处理得到内存泄露操作方式、堆空间主地址的信息,以解决内存泄露问题。

为了更好地实现本发明,进一步地,所述第一级检查模块嵌入设置在VPP框架代码主循环的通用数据类型的内存操作接口;所述第二级检查模块嵌入设置在VPP框架高级数据结构的申请或释放接口;所述第三级检查模块嵌入设置在VPP框架堆空间内的内存操作接口。

本发明主要通过以下技术方案实现:

一种检测VPP内存泄露的方法,采用上述的系统进行,包括以下步骤:

步骤S1:通过第一级检查模块检测并获取包括数据类型、函数堆栈、操作位置、内存操作地址的内存操作的外层信息;

步骤S2:通过第二级检查模块检测并获取高级数据结构的内嵌基础结构的分解信息,所述分解信息包括各基础结构的内存操作行为及内存操作地址的信息;

步骤S3:通过第三级检查模块检测并获取包括堆空间主地址、内存操作类型、内存操作地址的内存操作核心信息;

步骤S4:运行代码主循环,第一级检查模块、第二级检查模块、第三级检查模块分别输出各自的内存操作记录信息;

步骤S5:通过归并模块加载内存泄露检查模块的所有内存操作记录信息,并将第一级检查模块、第二级检查模块、第三级检查模块中同一次内存操作的信息合并为一条详细信息,最后输出内存操作详细信息;

步骤S6:将内存操作详细信息导入内存泄露分析模块,获取所有的内存操作地址及操作行为,分析得出内存泄露的信息,并输出内存泄露的操作地址、函数堆栈的信息。

为了更好地实现本发明,进一步地,所述步骤S6包括以下步骤:

步骤S601:将具有相同内存大小、相同内存操作地址,且同时具有申请操作行为和释放操作行为的两条信息,认为是一组完整的内存操作行为,记录这一组信息到合法内存操作信息缓存表中,并从内存操作详细信息中移除数据且不进行输出;

步骤S602:提取步骤S601处理后遗留操作行为为申请的信息,对无第二级检查模块输出信息的信息,直接输出为内存泄露行为信息;

步骤S603:提取步骤S602处理后遗留操作行为为申请的信息,对有第二级检查模块输出信息的信息,对于高级数据结构中有内嵌基础结构内存泄露信息的,构建高级数据结构的内嵌基础结构的树形内存泄露行为信息;无内嵌基础结构内存泄露信息,直接输出为内存泄露行为信息;

步骤S604:提取步骤S603处理后遗留操作行为为释放的信息,检查操作内存地址是否在合法内存操作信息缓存表中,如果存在,则输出为内存重复释放行为信息;如果不存在,则输出为无效内存释放行为信息;

步骤S605:提取步骤S604处理后遗留的所有信息,输出为异常内存操作行为信息。

为了更好地实现本发明,进一步地,还包括步骤S7:根据内存泄露的操作地址、函数堆栈的信息,找出代码中内存泄露的代码行,根据内存泄露操作方式、堆空间主地址的信息,修改代码行,解决内存泄露问题。

一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述的方法。

一种电子设备,包括存储器和处理器;所述存储器上存储有计算机程序;所述处理器,用于执行所述存储器中的所述计算机程序,以实现上述的方法。

本发明的有益效果如下:

本发明通过记录VPP从堆空间中获取可用内存及将内存释放的行为,并提供专用工具对操作内存的行为进行计算分析,从而获取到出现内存泄露的位置以及泄露的内存大小。本发明支持对堆空间内部管理的内存泄露问题定位;支持对内存操作接口进行多级封装后的内存泄露问题定位;支持VPP框架的内存泄露问题定位;忽略内存管理方式、软件核心框架、内存操作接口的限制,可通用使用。

附图说明

图1为本发明检测VPP内存泄露的系统的结构图;

图2为本发明检测VPP内存泄露的方法的流程图。

具体实施方式

实施例1:

一种检测VPP内存泄露的系统,如图1所示,包括依次设置的内存泄露检查模块、归并模块、内存泄露分析模块,所述内存泄露检查模块包括第一级检查模块、第二级检查模块、第三级检查模块;所述第一级检查模块用于获取包括数据类型、函数堆栈、操作位置、内存操作地址的内存操作的外层信息,所述第二级检查模块用于获取高级数据结构的内嵌基础结构的包括内存操作行为及内存操作地址的分解信息,所述第三级检查模块用于获取包括堆空间主地址、内存操作类型、内存操作地址的内存操作核心信息;所述归并模块分别与第一级检查模块、第二级检查模块、第三级检查模块连接,且用于加载所有的内存操作记录信息,将同一次内存操作的信息合并为一条详细信息,最终输出内存操作详细信息至内存泄露分析模块;所述内存泄露分析模块用于处理得到内存泄露操作方式、堆空间主地址的信息,以解决内存泄露问题。

优选地,所述第一级检查模块嵌入设置在VPP框架代码主循环的通用数据类型的内存操作接口;所述第二级检查模块嵌入设置在VPP框架高级数据结构的申请或释放接口;所述第三级检查模块嵌入设置在VPP框架堆空间内的内存操作接口。

本发明通过记录VPP从堆空间中获取可用内存及将内存释放的行为,并提供专用工具对操作内存的行为进行计算分析,从而获取到出现内存泄露的位置以及泄露的内存大小。

实施例2:

一种检测VPP内存泄露的方法,如图2所示,包括以下步骤:

步骤一:本发明针对的是使用Vpp框架进行构建的软件。

步骤二:在VPP框架代码主循环的通用数据类型内存操作接口嵌入第一级检查模块,此处数据类型包括但不限于c语言基础类型、struct、及基于通用数据类型二次封装的Vector、Pool、Hash等高级数据结构。第一级检查模块提供数据类型、函数堆栈、操作位置、内存操作地址等内存操作的外层信息。

步骤三:在VPP框架高级数据结构的申请或释放接口嵌入第二级检查模块。第二级检查模块提供高级数据结构的内嵌基础结构的分解信息,分解信息包括各基础结构的内存操作行为及内存操作地址等信息。

步骤四:在VPP框架堆空间内的内存操作接口嵌入第三级检查模块。第三级检查模块提供堆空间主地址、内存操作类型、内存操作地址等内存操作核心信息。

步骤五:运行代码主循环,开启内存泄露检测模块;运行发生内存泄露的功能,等待各级内存泄露检测模块输出各自的内存操作记录信息,结束代码主循环。

步骤六:运行归并模块,导入步骤五输出的多份内存操作记录信息。

步骤七:归并模块加载所有的内存操作记录信息,将第一级检查模块、第二级检查模块、第三级检查模块这三个模块中同一次内存操作的信息合并为一条详细信息,并输出内存操作详细信息。

步骤八:内存泄露分析模块导入步骤七输出的内存操作详细信息,将所有信息展开,获取所有的内存操作地址及操作行为,分析得出内存泄露的信息,并输出内存泄露的操作地址、函数堆栈等信心。计算步骤如下:

a.对具有相同内存大小、相同内存操作地址,且同时具有申请操作行为和释放操作行为的两条信息,认为是一组完整的内存操作行为,记录这一组信息到合法内存操作信息缓存表中,并从内存操作详细信息中移除数据且不进行输出。

b. 提取步骤a处理后遗留操作行为为申请的信息,对无第二级检查模块输出信息的信息,直接输出为内存泄露行为信息

c.提取步骤b处理后遗留操作行为为申请的信息,对有第二级检查模块输出信息的信息,对于高级数据结构中有内嵌基础结构内存泄露信息的,构建高级数据结构的内嵌基础结构的树形内存泄露行为信息;无内嵌基础结构内存泄露信息,直接输出为内存泄露行为信息。

d.提取步骤c处理后遗留操作行为为释放的信息,检查操作内存地址是否在合法内存操作信息缓存表中,如果存在,则输出为内存重复释放行为信息;如果不存在,则输出为无效内存释放行为信息。

e.提取步骤d处理后遗留的所有信息,输出为异常内存操作行为信息。

f.清理合法内存操作信息缓存表,内存泄露分析模块结束工作。

步骤九:根据步骤八得出的内存泄露操作的内存地址以及函数堆栈等信息,找出代码中内存泄露的代码行,根据内存泄露操作方式、堆空间主地址等信息,修改代码行,解决内存泄露问题。

步骤十:重复步骤一至步骤九,直到步骤八不再输出内存泄露信息为止,内存泄露问题解决。

本发明通过记录VPP从堆空间中获取可用内存及将内存释放的行为,并提供专用工具对操作内存的行为进行计算分析,从而获取到出现内存泄露的位置以及泄露的内存大小。本发明支持对堆空间内部管理的内存泄露问题定位;支持对内存操作接口进行多级封装后的内存泄露问题定位;支持VPP框架的内存泄露问题定位;忽略内存管理方式、软件核心框架、内存操作接口的限制,可通用使用。

以上所述,仅是本发明的较佳实施例,并非对本发明做任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化,均落入本发明的保护范围之内。

相关技术
  • 一种存储系统的状态检测方法、装置、设备及存储介质
  • 一种触觉信号检测方法、装置、系统、设备及存储介质
  • 一种病毒邮件检测方法、系统及电子设备和存储介质
  • 一种故障节点检测方法及系统、设备和可存储介质
  • 一种车内移动目标检测方法及系统、设备、存储介质
  • 一种内存泄露的检测方法、装置、设备及存储介质
  • 一种内存泄露检测方法、装置、电子设备及存储介质
技术分类

06120116483540