一种检测内存泄露的方法和装置与流程

文档序号:12550569阅读:244来源:国知局
一种检测内存泄露的方法和装置与流程

本申请涉及计算机技术领域,特别是涉及一种检测内存泄露的方法和一种检测内存泄露的装置。



背景技术:

在计算机科学中,内存泄露并非指内存在物理上的消失,而是应用程序在分配某段内存后,由于设计的错误,使得程序未能释放已经不再使用的内存的情况,失去了对该段内存的控制,从而造成了内存的浪费。

在LTE(Long Term Evolution,长期演进)技术中,PGW(PDN Gate Way,PDN网关)网元作为用户到PDN(Public DataNetwork,公用数据网)网络的锚点,需要支持大容量用户的反复接入、会话更新、会话删除等操作,对于PGW网元的信令处理子系统来说,就意味着需要为用户进行大量的内存申请和释放,很容易造成在一些异常分支的遗漏释放而出现内存泄露的情形,然而这种内存泄露的事件一般都是少量且隐蔽的,需要经过很长时间的积累甚至已经造成了严重后果才能被察觉。因此,软件开发人员难以检测和恢复泄露的内存。

目前,软件开发人员一般通过如下几种方式来解决内存泄露的问题:

第一种是根据编码规范及程序处理逻辑进行人工检查,通过在程序编写过程中采用良好一致的编程规范,在此基础上由熟悉程序处理逻辑的有经验的程序员进行代码走读,能够减小内存泄露问题出现的几率,但是,人工检查效率较低,而且问题检出率与检测人员的个人能力关系较大。

第二种是使用静态内存检测工具,如PC-LINT、BEAM等,检查工具能够对程序代码进行静态检查,发现可能出现的内存泄露问题,在使用这类工具时,如果规则定义的合理有效,也能够发现一定数量的内存泄露问题。然而,检测工具的检测规则设置是否合理、有效,会严重影响到问题的检出。此外,静态内存检测工具只能够检测出常规错误,对于较复杂的错误则无能为力。

以上两种方式都属于在软件开发过程中,通过对程序代码的检测,提前对可能出现的内存泄露问题进行预防的做法。第三种方式则是使用动态内存检测工具,如Valgrind、Rational Purify等,在系统运行过程中进行动态检测。但是,动态检测需要对程序代码使用特定的编译选项重新进行编译,增加了对系统资源的耗费,而且,第三方工具的引入同时还增加了系统运行的不确定性。

因此,目前需要本领域技术人员迫切解决的一个技术问题就是:提供一种检测内存泄露的方法和装置,用以实时并直观地检测出内存泄露的问题,避免人工操作,提高内存泄露检测的准确性,以方便软件开发人员及时地恢复泄露的内存。



技术实现要素:

鉴于上述问题,提出了本申请实施例以便提供一种克服上述问题或者至少部分地解决上述问题的一种检测内存泄露的方法和相应的一种检测内存泄露的装置。

为了解决上述问题,本申请实施例公开了一种检测内存泄露的方法,所述内存中设置有第一链表和第二链表,所述第一链表中具有多个存储节点,所述方法包括:

确定执行内存申请操作的内存节点,所述内存节点具有对应的属性信息;

将所述内存节点对应的属性信息,写入所述第一链表中的存储节点;

将写入有属性信息的存储节点从所述第一链表移入第二链表;

当所述内存节点执行内存释放操作时,将所述写入有属性信息的存储节点从所述第二链表移入所述第一链表;

根据所述第一链表和所述第二链表确定内存泄露信息。

优选地,在所述将写入有属性信息的存储节点从所述第一链表移入第二链表的步骤前,还包括:

建立所述内存节点的属性信息与所述写入有属性信息的存储节点的索 引关系。

优选地,所述当所述内存节点执行内存释放操作时,将所述写入有属性信息的存储节点从所述第二链表移入所述第一链表的步骤包括:

当所述内存节点执行内存释放操作时,根据所述内存节点的属性信息与所述写入有属性信息的存储节点的索引关系,在所述第二链表中查找出所述内存节点对应的存储节点;

删除所述存储节点中写入的属性信息;

将已删除属性信息的存储节点从所述第二链表中移入第一链表。

优选地,所述根据所述第一链表和所述第二链表确定内存泄露信息的步骤包括:

根据所述第一链表和所述第二链表,输出内存实际使用信息;

根据所述内存实际使用信息,确定内存泄露信息。

优选地,所述属性信息包括内存操作编号、内存文件名编号、内存文件行号、内存首地址,和/或,内存大小。

为了解决上述问题,本申请实施例还公开了一种检测内存泄露的装置,所述内存中设置有第一链表和第二链表,所述第一链表中具有多个存储节点,所述装置包括:

内存节点确定模块,用于确定执行内存申请操作的内存节点,所述内存节点具有对应的属性信息;

属性信息写入模块,用于将所述内存节点对应的属性信息,写入所述第一链表中的存储节点;

第一移入模块,用于将写入有属性信息的存储节点从所述第一链表移入第二链表;

第二移入模块,用于当所述内存节点执行内存释放操作时,将所述写入有属性信息的存储节点从所述第二链表移入所述第一链表;

内存泄露信息确定模块,用于根据所述第一链表和所述第二链表确定内存泄露信息。

优选地,所述装置还包括:

索引关系建立模块,用于建立所述内存节点的属性信息与所述写入有属性信息的存储节点的索引关系。

优选地,所述第二移入模块包括:

存储节点查找子模块,用于在所述内存节点执行内存释放操作时,根据所述内存节点的属性信息与所述写入有属性信息的存储节点的索引关系,在所述第二链表中查找出所述内存节点对应的存储节点;

属性信息删除子模块,用于删除所述存储节点中写入的属性信息;

存储节点移入子模块,用于将已删除属性信息的存储节点从所述第二链表中移入第一链表。

优选地,所述内存泄露信息确定模块包括:

内存信息输出子模块,用于根据所述第一链表和所述第二链表,输出内存实际使用信息;

内存泄露信息确定子模块,用于根据所述内存实际使用信息,确定内存泄露信息。

优选地,所述属性信息包括内存操作编号、内存文件名编号、内存文件行号、内存首地址,和/或,内存大小。

与背景技术相比,本申请实施例包括以下优点:

在本申请实施例中,通过预先设置两条单向链表,当内存节点执行内存申请操作时,将所述内存节点对应的属性信息写入第一链表的存储节点,并将所述写入有属性信息的存储节点从第一链表移入第二链表,然后,当所述内存节点执行内存释放操作时,又将所述存储节点从第二链表移入第一链表,从而可以根据所述第一链表和所述第二链表确定出内存泄露信息,使得软件开发人员能够实时地检测出内存泄露的问题,避免了人工操作,提高了内存泄露检测的准确性。

其次,在本申请实施例中,还可以通过使用SHELL命令的方式来提供一种用户界面,输出当前仍在使用的内存总大小,每一处内存节点已经申请 但还未释放的内存在最初申请时所在的文件名编号、内存文件行号,以及内存大小等信息,使得软件开发人员能够直观地获得内存使用信息,从而快速地确定出内存泄露的问题,并定位到具体的内存节点,提高了内存泄露检测的准确性,有助于及时地恢复泄露的内存。

附图说明

图1是本申请的一种检测内存泄露的方法实施例一的步骤流程图;

图2是本申请的一种检测内存泄露的方法实施例二的步骤流程图;

图3是本申请的一种检测内存泄露的方法实施例三的步骤流程图;

图4是本申请的一种检测内存泄露的装置实施例的结构框图。

具体实施方式

为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本申请作进一步详细的说明。

参照图1,示出了本申请的一种检测内存泄露的方法实施例一的步骤流程图,具体可以包括如下步骤:

步骤101,确定执行内存申请操作的内存节点;

通常,软件开发人员在编写PGW网元的信令处理子系统代码时,可以预先确定需要执行内存操作的节点,所述内存操作包括内存申请操作,和/或,内存释放操作。而且,对于已经正式发布的软件版本来说,需要执行内存申请操作和内存释放操作的位置是完全固定不变的。

因此,在本申请实施例中,对于PGW网元的信令处理子系统而言,在系统运行过程中,当需要执行内存申请操作时,可以首先确定执行内存申请操作的内存节点,所述内存节点具有对应的属性信息,所述属性信息可以包括内存操作编号、内存文件名编号、内存文件行号、内存首地址,和/或,内存大小。所述属性信息可以分别用于记录在执行内存操作时的操作记录编号、执行操作的文件名对应的编号、操作代码所在行号、操作的内存的首地址,以及,申请的内存的大小。

步骤102,将所述内存节点对应的属性信息,写入所述第一链表中的存储节点;

在本申请实施例中,可以预先在所述内存中设置两条单向链表,即第一链表和第二链表。初始化时,在所述第一链表中挂接多个存储节点,用于后续记录内存节点对应的属性信息。

因此,当内存节点执行内存申请操作时,可以将所述内存节点对应的属性信息,写入所述第一链表中的存储节点。

步骤103,将写入有属性信息的存储节点从所述第一链表移入第二链表;

在具体实现中,可以将写入有属性信息的存储节点从所述第一链表中取出,然后挂接到第二链表中。此时,第一链表中不再存储有写有所述内存节点对应的属性信息的存储节点。

步骤104,当所述内存节点执行内存释放操作时,将所述写入有属性信息的存储节点从所述第二链表移入所述第一链表;

在具体实现中,当所述内存节点执行内存释放操作时,可以将所述写入有属性信息的存储节点从所述第二链表中取出,重新挂接到所述第一链表中。

步骤105,根据所述第一链表和所述第二链表确定内存泄露信息。

在本申请实施例中,当内存节点执行多次的内存申请和内存释放操作后,可以根据此时在所述第一链表和所述第二链表中记录的内存节点的属性信息,得出已申请内存但并未及时释放的内存节点,从而确定出内存泄露信息。

在本申请实施例中,通过预先设置两条单向链表,当内存节点执行内存申请操作时,将所述内存节点对应的属性信息写入第一链表的存储节点,并将所述写入有属性信息的存储节点从第一链表移入第二链表,然后,当所述内存节点执行内存释放操作时,又将所述存储节点从第二链表移入第一链表,从而可以根据所述第一链表和所述第二链表确定出内存泄露信息,使得软件开发人员能够实时地检测出内存泄露的问题,避免了人工操作,提高了内存泄露检测的准确性。

参照图2,示出了本申请的一种检测内存泄露的方法实施例二的步骤流程图,具体可以包括如下步骤:

步骤201,确定执行内存申请操作的内存节点;

在本申请实施例中,当需要执行内存申请操作时,可以首先确定执行内存申请操作的内存节点,所述内存节点具有对应的属性信息,所述属性信息可以包括内存操作编号、内存文件名编号、内存文件行号、内存首地址,和/或,内存大小。

步骤202,将所述内存节点对应的属性信息,写入所述第一链表中的存储节点;

在本申请实施例中,可以预先在所述内存中设置两条单向链表,并在所述第一链表中挂接多个存储节点。当内存节点执行内存申请操作时,可以将所述内存节点对应的属性信息,写入所述第一链表中的一个存储节点。

步骤203,建立所述内存节点的属性信息与所述写入有属性信息的存储节点的索引关系;

在具体实现中,在将所述内存节点的属性信息写入第一链表中的一个存储节点后,可以建立所述内存节点的属性信息与所述存储节点的索引关系。具体地,所述索引关系可以通过HASH(哈希)表的方式进行保存。

在本申请的一种优选实施例中,可以根据所述内存节点的首地址来建立起与所述存储节点的索引关系表。

步骤204,将写入有属性信息的存储节点从所述第一链表移入第二链表;

在具体实现中,可以将所述存储节点从所述第一链表中取出,挂接到第二链表中。

步骤205,当所述内存节点执行内存释放操作时,将所述写入有属性信息的存储节点从所述第二链表移入所述第一链表;

当所述内存节点执行内存释放操作时,可以将所述内存节点对应的存储节点从第二链表中取出,重新挂接到第一链表中。

在具体实现中,由于已提前建立起所述内存节点的属性信息与所述写入 有属性信息的存储节点的索引关系,因此,当所述内存节点在执行内存释放操作时,可以根据建立的索引关系,查找出所述内存节点对应的存储节点,然后,将所述存储节点从第二链表中取出,重新挂接到第一链表中。

步骤206,根据所述第一链表和所述第二链表确定内存泄露信息。

在本申请的一种优选实施例中,所述根据所述第一链表和所述第二链表确定内存泄露信息具体可以包括如下子步骤:

子步骤2061,根据所述第一链表和所述第二链表,输出内存实际使用信息;

子步骤2062,根据所述内存实际使用信息,确定内存泄露信息。

在具体实现中,可以根据所述第一链表和所述第二链表中记录的内存节点的属性信息,通过使用SHELL命令的方式来提供一种用户界面,输出当前仍在使用的内存总大小,每一处内存节点已经申请但还未释放的内存在最初申请时所在的文件名编号、内存文件行号,以及内存大小,得出已申请内存但并未及时释放的内存节点,从而确定出内存泄露信息,并定位出出现内存泄露的内存节点,有助于及时地恢复泄露的内存。

在本申请的实施例中,通过预先设置两条单向链表,当内存节点执行内存申请操作时,将所述内存节点对应的属性信息写入第一链表的存储节点,并建立起所述属性信息与所述存储节点间的索引关系,然后将所述存储节点从第一链表移入第二链表,当所述内存节点执行内存释放操作时,根据所述索引关系查找出对应的存储节点,将所述存储节点从第二链表中重新移入第一链表,从而可以根据所述第一链表和所述第二链表中记录的内存节点属性信息,通过用户界面的方式输出内存实际使用信息,从而确定出内存泄露信息,使得软件开发人员能够直观地获得内存使用信息,从而快速地确定出内存泄露的问题,并定位到具体的内存节点,提高了内存泄露检测的准确性,有助于及时地恢复泄露的内存。

参照图3,示出了本申请的一种检测内存泄露的方法实施例三的步骤流程图,具体可以包括如下步骤:

步骤301,确定执行内存申请操作的内存节点;

在本申请实施例中,当需要执行内存申请操作时,可以首先确定执行内存申请操作的内存节点,所述内存节点具有对应的属性信息,所述属性信息可以包括内存操作编号、内存文件名编号、内存文件行号、内存首地址,和/或,内存大小。

步骤302,将所述内存节点对应的属性信息,写入所述第一链表中的存储节点;

在本申请实施例中,可以预先在所述内存中设置两条单向链表,并在所述第一链表中挂接多个存储节点。当内存节点执行内存申请操作时,可以将所述内存节点对应的属性信息,写入所述第一链表中的一个存储节点。

步骤303,建立所述内存节点的属性信息与所述写入有属性信息的存储节点的索引关系;

在本申请的一种优选实施例中,可以根据所述内存节点的首地址来建立起与所述存储节点的索引关系,所述索引关系可以通过HASH(哈希)表的方式进行保存。

步骤304,将写入有属性信息的存储节点从所述第一链表移入第二链表;

在具体实现中,可以将所述存储节点从所述第一链表中取出,挂接到第二链表中。

步骤305,当所述内存节点执行内存释放操作时,根据所述内存节点的属性信息与所述写入有属性信息的存储节点的索引关系,在所述第二链表中查找出所述内存节点对应的存储节点;

在具体实现中,当所述内存节点在执行内存释放操作时,可以根据所述内存首地址与存储节点的索引关系,在所述第二链表中查找出所述内存节点对应的存储节点,然后执行步骤306.

步骤306,删除所述存储节点中写入的属性信息;

由于所述内存节点在执行内存释放操作后,所述内存节点已不再占用对应的内存,因此,此时可以将所述存储节点中写入的属性信息删除。

步骤307,将已删除属性信息的存储节点从所述第二链表中移入第一链 表;

在本申请实施例中,可以将已删除属性信息的存储节点从所述第二链表中取出,重新挂接到所述第一链表中,所述第一链表中的所有存储节点均是未写入任何信息的空闲可用节点。因此,当有内存节点在执行内存申请操作时,可以获取其中的任一一个存储节点。

步骤308,根据所述第一链表和所述第二链表,输出内存实际使用信息;

在具体实现中,可以根据所述第一链表和所述第二链表中记录的内存节点的属性信息,通过使用SHELL命令的方式来提供一种用户界面,输出当前仍在使用的内存总大小、每一处内存节点已经申请但还未释放的内存在最初申请时所在的文件名编号、内存文件行号,以及内存大小等内存实际使用信息。

步骤309,根据所述内存实际使用信息,确定内存泄露信息。

在本申请的实施例中,可以根据用户界面输出的所述内存实际使用信息,得出已申请内存但并未及时释放的内存节点,从而确定出内存泄露信息,并定位出出现内存泄露的内存节点,有助于及时地恢复泄露的内存。

在本申请的实施例中,通过预先设置两条单向链表,当内存节点执行内存申请操作时,将所述内存节点对应的属性信息写入第一链表的存储节点,并建立起内存首地址与所述存储节点间的索引关系,然后将所述存储节点从第一链表移入第二链表,当所述内存节点执行内存释放操作时,根据所述索引关系查找出对应的存储节点,删除所述存储节点中写入的内存节点属性信息,并将所述存储节点从第二链表中重新移入第一链表,使得在执行内存操作时,第一链表中的存储节点均为空闲可用节点,而第二链表中均为记录了内存节点属性信息的存储节点,从而可以根据所述第一链表和所述第二链表输出内存实际使用信息,从而确定出内存泄露信息,使得软件开发人员能够直观地获得内存使用信息,从而快速地确定出内存泄露的问题,并定位到具体的内存节点,提高了内存泄露检测的准确性,有助于及时地恢复泄露的内存。

需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请实施例并不受所描述的动作顺序的限制,因为依据本申请实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本申请实施例所必须的。

参照图4,示出了本申请的一种检测内存泄露的装置实施例的结构框图,所述内存中设置有第一链表和第二链表,所述第一链表中具有多个存储节点,所述装置具体可以包括如下模块:

内存节点确定模块401,用于确定执行内存申请操作的内存节点,所述内存节点具有对应的属性信息;

属性信息写入模块402,用于将所述内存节点对应的属性信息,写入所述第一链表中的存储节点;

第一移入模块403,用于将写入有属性信息的存储节点从所述第一链表移入第二链表;

第二移入模块404,用于当所述内存节点执行内存释放操作时,将所述写入有属性信息的存储节点从所述第二链表移入所述第一链表;

内存泄露信息确定模块405,用于根据所述第一链表和所述第二链表确定内存泄露信息。

在本申请的实施例中,所述装置还可以包括如下模块:

索引关系建立模块406,用于建立所述内存节点的属性信息与所述写入有属性信息的存储节点的索引关系。

在本申请的实施例中,所述第二移入模块404还可以包括如下子模块:

存储节点查找子模块4041,用于在所述内存节点执行内存释放操作时,根据所述内存节点的属性信息与所述写入有属性信息的存储节点的索引关系,在所述第二链表中查找出所述内存节点对应的存储节点;

属性信息删除子模块4042,用于删除所述存储节点中写入的属性信息;

存储节点移入子模块4043,用于将已删除属性信息的存储节点从所述第 二链表中移入第一链表。

在本申请的实施例中,所述内存泄露信息确定模块405还可以包括如下子模块:

内存信息输出子模块4051,用于根据所述第一链表和所述第二链表,输出内存实际使用信息;

内存泄露信息确定子模块4052,用于根据所述内存实际使用信息,确定内存泄露信息。

在本申请的实施例中,所述属性信息包括内存操作编号、内存文件名编号、内存文件行号、内存首地址,和/或,内存大小。

对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

本领域内的技术人员应明白,本申请实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请实施例是参照根据本申请实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的 指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。

以上对本申请所提供的一种检测内存泄露的方法和一种检测内存泄露的装置,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心 思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1