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

阅读: 评论:0

著录项
  • CN201410089086.X
  • 20140312
  • CN103914355A
  • 20140709
  • 汉柏科技有限公司
  • 赵众
  • G06F11/07
  • G06F11/07

  • 天津市西青区华苑产业区海泰西18号西3楼104室
  • 天津(12)
  • 北京天奇智新知识产权代理有限公司
  • 谢磊
摘要
一种对内存重复释放进行定位的方法和装置。该方法包括:在内存中申请预定大小的扩展区,用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信息;将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信息;在释放内存之前,检测该内存的头部标识信息;如果所述头部标识信息发生改变,则确定为重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信息。本发明不仅操作简单,耗时短,并且检测出内存重复释放后能够快速定位存在内存重复释放的问题所在。
权利要求

1.一种用于对内存重复释放进行定位的方法,其特征在于,包括以下 步骤:

申请内存时,在内存中申请预定大小的扩展区,用于保存内存头部信 息,所述内存头部信息包括用于确认内存申请和释放情况的头部标识信 息;

将所述头部标识信息初始化为第一标志,保存调用申请内存的函数信 息;

在释放内存之前,检测该内存的头部标识信息;

如果所述头部标识信息为不同于所述第一标志的第三标志,则确定为 重复释放,根据调用本次释放的函数信息输出该内存的重复释放的定位信 息。

2.根据权利要求1所述的方法,其特征在于,所述方法还包括:

如果所述头部标识信息为所述第一标志,则确定为首次释放,将所述 头部标识信息设置为所述第三标志,保存调用释放内存的函数信息,执行 内存释放。

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

所述执行内存释放包括:将尾部标识信息设置为不同于第二标识的第 四标志,表示内存被释放的结束,将释放的内存从内存链表中删除。

3.根据权利要求1所述的方法,其特征在于,所述保存调用申请内存 的函数信息,包括:

保存调用申请内存的函数地址及在代码中对应的行数。

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

其中,所述函数名由函数信息中的函数地址翻译而成。

4.根据权利要求1或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包括以下模块:

内存申请模块,用于在申请内存时,在内存中申请预定大小的扩展区, 用于保存内存头部信息,所述内存头部信息包括用于确认内存申请和释放 情况的头部标识信息;

内存信息初始化模块,用于将所述头部标识信息初始化为第一标志, 保存调用申请内存的函数信息;

释放检测模块,用于在释放内存之前,检测该内存的头部标识信息;

重复释放处理模块,用于在所述头部标识信息为不同于所述第一标志 的第三标志时,确定为重复释放,根据调用本次释放的函数信息输出该内 存的重复释放的定位信息。

优选地,还包括首次释放处理模块,用于在所述头部标识信息为所述 第一标志时,确定为首次释放,将所述头部标识信息设置为所述第三标志, 保存调用释放内存的函数信息,执行内存释放。

优选地,所述保存调用申请内存的函数信息进一步包括:

保存调用申请内存的函数地址及在代码中对应的行数。

优选地,其中所述根据调用本次释放的函数信息输出该内存的重复释 放的定位信息进一步包括:

将调用本次释放的函数名及在代码中对应的行数,以及调用首次释放 的函数名及在代码中对应的行数进行打印显示,并禁止本次释放。

综上所述,利用本发明的对内存重复释放进行定位的方法和装置,检 测出内存重复释放后能够快速定位出现问题的函数及在代码中对应所在 的行数,操作简单,耗时短并且检测效率高。因此不仅提高了资源的利用 率,还可以改善用户体验。

显然,本领域的技术人员应该理解,上述的本发明的各模块或各步骤 可以用通用的计算系统来实现,它们可以集中在单个的计算系统上,或者 分布在多个计算系统所组成的网络上,可选地,它们可以用计算系统可执 行的程序代码来实现,从而,可以将它们存储在存储系统中由计算系统来 执行。这样,本发明不限制于任何特定的硬件和软件结合。

应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解 释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精 神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发 明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要 求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。

本文发布于:2023-04-13 21:33:04,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/86234.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图