对内存重复释放进行定位的方法和装置制造方法

文档序号:6540163阅读:199来源:国知局
对内存重复释放进行定位的方法和装置制造方法
【专利摘要】一种对内存重复释放进行定位的方法和装置。该方法包括:在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息;将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息;在释放内存之前,检测该内存的头部标识信息;如果所述头部标识信息发生改变,则确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。本发明不仅操作简单,耗时短,并且检测出内存重复释放后能够快速定位存在内存重复释放的问题所在。
【专利说明】 对内存重复释放进行定位的方法和装置
【技术领域】
[0001]本发明涉及程序开发领域,特别涉及对内存重复释放进行定位的方法和装置。
【背景技术】
[0002]当今IT行业,代码开发中最频繁的使用之一就是内存的申请与释放。如果出现内存申请后,已经在其他地方释放,又存在再次释放此内存的情况,就会出现重复两次释放同一块内存,导致出现异常。内存重复释放问题一直是困扰开发者定位问题的一大难题,出现内存重复释放的情况后往往需要开发者花费大量的时间去查找内存重复释放的地方,既费时又费力。
[0003]操作系统一般通过垃圾回收算法来对内存进行回收。垃圾回收线程在系统空闲的时候从系统的根集出发,定位所有在使用的内存,并将总内存池中未被使用的内存回收,虽然可以实现异步的非精确性的内存回收,但是由于垃圾回收线程运行受限于系统的忙闲程度,无法彻底解决内存泄露问题。
[0004]现有的对内存重复释放进行定位的解决方案主要有:申请业务内存时,申请与业务内存相关的关联内存;在释放业务内存之如或同时,获得关联内存的地址;检测是否为重复释放,如果是重复释放,则将当前运行环境记录到指定记录区,并将关联内存的内容转储到指定记录区,通过分析指定记录区的记录,进行重复释放定位,如果不是重复释放,则将当前运行环境记录到关联内存中。
[0005]容易看出,上述解决方案必须要申请关联内存,将关联内存的内容转储到指定记录区,通过分析指定记录区的记录,才能定位重复释放的地方。其不仅操作复杂,并且缺少精确性和具体性。

【发明内容】

[0006]本发明的目的是提供一种对内存重复释放进行定位的方法和装置,能够输出内存重复释放的具体函数和代码行,便于快速定位。
[0007]根据本发明的一个方面,提供了 一种用于对内存重复释放进行定位的方法,其特征在于,包括以下步骤:
[0008]申请内存时,在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息;
[0009]将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息;
[0010]在释放内存之前,检测该内存的头部标识信息;
[0011]如果所述头部标识信息为不同于所述第一标志的第三标志,则确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。
[0012]优选地,所述方法还包括:
[0013]如果所述头部标识信息为所述第一标志,则确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。[0014]优选地,所述保存调用申请内存的函数信息包括:
[0015]保存调用申请内存的函数地址及在代码中对应的行数。
[0016]优选地,所述内存头部信息还包括:内存实际申请大小、调用申请内存的函数地址及行数,以及调用释放内存的函数地址及行数;所述头部标识信息还用于确认申请内存的起始位置,且所述将头部标识信息初始化为第一标志,包括:将所述头部标识信息初始化为
一特殊数字。
[0017]优选地,所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息,包括:将调用本次释放的函数名及在代码中对应的行数,以及调用首次释放的函数名及在代码中对应的行数进行打印显示,并禁止本次释放;其中,所述函数名由函数信息中的函数地址翻译而成。
[0018]优选地,所述扩展区还用于保存内存尾部信息,所述内存尾部信息包括:用于确认申请内存的结束位置的尾部标识信息,在申请内存时,除了将所述头部标识信息初始化为第一标志,还将所述尾部标识信息初始化为第二标志,并且将申请的内存加入到内存链表中;所述执行内存释放包括:
[0019]将尾部标识信息设置为不同于第二标识的第四标志,表示内存被释放的结束,将释放的内存从内存链表中删除。
[0020]根据本发明的另一方面,提供了一种用于对内存重复释放进行定位的装置,其特征在于,包括以下模块:
[0021 ] 内存申请模块,用于在申请内存时,在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息;
[0022]内存信息初始化模块,用于将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息;
[0023]释放检测模块,用于在释放内存之前,检测该内存的头部标识信息;
[0024]重复释放处理模块,用于在所述头部标识信息为不同于所述第一标志的第三标志时,确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。
[0025]优选地,还包括首次释放处理模块,用于在所述头部标识信息为所述第一标志时,确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。
[0026]优选地,所述保存调用申请内存的函数信息,包括:
[0027]保存调用申请内存的函数地址及在代码中对应的行数。
[0028]优选地,所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息,包括:
[0029]将调用本次释放的函数名及在代码中对应的行数,以及调用首次释放的函数名及在代码中对应的行数进行打印显示,并禁止本次释放。
[0030]通过采用本发明技术方案,具有以下优点,不仅操作简单,耗时短,并且检测出内存重复释放后会即时输出。此外,检测效率高,能够直接定位出现问题的函数及代码所在行数。
【专利附图】

【附图说明】[0031]此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的过分限定。其中:
[0032]图1显示了根据本发明实施例对内存重复释放进行定位的方法的流程图。
[0033]图2显示了根据本发明实施例用于对内存重复释放进行定位的装置的框图。
【具体实施方式】
[0034]为使本发明的目的、技术方案和优点更加清楚明了,下面结合【具体实施方式】并参照附图,对本发明进一步详细说明。需要说明的是,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
[0035]图1显示了根据本发明实施例的对内存重复释放进行定位的方法的流程图。
[0036]如图1所示,本发明提供的对内存重复释放进行定位的方法在检测出内存重复释放后能够直接显示出现问题的函数及代码所在行数,该方法包括:
[0037]首先,在申请内存时,额外申请一块内存区域作为扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息。
[0038]其中内存头部信息包括:头部标识信息(用于确认申请内存的起始位置和申请释放情况)、去掉头尾的内存实际申请大小、调用申请内存的函数地址及在代码中对应的行数等信息、释放该内存的函数地址及在代码中对应的行数等信息。
[0039]将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息。
[0040]具体地,在申请内存之后,将上面所描述的头部标识信息设置为特殊数字,用来表示内存被使用的开始;保存调用申请内存的函数地址及其所对应的代码中的行数。
[0041 ] 在释放内存之前,检测该内存的头部标识信息。
[0042]如果所述头部标识信息为不同于所述第一标识标志的第三标志,则确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。
[0043]如果头部标识信息为内存被释放的标记,即另一个特殊数字,则认为该内存发生内存重复释放,会立刻打印提示该内存重复释放,将本次释放的函数名(可通过函数地址翻译成函数名)及在代码中对应的行数和内存头中保存的上次(即首次)释放的函数名及在代码中对应的行数显示出来,并禁止释放操作。
[0044]此外,如果所述头部标识信息为所述第一标志,则确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。
[0045]具体而言,在首次释放该内存之前,将上面所描述的头部标识信息设置为另一个特殊数字,用来表示内存被释放的开始;保存调用释放内存的函数地址及其所对应的代码中的行数;并将尾部标识信息也设置为另一个特殊数字,用来表示内存被释放的结束;
[0046]优选地,所述扩展区还用于保存内存尾部信息,所述内存尾部信息包括:用于确认申请内存的结束位置的尾部标识信息,在申请内存时,除了将所述头部标识信息初始化为第一标志,还将所述尾部标识信息初始化为第二标志,并且将申请的内存加入到内存链表中;
[0047]具体地,通过将上面所描述的尾部标识信息设置为特殊数字,用来表示内存被使用的结束,并将申请的内存加入到内存链表中;
[0048]最后,所述执行内存释放的过程包括:将尾部标识信息设置为不同于第二标识的第四标志,表示内存被释放的结束,将释放的内存从内存链表中删除,完成释放。
[0049]本领域技术人员应当理解,本发明所应用的链表类型可以视具体的数据存取需要来选择,包括但不限于单向链表、双向链表、多维链表及循环链表等。
[0050]其中,释放内存可能为首次或重复释放,为进行区分,只需检测该内存的头部标识信息。如头部标识信息为内存被使用标记,即原始的特殊数字,则认为该内存正常,不属于重复释放,可以进行释放操作;
[0051]由此,用户通过该显示信息,即可立即定位出内存重复释放的具体函数和位置,作为修改程序代码以避免内存泄漏的重要依据。
[0052]为进一步阐述本发明,以下将以具体应用环境和参数为例,具体描述本发明定位重复释放的方法流程。
[0053]调用分配函数进行内存分配,指定申请大小;如C语言中的char*p =malloc (size),其中malloc是分配函数,size是分配的大小,p是返回内存块的首地址。在申请内存时,额外申请一块内存区,称为扩展区,用于保存内存的文件头尾部信息,扩展区的大小足以存储内存的文件头尾部信息。
[0054]内存头部信息包括以下信息:头部标识信息、内存实际申请大小size、调用申请内存的函数地址及行数、释放该内存的函数地址及行数。其中内存尾部信息包括:尾部标识信息,用于确认申请内存的结束位置。
[0055]将上面所描述的头部标识信息设置为“00”,用来表示内存被使用但未被释放。保存调用申请内存的函数地址(假设函数名functionl ()的地址为0x00000001)及其所对应的代码中的行数(假设为LINE:10021);并将申请的内存加入到内存链表中;将上面所描述的尾部标识信息也设置为特殊数字“01”,用来表示内存被使用的结束。
[0056]在首次释放该内存之前,首先会检测到该内存的头部标识信息为“00”,表示可以进行释放,先将上面所描述的头部标识信息设置为“10”,用来表示内存被释放的开始;保存调用释放内存的函数地址0x00000001及其所对应的代码中的行数LINE:10021 ;并将尾部标识信息也设置为另一个特殊数字“11”,用来表示内存被释放的结束。然后可以调用释放函数free,指定释放块首地址,根据该首地址将释放的内存从内存链表中摘除,完成释放。
[0057]若该内存块被释放后,另一函数function2 ()及对应的代码行数LINE:10216对该内存块第二次释放,首先会检测到该内存的头部标识信息已经为“10”,则确定属于内存重复释放,会立刻打印提示该内存重复释放,将本次释放的函数名function2 ()及对应的代码行数LINE:10216和内存头中保存的上次释放的函数名functionl ()及对应的代码行数LINE:10021显示出来,并禁止释放操作。
[0058]图2显示了根据本发明实施例用于对内存重复释放进行定位的装置200的框图。根据本发明的另一方面,提供了一种用于对内存重复释放进行定位的装置。该装置200包括以下模块:
[0059]内存申请模块,用于在申请内存时,在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息;
[0060]内存信息初始化模块,用于将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息;[0061]释放检测模块,用于在释放内存之前,检测该内存的头部标识信息;
[0062]重复释放处理模块,用于在所述头部标识信息为不同于所述第一标志的第三标志时,确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。
[0063]优选地,还包括首次释放处理模块,用于在所述头部标识信息为所述第一标志时,确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。
[0064]优选地,所述保存调用申请内存的函数信息进一步包括:
[0065]保存调用申请内存的函数地址及在代码中对应的行数。
[0066]优选地,其中所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息进一步包括:
[0067]将调用本次释放的函数名及在代码中对应的行数,以及调用首次释放的函数名及在代码中对应的行数进行打印显示,并禁止本次释放。
[0068]综上所述,利用本发明的对内存重复释放进行定位的方法和装置,检测出内存重复释放后能够快速定位出现问题的函数及在代码中对应所在的行数,操作简单,耗时短并且检测效率高。因此不仅提高了资源的利用率,还可以改善用户体验。
[0069]显然,本领域的技术人员应该理解,上述的本发明的各模块或各步骤可以用通用的计算系统来实现,它们可以集中在单个的计算系统上,或者分布在多个计算系统所组成的网络上,可选地,它们可以用计算系统可执行的程序代码来实现,从而,可以将它们存储在存储系统中由计算系统来执行。这样,本发明不限制于任何特定的硬件和软件结合。
[0070]应当理解的是,本发明的上述【具体实施方式】仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。
【权利要求】
1.一种用于对内存重复释放进行定位的方法,其特征在于,包括以下步骤: 申请内存时,在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息; 将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息; 在释放内存之前,检测该内存的头部标识信息; 如果所述头部标识信息为不同于所述第一标志的第三标志,则确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括: 如果所述头部标识信息为所述第一标志,则确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。
3.根据权利要求1所述的方法,其特征在于,所述保存调用申请内存的函数信息,包括: 保存调用申请内存的函数地址及在代码中对应的行数。
4.根据权利要求1或2所述的方法,其特征在于,所述内存头部信息还包括:内存实际申请大小、调用申请内存的函数地址及行数,以及调用释放内存的函数地址及行数;所述头部标识信息还用于确认申请内存的起始位置,且所述将头部标识信息初始化为第一标志,包括:将所述头部标识信息初始化为一特殊数字。
5.根据权利要求3所述的方法,其特征在于,所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息,包括:将调用本次释放的函数名及在代码中对应的行数,以及调用首次释放的函数名及在代码中对应的行数进行打印显示,并禁止本次释放; 其中,所述函数名由函数信息中的函数地址翻译而成。
6.根据权利要求2所述的方法,其特征在于,所述扩展区还用于保存内存尾部信息,所述内存尾部信息包括:用于确认申请内存的结束位置的尾部标识信息,在申请内存时,除了将所述头部标识信息初始化为第一标志,还将所述尾部标识信息初始化为第二标志,并且将申请的内存加入到内存链表中; 所述执行内存释放包括:将尾部标识信息设置为不同于第二标识的第四标志,表示内存被释放的结束,将释放的内存从内存链表中删除。
7.一种用于对内存重复释放进行定位的装置,其特征在于,包括以下模块: 内存申请模块,用于在申请内存时,在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息; 内存信息初始化模块,用于将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息; 释放检测模块,用于在释放内存之前,检测该内存的头部标识信息; 重复释放处理模块,用于在所述头部标识信息为不同于所述第一标志的第三标志时,确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。
8.根据权利要求7所述的装置,其特征在于,还包括首次释放处理模块,用于在所述头部标识信息为所述第一标志时,确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。
9.根据权利要求7所述的装置,其特征在于,所述保存调用申请内存的函数信息,包括: 保存调用申请内存的函数地址及在代码中对应的行数。
10.根据权利要求9所述的装置,其特征在于,所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息,包括: 将调用本次释放 的函数名及在代码中对应的行数,以及调用首次释放的函数名及在代码中对应的行数进行打印显示,并禁止本次释放。
【文档编号】G06F11/07GK103914355SQ201410089086
【公开日】2014年7月9日 申请日期:2014年3月12日 优先权日:2014年3月12日
【发明者】赵众 申请人:汉柏科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1