本发明涉及内存泄露检测领域,具体涉及到一种通用的内存泄露检测方法。
背景技术:
内存泄漏是嵌入式系统开发过程中经常遇到的比较棘手的问题,通常的方法是通过添加打印信息去调试,操作繁琐,定位问题的效率不高,严重的阻碍项目的进展。也有的方法是通过记录线程的内存使用情况,但是只能快速定位某个线程内存申请异常,而且内存申请也可能是在另一个线程释放,统计并不完全准确。
例如,申请号为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、图2所示,一种通用的内存泄露检测方法,包括以下步骤:
在申请/释放内存的函数malloc/free中嵌入汇编指令,获取当前调用的ra指针。在申请内存成功后记录申请返回的指针地址,在释放成功后清除记录的ra指针和指针地址。在用户输入命令查看内存时,调用内存显示函数,将缓冲区的数据使用ra分类,通过记录的指针值计算出该次申请的大小,然后对每次相同的ra指针的申请做统计并打印出来,该操作对于数据的处理仅在用户输入命令后执行,在malloc中仅仅对ra指针和申请成功的指针地址做保存,保证了内核的效率。通过打印的ra指针值,使用gdb工具即可快速定位问题,本实施例通过记录ra指针的方式,间接性的记住函数的名称,通过ra指针和gdb工具,即可展示函数的内存申请情况而不浪费过多资源,极大的缩短了内存泄漏问题的定位时间,提高了开发效率。
以上对本发明的较佳实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,其中未尽详细描述的设备和结构应该理解为用本领域中的普通方式予以实施;任何熟悉本领域的技术人员,在不脱离本发明技术方案范围情况下,都可利用上述揭示的方法和技术内容对本发明技术方案做出许多可能的变动和修饰,或修改为等同变化的等效实施例,这并不影响本发明的实质内容。因此,凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均仍属于本发明技术方案保护的范围内。