一种通用的内存泄露检测方法技术

技术编号:21453791 阅读:43 留言:0更新日期:2019-06-26 04:44
本发明专利技术提供了一种通用的内存泄露检测方法,包括以下步骤:步骤(1):通过malloc/free内嵌获取RA指针的汇编代码,记录RA指针值;步骤(2):当malloc内存申请成功后,将地址记录在数组当中;当free释放成功时,将数组中的记录清除;步骤(3):将缓冲区的数据使用RA分类,对每次相同的RA指针的申请进行统计,本发明专利技术通过记录RA指针的方式,间接性的记住函数的名称,通过RA指针和GDB工具,即可展示函数的内存申请情况而不浪费过多资源,对于嵌入式系统的内存定位问题,极大的缩短了内存泄漏问题的定位时间,提高了开发效率。

【技术实现步骤摘要】
一种通用的内存泄露检测方法
本专利技术涉及内存泄露检测领域,具体涉及到一种通用的内存泄露检测方法。
技术介绍
内存泄漏是嵌入式系统开发过程中经常遇到的比较棘手的问题,通常的方法是通过添加打印信息去调试,操作繁琐,定位问题的效率不高,严重的阻碍项目的进展。也有的方法是通过记录线程的内存使用情况,但是只能快速定位某个线程内存申请异常,而且内存申请也可能是在另一个线程释放,统计并不完全准确。例如,申请号为CN201710211056.5,名称为一种内存泄露检测方法及设备公开了当应用程序在虚拟机上运行时,调用Java虚拟机工具接口JVMTI监控是否存在对象被回收;其中所述对象关联有标示符;在监控到存在对象被回收的情况下,在预设集合中删除所述对象关联的标示符;其中所述预设集合包括多个对象各自关联的标示符;确定所述预设集合中剩余的标示符中的一个或多个标示符所关联的对象为内存泄露对象。以及申请号为CN201510136216.5,名称为内存泄露的检测方法和装置公开了根据用户指令对系统的内存进行挤压,以将目标程序的匿名内存换出至交换空间;在所述目标程序继续运行过程中,接收所述目标程序的内存访问请求;将所述内存访问请求对应的内存换入,并记录换入的内存的内存信息;对记录的所述换入的内存的内存信息进行统计以对内存泄露的泄漏点进行定位;其中,所述对记录的所述换入的内存的内存信息进行统计以对内存泄露的泄漏点进行定位,包括:根据所述换入的内存的内存信息生成所述目标程序的调用链,并对所述调用链的出现次数进行统计并排序,以使得通过所述调用链的内容来实现对内存泄露的泄露点的定位。但是上述的方案均没有解决本专利技术需要解决的技术问题。
技术实现思路
为了解决上述不足的缺陷,本专利技术提供了一种通用的内存泄露检测方法,本专利技术通过记录RA指针的方式,间接性的记住函数的名称,通过RA指针和GDB工具,即可展示函数的内存申请情况而不浪费过多资源,对于嵌入式系统的内存定位问题,极大的缩短了内存泄漏问题的定位时间,提高了开发效率。本专利技术提供了一种通用的内存泄露检测方法,包括以下步骤:步骤(1):通过malloc/free内嵌获取RA指针的汇编代码,记录RA指针值;步骤(2):当malloc内存申请成功后,将地址记录在数组当中;当free释放成功时,将数组中的记录清除;步骤(3):将缓冲区的数据使用RA分类,对每次相同的RA指针的申请进行统计。上述的检测方法,其中,所述步骤(2)中具体包括:在申请内存成功后记录申请返回的指针地址,在释放成功后清除记录的RA指针和指针地址。上述的检测方法,其中,所述步骤(3)具体包括:步骤(3.1):用户输入命令查看内存时,调用内存显示函数;步骤(3.2):将缓冲区的数据使用RA分类,通过记录的指针值计算出该次申请的大小;步骤(3.3):对每次相同的RA指针的申请进行统计并打印出来;步骤(3.4):通过打印的RA指针值,使用GDB工具即可快速定位问题。上述的检测方法,其中,所述步骤(2)中当malloc内存申请成功后,将地址记录在数组当中具体包括:使用find-addr(0)查找MemCallerInfo区中未被使用的储存空间下标;然后将RA指针和申请成功的储存在缓冲区。上述的检测方法,其中,所述步骤(2)中当free释放成功时,将数组中的记录清除具体包括:使用find-addr(Addr)查找将被释放的指针地址是否在MemCallerInfo缓冲区,然后将RA指针和申请成功的地址从缓冲区清除。本专利技术提供了一种通用的内存泄露检测方法具有以下有益效果:本专利技术通过记录RA指针的方式,间接性的记住函数的名称,通过RA指针和GDB工具,即可展示函数的内存申请情况而不浪费过多资源,对于嵌入式系统的内存定位问题,极大的缩短了内存泄漏问题的定位时间,提高了开发效率。附图说明通过阅读参照以下附图对非限制性实施例所作的详细描述,本专利技术及其特征、外形和优点将会变得更明显。在全部附图中相同的标记指示相同的部分。并未刻意按照比例绘制附图,重点在于示出本专利技术的主旨。图1为本专利技术一种通用的内存泄露检测方法的流程示意图。图2为本专利技术一种通用的内存泄露检测方法中的局部流程示意图。图3为本专利技术中当开发人员输入meminfo命令,会执行的步骤示意图。具体实施方式在下文的描述中,给出了大量具体的细节以便提供对本专利技术更为彻底的理解。然而,对于本领域技术人员而言显而易见的是,本专利技术可以无需一个或多个这些细节而得以实施。在其他的例子中,为了避免与本专利技术发生混淆,对于本领域公知的一些技术特征未进行描述。为了彻底理解本专利技术,将在下列的描述中提出详细的步骤以及详细的结构,以便阐释本专利技术的技术方案。本专利技术的较佳实施例详细描述如下,然而除了这些详细描述外,本专利技术还可以具有其他实施方式。本专利技术提供的一种通用的内存泄露检测方法,其特征在于,包括以下步骤:步骤(1):通过malloc/free内嵌获取RA指针的汇编代码,记录RA指针值;步骤(2):当malloc内存申请成功后,将地址记录在数组当中;当free释放成功时,将数组中的记录清除,具体为在申请内存成功后记录申请返回的指针地址,在释放成功后清除记录的RA指针和指针地址;以及当malloc内存申请成功后,将地址记录在数组当中具体包括:使用find-addr(0)查找MemCallerInfo区中未被使用的储存空间下标;然后将RA指针和申请成功的储存在缓冲区;当free释放成功时,将数组中的记录清除具体包括:使用find-addr(Addr)查找将被释放的指针地址是否在MemCallerInfo缓冲区,然后将RA指针和申请成功的地址从缓冲区清除。也就是说通过串口输入meminfo命令,将所有的申请记录值打印出来。在打印的过程中,遍历数组,将相同的RA指针归为一类,然后通过申请成功的首地址计算出申请的size,将总和计算出来。该做法的优点是在malloc中只做记录而不做任何数据处理,以免时间过程而影响系统运行,所有的数据处理全部在meminfo命令执行时才执行。步骤(3):将缓冲区的数据使用RA分类,对每次相同的RA指针的申请进行统计,具体包括:步骤(3.1):用户输入命令查看内存时,调用内存显示函数;步骤(3.2):将缓冲区的数据使用RA分类,通过记录的指针值计算出该次申请的大小;步骤(3.3):对每次相同的RA指针的申请进行统计并打印出来;步骤(3.4):通过打印的RA指针值,使用GDB工具即可快速定位问题。本专利技术为系统开发过程中定位内存泄漏问题提供便捷,调试期间,通过打开宏控开关,即可在控制台输入meminfo命令查看系统内存使用信息,当出现问题时,能够快速定位问题点,提高开发效率。本专利技术中从系统启动开始,当有内存申请时便记录申请信息;当用户输入meminfo后,执行meminfo中的内存信息显示函数;内存信息显示函数遍历整个存储内存信息的数组,将相同的RA指针分类统计,最终输出每个RA指针申请的次数和申请的内存总代小;通过GDB调试工具,使用RA指针即可快速定位函数名称。通过运用记录RA寄存器值及根据起始地址找到申请块大小两手段就可以解决已有方案需要大量时间移植,封装困难,跟踪范围有限等缺陷,从根本上彻底全方位解决内存泄本文档来自技高网
...

【技术保护点】
1.一种通用的内存泄露检测方法,其特征在于,包括以下步骤:步骤(1):通过malloc/free内嵌获取RA指针的汇编代码,记录RA指针值;步骤(2):当malloc内存申请成功后,将地址记录在数组当中;当free释放成功时,将数组中的记录清除;步骤(3):将缓冲区的数据使用RA分类,对每次相同的RA指针的申请进行统计。

【技术特征摘要】
1.一种通用的内存泄露检测方法,其特征在于,包括以下步骤:步骤(1):通过malloc/free内嵌获取RA指针的汇编代码,记录RA指针值;步骤(2):当malloc内存申请成功后,将地址记录在数组当中;当free释放成功时,将数组中的记录清除;步骤(3):将缓冲区的数据使用RA分类,对每次相同的RA指针的申请进行统计。2.如权利要求1所述的一种通用的内存泄露检测方法,其特征在于,所述步骤(2)中具体包括:在申请内存成功后记录申请返回的指针地址,在释放成功后清除记录的RA指针和指针地址。3.如权利要求2所述的一种通用的内存泄露检测方法,其特征在于,所述步骤(3)具体包括:步骤(3.1):用户输入命令查看内存时,调用内存显示函数;步骤(3.2):将缓冲区的数据使用RA分类,通过记录的...

【专利技术属性】
技术研发人员:刘小平张华
申请(专利权)人:深圳市吉祥腾达科技有限公司
类型:发明
国别省市:广东,44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1