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

上传人:g**** 文档编号:6115015 上传时间:2019-04-12 格式:PDF 页数:10 大小:891.74KB
返回 下载 相关 举报
摘要
申请专利号:

CN201410089086.X

申请日:

2014.03.12

公开号:

CN103914355A

公开日:

2014.07.09

当前法律状态:

驳回

有效性:

无权

法律详情:

发明专利申请公布后的驳回IPC(主分类):G06F 11/07申请公布日:20140709|||实质审查的生效IPC(主分类):G06F 11/07申请日:20140312|||公开

IPC分类号:

G06F11/07

主分类号:

G06F11/07

申请人:

汉柏科技有限公司

发明人:

赵众

地址:

300384 天津市西青区华苑产业区海泰西18号西3楼104室

优先权:

专利代理机构:

北京天奇智新知识产权代理有限公司 11340

代理人:

谢磊

PDF下载: PDF下载
内容摘要

一种对内存重复释放进行定位的方法和装置。该方法包括:在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息;将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息;在释放内存之前,检测该内存的头部标识信息;如果所述头部标识信息发生改变,则确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。本发明不仅操作简单,耗时短,并且检测出内存重复释放后能够快速定位存在内存重复释放的问题所在。

权利要求书

权利要求书
1.  一种用于对内存重复释放进行定位的方法,其特征在于,包括以下步骤:
申请内存时,在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息;
将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息;
在释放内存之前,检测该内存的头部标识信息;
如果所述头部标识信息为不同于所述第一标志的第三标志,则确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。

2.  根据权利要求1所述的方法,其特征在于,所述方法还包括:
如果所述头部标识信息为所述第一标志,则确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。

3.  根据权利要求1所述的方法,其特征在于,所述保存调用申请内存的函数信息,包括:
保存调用申请内存的函数地址及在代码中对应的行数。

4.  根据权利要求1或2所述的方法,其特征在于,所述内存头部信息还包括:内存实际申请大小、调用申请内存的函数地址及行数,以及调用释放内存的函数地址及行数;所述头部标识信息还用于确认申请内存的起始位置,且所述将头部标识信息初始化为第一标志,包括:将所述头部标识信息初始化为一特殊数字。

5.  根据权利要求3所述的方法,其特征在于,所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息,包括:将调用本次释放的函数名及在代码中对应的行数,以及调用首次释放的函数名及在代码中对应的行数进行打印显示,并禁止本次释放;
其中,所述函数名由函数信息中的函数地址翻译而成。

6.  根据权利要求2所述的方法,其特征在于,所述扩展区还用于保存内存尾部信息,所述内存尾部信息包括:用于确认申请内存的结束位置的尾部标识信息,在申请内存时,除了将所述头部标识信息初始化为第一标志,还将所述尾部标识信息初始化为第二标志,并且将申请的内存加入到内存链表中;
所述执行内存释放包括:将尾部标识信息设置为不同于第二标识的第四标志,表示内存被释放的结束,将释放的内存从内存链表中删除。

7.  一种用于对内存重复释放进行定位的装置,其特征在于,包括以下模块:
内存申请模块,用于在申请内存时,在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息;
内存信息初始化模块,用于将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息;
释放检测模块,用于在释放内存之前,检测该内存的头部标识信息;
重复释放处理模块,用于在所述头部标识信息为不同于所述第一标志的第三标志时,确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。

8.  根据权利要求7所述的装置,其特征在于,还包括首次释放处理模块,用于在所述头部标识信息为所述第一标志时,确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。

9.  根据权利要求7所述的装置,其特征在于,所述保存调用申请内存的函数信息,包括:
保存调用申请内存的函数地址及在代码中对应的行数。

10.  根据权利要求9所述的装置,其特征在于,所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息,包括:
将调用本次释放的函数名及在代码中对应的行数,以及调用首次释放的函数名及在代码中对应的行数进行打印显示,并禁止本次释放。

说明书

说明书对内存重复释放进行定位的方法和装置
技术领域
本发明涉及程序开发领域,特别涉及对内存重复释放进行定位的方法和装置。
背景技术
当今IT行业,代码开发中最频繁的使用之一就是内存的申请与释放。如果出现内存申请后,已经在其他地方释放,又存在再次释放此内存的情况,就会出现重复两次释放同一块内存,导致出现异常。内存重复释放问题一直是困扰开发者定位问题的一大难题,出现内存重复释放的情况后往往需要开发者花费大量的时间去查找内存重复释放的地方,既费时又费力。
操作系统一般通过垃圾回收算法来对内存进行回收。垃圾回收线程在系统空闲的时候从系统的根集出发,定位所有在使用的内存,并将总内存池中未被使用的内存回收,虽然可以实现异步的非精确性的内存回收,但是由于垃圾回收线程运行受限于系统的忙闲程度,无法彻底解决内存泄露问题。
现有的对内存重复释放进行定位的解决方案主要有:申请业务内存时,申请与业务内存相关的关联内存;在释放业务内存之前或同时,获得关联内存的地址;检测是否为重复释放,如果是重复释放,则将当前运行环境记录到指定记录区,并将关联内存的内容转储到指定记录区,通过分析指定记录区的记录,进行重复释放定位,如果不是重复释放,则将当前运行环境记录到关联内存中。
容易看出,上述解决方案必须要申请关联内存,将关联内存的内容转储到指定记录区,通过分析指定记录区的记录,才能定位重复释放的地方。其不仅操作复杂,并且缺少精确性和具体性。
发明内容
本发明的目的是提供一种对内存重复释放进行定位的方法和装置,能够输出内存重复释放的具体函数和代码行,便于快速定位。
根据本发明的一个方面,提供了一种用于对内存重复释放进行定位的方法,其特征在于,包括以下步骤:
申请内存时,在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息;
将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息;
在释放内存之前,检测该内存的头部标识信息;
如果所述头部标识信息为不同于所述第一标志的第三标志,则确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。
优选地,所述方法还包括:
如果所述头部标识信息为所述第一标志,则确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。
优选地,所述保存调用申请内存的函数信息包括:
保存调用申请内存的函数地址及在代码中对应的行数。
优选地,所述内存头部信息还包括:内存实际申请大小、调用申请内存的函数地址及行数,以及调用释放内存的函数地址及行数;所述头部标识信息还用于确认申请内存的起始位置,且所述将头部标识信息初始化为第一标志,包括:将所述头部标识信息初始化为一特殊数字。
优选地,所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息,包括:将调用本次释放的函数名及在代码中对应的行数,以及调用首次释放的函数名及在代码中对应的行数进行打印显示,并禁止本次释放;其中,所述函数名由函数信息中的函数地址翻译而成。
优选地,所述扩展区还用于保存内存尾部信息,所述内存尾部信息包括:用于确认申请内存的结束位置的尾部标识信息,在申请内存时,除了 将所述头部标识信息初始化为第一标志,还将所述尾部标识信息初始化为第二标志,并且将申请的内存加入到内存链表中;所述执行内存释放包括:
将尾部标识信息设置为不同于第二标识的第四标志,表示内存被释放的结束,将释放的内存从内存链表中删除。
根据本发明的另一方面,提供了一种用于对内存重复释放进行定位的装置,其特征在于,包括以下模块:
内存申请模块,用于在申请内存时,在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息;
内存信息初始化模块,用于将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息;
释放检测模块,用于在释放内存之前,检测该内存的头部标识信息;
重复释放处理模块,用于在所述头部标识信息为不同于所述第一标志的第三标志时,确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。
优选地,还包括首次释放处理模块,用于在所述头部标识信息为所述第一标志时,确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。
优选地,所述保存调用申请内存的函数信息,包括:
保存调用申请内存的函数地址及在代码中对应的行数。
优选地,所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息,包括:
将调用本次释放的函数名及在代码中对应的行数,以及调用首次释放的函数名及在代码中对应的行数进行打印显示,并禁止本次释放。
通过采用本发明技术方案,具有以下优点,不仅操作简单,耗时短,并且检测出内存重复释放后会即时输出。此外,检测效率高,能够直接定位出现问题的函数及代码所在行数。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一 部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的过分限定。其中:
图1显示了根据本发明实施例对内存重复释放进行定位的方法的流程图。
图2显示了根据本发明实施例用于对内存重复释放进行定位的装置的框图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明了,下面结合具体实施方式并参照附图,对本发明进一步详细说明。需要说明的是,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
图1显示了根据本发明实施例的对内存重复释放进行定位的方法的流程图。
如图1所示,本发明提供的对内存重复释放进行定位的方法在检测出内存重复释放后能够直接显示出现问题的函数及代码所在行数,该方法包括:
首先,在申请内存时,额外申请一块内存区域作为扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息。
其中内存头部信息包括:头部标识信息(用于确认申请内存的起始位置和申请释放情况)、去掉头尾的内存实际申请大小、调用申请内存的函数地址及在代码中对应的行数等信息、释放该内存的函数地址及在代码中对应的行数等信息。
将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息。
具体地,在申请内存之后,将上面所描述的头部标识信息设置为特殊数字,用来表示内存被使用的开始;保存调用申请内存的函数地址及其所对应的代码中的行数。
在释放内存之前,检测该内存的头部标识信息。
如果所述头部标识信息为不同于所述第一标识标志的第三标志,则确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。
如果头部标识信息为内存被释放的标记,即另一个特殊数字,则认为该内存发生内存重复释放,会立刻打印提示该内存重复释放,将本次释放的函数名(可通过函数地址翻译成函数名)及在代码中对应的行数和内存头中保存的上次(即首次)释放的函数名及在代码中对应的行数显示出来,并禁止释放操作。
此外,如果所述头部标识信息为所述第一标志,则确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。
具体而言,在首次释放该内存之前,将上面所描述的头部标识信息设置为另一个特殊数字,用来表示内存被释放的开始;保存调用释放内存的函数地址及其所对应的代码中的行数;并将尾部标识信息也设置为另一个特殊数字,用来表示内存被释放的结束;
优选地,所述扩展区还用于保存内存尾部信息,所述内存尾部信息包括:用于确认申请内存的结束位置的尾部标识信息,在申请内存时,除了将所述头部标识信息初始化为第一标志,还将所述尾部标识信息初始化为第二标志,并且将申请的内存加入到内存链表中;
具体地,通过将上面所描述的尾部标识信息设置为特殊数字,用来表示内存被使用的结束,并将申请的内存加入到内存链表中;
最后,所述执行内存释放的过程包括:将尾部标识信息设置为不同于第二标识的第四标志,表示内存被释放的结束,将释放的内存从内存链表中删除,完成释放。
本领域技术人员应当理解,本发明所应用的链表类型可以视具体的数据存取需要来选择,包括但不限于单向链表、双向链表、多维链表及循环链表等。
其中,释放内存可能为首次或重复释放,为进行区分,只需检测该内存的头部标识信息。如头部标识信息为内存被使用标记,即原始的特殊数字,则认为该内存正常,不属于重复释放,可以进行释放操作;
由此,用户通过该显示信息,即可立即定位出内存重复释放的具体函数和位置,作为修改程序代码以避免内存泄漏的重要依据。
为进一步阐述本发明,以下将以具体应用环境和参数为例,具体描述本发明定位重复释放的方法流程。
调用分配函数进行内存分配,指定申请大小;如C语言中的char*p=malloc(size),其中malloc是分配函数,size是分配的大小,p是返回内存块的首地址。在申请内存时,额外申请一块内存区,称为扩展区,用于保存内存的文件头尾部信息,扩展区的大小足以存储内存的文件头尾部信息。
内存头部信息包括以下信息:头部标识信息、内存实际申请大小size、调用申请内存的函数地址及行数、释放该内存的函数地址及行数。其中内存尾部信息包括:尾部标识信息,用于确认申请内存的结束位置。
将上面所描述的头部标识信息设置为“00”,用来表示内存被使用但未被释放。保存调用申请内存的函数地址(假设函数名function1()的地址为0x00000001)及其所对应的代码中的行数(假设为LINE:10021);并将申请的内存加入到内存链表中;将上面所描述的尾部标识信息也设置为特殊数字“01”,用来表示内存被使用的结束。
在首次释放该内存之前,首先会检测到该内存的头部标识信息为“00”,表示可以进行释放,先将上面所描述的头部标识信息设置为“10”,用来表示内存被释放的开始;保存调用释放内存的函数地址0x00000001及其所对应的代码中的行数LINE:10021;并将尾部标识信息也设置为另一个特殊数字“11”,用来表示内存被释放的结束。然后可以调用释放函数free,指定释放块首地址,根据该首地址将释放的内存从内存链表中摘除,完成释放。
若该内存块被释放后,另一函数function2()及对应的代码行数LINE:10216对该内存块第二次释放,首先会检测到该内存的头部标识信息已经为“10”,则确定属于内存重复释放,会立刻打印提示该内存重复释放,将本次释放的函数名function2()及对应的代码行数LINE:10216和内存头中保存的上次释放的函数名function1()及对应的代码行数LINE:10021显示出来,并禁止释放操作。
图2显示了根据本发明实施例用于对内存重复释放进行定位的装置200的框图。根据本发明的另一方面,提供了一种用于对内存重复释放进行定位的装置。该装置200包括以下模块:
内存申请模块,用于在申请内存时,在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息;
内存信息初始化模块,用于将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息;
释放检测模块,用于在释放内存之前,检测该内存的头部标识信息;
重复释放处理模块,用于在所述头部标识信息为不同于所述第一标志的第三标志时,确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。
优选地,还包括首次释放处理模块,用于在所述头部标识信息为所述第一标志时,确定为首次释放,将所述头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行内存释放。
优选地,所述保存调用申请内存的函数信息进一步包括:
保存调用申请内存的函数地址及在代码中对应的行数。
优选地,其中所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息进一步包括:
将调用本次释放的函数名及在代码中对应的行数,以及调用首次释放的函数名及在代码中对应的行数进行打印显示,并禁止本次释放。
综上所述,利用本发明的对内存重复释放进行定位的方法和装置,检测出内存重复释放后能够快速定位出现问题的函数及在代码中对应所在的行数,操作简单,耗时短并且检测效率高。因此不仅提高了资源的利用率,还可以改善用户体验。
显然,本领域的技术人员应该理解,上述的本发明的各模块或各步骤可以用通用的计算系统来实现,它们可以集中在单个的计算系统上,或者分布在多个计算系统所组成的网络上,可选地,它们可以用计算系统可执行的程序代码来实现,从而,可以将它们存储在存储系统中由计算系统来执行。这样,本发明不限制于任何特定的硬件和软件结合。
应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。

对内存重复释放进行定位的方法和装置.pdf_第1页
第1页 / 共10页
对内存重复释放进行定位的方法和装置.pdf_第2页
第2页 / 共10页
对内存重复释放进行定位的方法和装置.pdf_第3页
第3页 / 共10页
点击查看更多>>
资源描述

《对内存重复释放进行定位的方法和装置.pdf》由会员分享,可在线阅读,更多相关《对内存重复释放进行定位的方法和装置.pdf(10页珍藏版)》请在专利查询网上搜索。

1、(10)申请公布号 CN 103914355 A (43)申请公布日 2014.07.09 CN 103914355 A (21)申请号 201410089086.X (22)申请日 2014.03.12 G06F 11/07(2006.01) (71)申请人 汉柏科技有限公司 地址 300384 天津市西青区华苑产业区海泰 西 18 号西 3 楼 104 室 (72)发明人 赵众 (74)专利代理机构 北京天奇智新知识产权代理 有限公司 11340 代理人 谢磊 (54) 发明名称 对内存重复释放进行定位的方法和装置 (57) 摘要 一种对内存重复释放进行定位的方法和装 置。该方法包括 : 。

2、在内存中申请预定大小的扩展 区, 用于保存内存头部信息, 所述内存头部信息包 括用于确认内存申请和释放情况的头部标识信 息 ; 将所述头部标识信息初始化为第一标志, 保 存调用申请内存的函数信息 ; 在释放内存之前, 检测该内存的头部标识信息 ; 如果所述头部标识 信息发生改变, 则确定为重复释放, 根据调用本次 释放的函数信息输出该内存的重复释放的定位信 息。本发明不仅操作简单, 耗时短, 并且检测出内 存重复释放后能够快速定位存在内存重复释放的 问题所在。 (51)Int.Cl. 权利要求书 2 页 说明书 5 页 附图 2 页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 。

3、权利要求书2页 说明书5页 附图2页 (10)申请公布号 CN 103914355 A CN 103914355 A 1/2 页 2 1. 一种用于对内存重复释放进行定位的方法, 其特征在于, 包括以下步骤 : 申请内存时, 在内存中申请预定大小的扩展区, 用于保存内存头部信息, 所述内存头部 信息包括用于确认内存申请和释放情况的头部标识信息 ; 将所述头部标识信息初始化为第一标志, 保存调用申请内存的函数信息 ; 在释放内存之前, 检测该内存的头部标识信息 ; 如果所述头部标识信息为不同于所述第一标志的第三标志, 则确定为重复释放, 根据 调用本次释放的函数信息输出该内存的重复释放的定位信息。

4、。 2. 根据权利要求 1 所述的方法, 其特征在于, 所述方法还包括 : 如果所述头部标识信息为所述第一标志, 则确定为首次释放, 将所述头部标识信息设 置为所述第三标志, 保存调用释放内存的函数信息, 执行内存释放。 3. 根据权利要求 1 所述的方法, 其特征在于, 所述保存调用申请内存的函数信息, 包 括 : 保存调用申请内存的函数地址及在代码中对应的行数。 4. 根据权利要求 1 或 2 所述的方法, 其特征在于, 所述内存头部信息还包括 : 内存实际 申请大小、 调用申请内存的函数地址及行数, 以及调用释放内存的函数地址及行数 ; 所述头 部标识信息还用于确认申请内存的起始位置, 。

5、且所述将头部标识信息初始化为第一标志, 包括 : 将所述头部标识信息初始化为一特殊数字。 5. 根据权利要求 3 所述的方法, 其特征在于, 所述根据调用本次释放的函数信息输出 该内存的重复释放的定位信息, 包括 : 将调用本次释放的函数名及在代码中对应的行数, 以 及调用首次释放的函数名及在代码中对应的行数进行打印显示, 并禁止本次释放 ; 其中, 所述函数名由函数信息中的函数地址翻译而成。 6. 根据权利要求 2 所述的方法, 其特征在于, 所述扩展区还用于保存内存尾部信息, 所 述内存尾部信息包括 : 用于确认申请内存的结束位置的尾部标识信息, 在申请内存时, 除了 将所述头部标识信息初。

6、始化为第一标志, 还将所述尾部标识信息初始化为第二标志, 并且 将申请的内存加入到内存链表中 ; 所述执行内存释放包括 : 将尾部标识信息设置为不同于第二标识的第四标志, 表示内 存被释放的结束, 将释放的内存从内存链表中删除。 7. 一种用于对内存重复释放进行定位的装置, 其特征在于, 包括以下模块 : 内存申请模块, 用于在申请内存时, 在内存中申请预定大小的扩展区, 用于保存内存头 部信息, 所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息 ; 内存信息初始化模块, 用于将所述头部标识信息初始化为第一标志, 保存调用申请内 存的函数信息 ; 释放检测模块, 用于在释放内存之前。

7、, 检测该内存的头部标识信息 ; 重复释放处理模块, 用于在所述头部标识信息为不同于所述第一标志的第三标志时, 确定为重复释放, 根据调用本次释放的函数信息输出该内存的重复释放的定位信息。 8. 根据权利要求 7 所述的装置, 其特征在于, 还包括首次释放处理模块, 用于在所述头 部标识信息为所述第一标志时, 确定为首次释放, 将所述头部标识信息设置为所述第三标 志, 保存调用释放内存的函数信息, 执行内存释放。 9. 根据权利要求 7 所述的装置, 其特征在于, 所述保存调用申请内存的函数信息, 包 权 利 要 求 书 CN 103914355 A 2 2/2 页 3 括 : 保存调用申请内。

8、存的函数地址及在代码中对应的行数。 10. 根据权利要求 9 所述的装置, 其特征在于, 所述根据调用本次释放的函数信息输出 该内存的重复释放的定位信息, 包括 : 将调用本次释放的函数名及在代码中对应的行数, 以及调用首次释放的函数名及在代 码中对应的行数进行打印显示, 并禁止本次释放。 权 利 要 求 书 CN 103914355 A 3 1/5 页 4 对内存重复释放进行定位的方法和装置 技术领域 0001 本发明涉及程序开发领域, 特别涉及对内存重复释放进行定位的方法和装置。 背景技术 0002 当今 IT 行业, 代码开发中最频繁的使用之一就是内存的申请与释放。如果出现内 存申请后,。

9、 已经在其他地方释放, 又存在再次释放此内存的情况, 就会出现重复两次释放同 一块内存, 导致出现异常。 内存重复释放问题一直是困扰开发者定位问题的一大难题, 出现 内存重复释放的情况后往往需要开发者花费大量的时间去查找内存重复释放的地方, 既费 时又费力。 0003 操作系统一般通过垃圾回收算法来对内存进行回收。 垃圾回收线程在系统空闲的 时候从系统的根集出发, 定位所有在使用的内存, 并将总内存池中未被使用的内存回收, 虽 然可以实现异步的非精确性的内存回收, 但是由于垃圾回收线程运行受限于系统的忙闲程 度, 无法彻底解决内存泄露问题。 0004 现有的对内存重复释放进行定位的解决方案主要。

10、有 : 申请业务内存时, 申请与业 务内存相关的关联内存 ; 在释放业务内存之前或同时, 获得关联内存的地址 ; 检测是否为 重复释放, 如果是重复释放, 则将当前运行环境记录到指定记录区, 并将关联内存的内容转 储到指定记录区, 通过分析指定记录区的记录, 进行重复释放定位, 如果不是重复释放, 则 将当前运行环境记录到关联内存中。 0005 容易看出, 上述解决方案必须要申请关联内存, 将关联内存的内容转储到指定记 录区, 通过分析指定记录区的记录, 才能定位重复释放的地方。其不仅操作复杂, 并且缺少 精确性和具体性。 发明内容 0006 本发明的目的是提供一种对内存重复释放进行定位的方法。

11、和装置, 能够输出内存 重复释放的具体函数和代码行, 便于快速定位。 0007 根据本发明的一个方面, 提供了一种用于对内存重复释放进行定位的方法, 其特 征在于, 包括以下步骤 : 0008 申请内存时, 在内存中申请预定大小的扩展区, 用于保存内存头部信息, 所述内存 头部信息包括用于确认内存申请和释放情况的头部标识信息 ; 0009 将所述头部标识信息初始化为第一标志, 保存调用申请内存的函数信息 ; 0010 在释放内存之前, 检测该内存的头部标识信息 ; 0011 如果所述头部标识信息为不同于所述第一标志的第三标志, 则确定为重复释放, 根据调用本次释放的函数信息输出该内存的重复释放。

12、的定位信息。 0012 优选地, 所述方法还包括 : 0013 如果所述头部标识信息为所述第一标志, 则确定为首次释放, 将所述头部标识信 息设置为所述第三标志, 保存调用释放内存的函数信息, 执行内存释放。 说 明 书 CN 103914355 A 4 2/5 页 5 0014 优选地, 所述保存调用申请内存的函数信息包括 : 0015 保存调用申请内存的函数地址及在代码中对应的行数。 0016 优选地, 所述内存头部信息还包括 : 内存实际申请大小、 调用申请内存的函数地址 及行数, 以及调用释放内存的函数地址及行数 ; 所述头部标识信息还用于确认申请内存的 起始位置, 且所述将头部标识信。

13、息初始化为第一标志, 包括 : 将所述头部标识信息初始化为 一特殊数字。 0017 优选地, 所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息, 包括 : 将调用本次释放的函数名及在代码中对应的行数, 以及调用首次释放的函数名及在 代码中对应的行数进行打印显示, 并禁止本次释放 ; 其中, 所述函数名由函数信息中的函数 地址翻译而成。 0018 优选地, 所述扩展区还用于保存内存尾部信息, 所述内存尾部信息包括 : 用于确认 申请内存的结束位置的尾部标识信息, 在申请内存时, 除了将所述头部标识信息初始化为 第一标志, 还将所述尾部标识信息初始化为第二标志, 并且将申请的内存加入到。

14、内存链表 中 ; 所述执行内存释放包括 : 0019 将尾部标识信息设置为不同于第二标识的第四标志, 表示内存被释放的结束, 将 释放的内存从内存链表中删除。 0020 根据本发明的另一方面, 提供了一种用于对内存重复释放进行定位的装置, 其特 征在于, 包括以下模块 : 0021 内存申请模块, 用于在申请内存时, 在内存中申请预定大小的扩展区, 用于保存内 存头部信息, 所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息 ; 0022 内存信息初始化模块, 用于将所述头部标识信息初始化为第一标志, 保存调用申 请内存的函数信息 ; 0023 释放检测模块, 用于在释放内存之前, 。

15、检测该内存的头部标识信息 ; 0024 重复释放处理模块, 用于在所述头部标识信息为不同于所述第一标志的第三标志 时, 确定为重复释放, 根据调用本次释放的函数信息输出该内存的重复释放的定位信息。 0025 优选地, 还包括首次释放处理模块, 用于在所述头部标识信息为所述第一标志时, 确定为首次释放, 将所述头部标识信息设置为所述第三标志, 保存调用释放内存的函数信 息, 执行内存释放。 0026 优选地, 所述保存调用申请内存的函数信息, 包括 : 0027 保存调用申请内存的函数地址及在代码中对应的行数。 0028 优选地, 所述根据调用本次释放的函数信息输出该内存的重复释放的定位信息, 。

16、包括 : 0029 将调用本次释放的函数名及在代码中对应的行数, 以及调用首次释放的函数名及 在代码中对应的行数进行打印显示, 并禁止本次释放。 0030 通过采用本发明技术方案, 具有以下优点, 不仅操作简单, 耗时短, 并且检测出内 存重复释放后会即时输出。 此外, 检测效率高, 能够直接定位出现问题的函数及代码所在行 数。 附图说明 说 明 书 CN 103914355 A 5 3/5 页 6 0031 此处所说明的附图用来提供对本发明的进一步理解, 构成本申请的一部分, 本发 明的示意性实施例及其说明用于解释本发明, 并不构成对本发明的过分限定。其中 : 0032 图 1 显示了根据本。

17、发明实施例对内存重复释放进行定位的方法的流程图。 0033 图 2 显示了根据本发明实施例用于对内存重复释放进行定位的装置的框图。 具体实施方式 0034 为使本发明的目的、 技术方案和优点更加清楚明了, 下面结合具体实施方式并参 照附图, 对本发明进一步详细说明。 需要说明的是, 本申请中的实施例及实施例中的特征可 以相互组合。下面将参考附图并结合实施例来详细说明本发明。 0035 图 1 显示了根据本发明实施例的对内存重复释放进行定位的方法的流程图。 0036 如图 1 所示, 本发明提供的对内存重复释放进行定位的方法在检测出内存重复释 放后能够直接显示出现问题的函数及代码所在行数, 该方。

18、法包括 : 0037 首先, 在申请内存时, 额外申请一块内存区域作为扩展区, 用于保存内存头部信 息, 所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息。 0038 其中内存头部信息包括 : 头部标识信息 (用于确认申请内存的起始位置和申请释 放情况) 、 去掉头尾的内存实际申请大小、 调用申请内存的函数地址及在代码中对应的行数 等信息、 释放该内存的函数地址及在代码中对应的行数等信息。 0039 将所述头部标识信息初始化为第一标志, 保存调用申请内存的函数信息。 0040 具体地, 在申请内存之后, 将上面所描述的头部标识信息设置为特殊数字, 用来表 示内存被使用的开始 ; 保。

19、存调用申请内存的函数地址及其所对应的代码中的行数。 0041 在释放内存之前, 检测该内存的头部标识信息。 0042 如果所述头部标识信息为不同于所述第一标识标志的第三标志, 则确定为重复释 放, 根据调用本次释放的函数信息输出该内存的重复释放的定位信息。 0043 如果头部标识信息为内存被释放的标记, 即另一个特殊数字, 则认为该内存发生 内存重复释放, 会立刻打印提示该内存重复释放, 将本次释放的函数名 (可通过函数地址翻 译成函数名) 及在代码中对应的行数和内存头中保存的上次 (即首次) 释放的函数名及在代 码中对应的行数显示出来, 并禁止释放操作。 0044 此外, 如果所述头部标识信。

20、息为所述第一标志, 则确定为首次释放, 将所述头部标 识信息设置为所述第三标志, 保存调用释放内存的函数信息, 执行内存释放。 0045 具体而言, 在首次释放该内存之前, 将上面所描述的头部标识信息设置为另一个 特殊数字, 用来表示内存被释放的开始 ; 保存调用释放内存的函数地址及其所对应的代码 中的行数 ; 并将尾部标识信息也设置为另一个特殊数字, 用来表示内存被释放的结束 ; 0046 优选地, 所述扩展区还用于保存内存尾部信息, 所述内存尾部信息包括 : 用于确认 申请内存的结束位置的尾部标识信息, 在申请内存时, 除了将所述头部标识信息初始化为 第一标志, 还将所述尾部标识信息初始化。

21、为第二标志, 并且将申请的内存加入到内存链表 中 ; 0047 具体地, 通过将上面所描述的尾部标识信息设置为特殊数字, 用来表示内存被使 用的结束, 并将申请的内存加入到内存链表中 ; 0048 最后, 所述执行内存释放的过程包括 : 将尾部标识信息设置为不同于第二标识的 说 明 书 CN 103914355 A 6 4/5 页 7 第四标志, 表示内存被释放的结束, 将释放的内存从内存链表中删除, 完成释放。 0049 本领域技术人员应当理解, 本发明所应用的链表类型可以视具体的数据存取需要 来选择, 包括但不限于单向链表、 双向链表、 多维链表及循环链表等。 0050 其中, 释放内存可。

22、能为首次或重复释放, 为进行区分, 只需检测该内存的头部标识 信息。如头部标识信息为内存被使用标记, 即原始的特殊数字, 则认为该内存正常, 不属于 重复释放, 可以进行释放操作 ; 0051 由此, 用户通过该显示信息, 即可立即定位出内存重复释放的具体函数和位置, 作 为修改程序代码以避免内存泄漏的重要依据。 0052 为进一步阐述本发明, 以下将以具体应用环境和参数为例, 具体描述本发明定位 重复释放的方法流程。 0053 调 用 分 配 函 数 进 行 内 存 分 配, 指 定 申 请 大 小 ; 如 C 语 言 中 的 char*p malloc(size), 其中 malloc 是。

23、分配函数, size 是分配的大小, p 是返回内存块的首地址。在 申请内存时, 额外申请一块内存区, 称为扩展区, 用于保存内存的文件头尾部信息, 扩展区 的大小足以存储内存的文件头尾部信息。 0054 内存头部信息包括以下信息 : 头部标识信息、 内存实际申请大小 size、 调用申请 内存的函数地址及行数、 释放该内存的函数地址及行数。 其中内存尾部信息包括 : 尾部标识 信息, 用于确认申请内存的结束位置。 0055 将上面所描述的头部标识信息设置为 “00” , 用来表示内存被使用但未被释放。保 存调用申请内存的函数地址 (假设函数名 function1() 的地址为 0x00000。

24、001) 及其所对应 的代码中的行数 (假设为 LINE : 10021) ; 并将申请的内存加入到内存链表中 ; 将上面所描述 的尾部标识信息也设置为特殊数字 “01” , 用来表示内存被使用的结束。 0056 在首次释放该内存之前, 首先会检测到该内存的头部标识信息为 “00” , 表示可以 进行释放, 先将上面所描述的头部标识信息设置为 “10” , 用来表示内存被释放的开始 ; 保 存调用释放内存的函数地址 0x00000001 及其所对应的代码中的行数 LINE : 10021 ; 并将尾 部标识信息也设置为另一个特殊数字 “11” , 用来表示内存被释放的结束。然后可以调用释 放函。

25、数 free, 指定释放块首地址, 根据该首地址将释放的内存从内存链表中摘除, 完成释 放。 0057 若该内存块被释放后, 另一函数 function2() 及对应的代码行数 LINE : 10216 对 该内存块第二次释放, 首先会检测到该内存的头部标识信息已经为 “10” , 则确定属于内存 重复释放, 会立刻打印提示该内存重复释放, 将本次释放的函数名 function2() 及对应的 代码行数 LINE : 10216 和内存头中保存的上次释放的函数名 function1() 及对应的代码行 数 LINE : 10021 显示出来, 并禁止释放操作。 0058 图 2 显示了根据本发。

26、明实施例用于对内存重复释放进行定位的装置 200 的框图。 根据本发明的另一方面, 提供了一种用于对内存重复释放进行定位的装置。该装置 200 包 括以下模块 : 0059 内存申请模块, 用于在申请内存时, 在内存中申请预定大小的扩展区, 用于保存内 存头部信息, 所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息 ; 0060 内存信息初始化模块, 用于将所述头部标识信息初始化为第一标志, 保存调用申 请内存的函数信息 ; 说 明 书 CN 103914355 A 7 5/5 页 8 0061 释放检测模块, 用于在释放内存之前, 检测该内存的头部标识信息 ; 0062 重复释放。

27、处理模块, 用于在所述头部标识信息为不同于所述第一标志的第三标志 时, 确定为重复释放, 根据调用本次释放的函数信息输出该内存的重复释放的定位信息。 0063 优选地, 还包括首次释放处理模块, 用于在所述头部标识信息为所述第一标志时, 确定为首次释放, 将所述头部标识信息设置为所述第三标志, 保存调用释放内存的函数信 息, 执行内存释放。 0064 优选地, 所述保存调用申请内存的函数信息进一步包括 : 0065 保存调用申请内存的函数地址及在代码中对应的行数。 0066 优选地, 其中所述根据调用本次释放的函数信息输出该内存的重复释放的定位信 息进一步包括 : 0067 将调用本次释放的函。

28、数名及在代码中对应的行数, 以及调用首次释放的函数名及 在代码中对应的行数进行打印显示, 并禁止本次释放。 0068 综上所述, 利用本发明的对内存重复释放进行定位的方法和装置, 检测出内存重 复释放后能够快速定位出现问题的函数及在代码中对应所在的行数, 操作简单, 耗时短并 且检测效率高。因此不仅提高了资源的利用率, 还可以改善用户体验。 0069 显然, 本领域的技术人员应该理解, 上述的本发明的各模块或各步骤可以用通用 的计算系统来实现, 它们可以集中在单个的计算系统上, 或者分布在多个计算系统所组成 的网络上, 可选地, 它们可以用计算系统可执行的程序代码来实现, 从而, 可以将它们存。

29、储 在存储系统中由计算系统来执行。这样, 本发明不限制于任何特定的硬件和软件结合。 0070 应当理解的是, 本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的 原理, 而不构成对本发明的限制。 因此, 在不偏离本发明的精神和范围的情况下所做的任何 修改、 等同替换、 改进等, 均应包含在本发明的保护范围之内。 此外, 本发明所附权利要求旨 在涵盖落入所附权利要求范围和边界、 或者这种范围和边界的等同形式内的全部变化和修 改例。 说 明 书 CN 103914355 A 8 1/2 页 9 图 1 说 明 书 附 图 CN 103914355 A 9 2/2 页 10 图 2 说 明 书 附 图 CN 103914355 A 10 。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1