一种内存监控管理的方法及系统的制作方法

文档序号:6611850阅读:150来源:国知局
专利名称:一种内存监控管理的方法及系统的制作方法
技术领域
本发明涉及软件技术领域,尤其涉及内存监控管理技术领域。
背景技术
C语言没有内存回收管理机制和内存访问越界检查,因此应用程序开发人 员在进行程序设计时,较容易遇到内存泄漏和内存非法访问的问题。
内存泄露主要由于不断分配的内存无法及时地被释放,久而久之,系统的
内存耗尽。造成内存泄露的原因比较多,有可能这本身是库中的bug,也有可
能是因为程序员没有正确理解它们的接口说明文档造成错用等。
内存非法访问是指软件在进行内存访问时引起的错误,这种错误总体表现
为两种形式 一种是读写地址引用错误;另一种是读写权限违反许可。
总之,由于内存泄漏和内存非法访问是发生在程序的运行期,因此出现这
类问题后,定位到相关源代码往往比较困难。

发明内容
本发明提供一种内存监控管理的方法及系统,用以解决内存泄露和内存非 法访问的定位问题。
本发明提供了一种内存监控管理的方法,包括
A、 将内存管理模块集成到应用程序中;
B、 所述内存管理模块对应用程序运行时的内存分配与访问进行监控,跟 踪记录内存泄漏和/或非法访问信息;
C、 定期上报所述内存泄露和/或非法访问信息给用户,以便于用户根据所
述内存泄露和/或非法访问信息定位到相关代码。
进一步地,上述方法中,所述步骤A具体包括
Al、将内存管理模块源代码添加到目标工程中; A2、引入重载函数;
A3、在程序初始化启动时根据应用程序实际需求,创建一预定大小的内存
池;
A4、设置内存检测定时器。
进一步地,上述方法中,所述步骤A还包括
A5、设置—-MEM—DEBUG—编译选项,该选项可以控制应用程序编译时是否 集成内存管理模块,编译目标工程。 进一步地,所述步骤A3具体包括
利用边界保护方法,在内存池两端各预留预定大小的保护边界空间; 利用伙伴算法将内存划分成多个内存块,所述内存块包含内存管理信息块 和应用程序数据内存块。 所述步骤A3还包括
将所述内存块同时挂接在红黑树和宏定义链表上。
所述内存管理信息块中记录有内存分配的上下文信息,所述上下文信息包
括源代码文件名称和所在行号。
进一步地,所述步骤C具体包括
定期上报所述内存泄露和/或非法访问信息给用户;
用户对所述内存非法访问信息分析进行分析,定位内存非法访问代码行; 和/或,比较前后内存泄露信息的差异来诊断是否存在内存泄漏,定位内存泄漏 代码行。
本发明还提供了一种内存监控管理的系统,包括
内存管理模块,用于对应用程序运行时的内存分配与访问进行监控,跟踪
记录内存泄漏和/或非法访问信息;
集成模块,用于将内存管理模块集成到应用程序中;
信息上报模块,用于定期上报所述内存泄露和/或非法访问信息给用户,以 便于用户根据所述内存泄露和/或非法访问信息定位到相关代码。
进一步地,上述系统中,所述集成模块具体包括
源代码添加单元,用于将内存管理模块源代码添加到目标工程中; 函数重载单元,用于引入重载函数;
内存池创建单元,用于在程序初始化启动时根据应用程序实际需求,创建 一预定大小的内存池。
所述内存池包括两端保护边界空间和多个内存块,所述内存块包括内 存管理信息块和应用程序数据内存块;
内存管理信息块,用于记录内存分配的上下文信息,所述上下文信息包括 源代码文件名称和所在行号;
应用程序数据内存块,用于存储应用程序的数据。
所述内存块同时桂接在红黑树和宏定义链表上。
综上所述,本发明实施例提供了一种内存监控管理的方法及系统,通过使 用内存池、伙伴算法、红黑树算法以及宏定义链表这几项关键技术,在很大程 度上保证了应用程序内存使用安全,提高了内存分配效率,利用内存管理信息 块跟踪记录内存分配使用信息,在发生内存非法使用时,及时记录运行时日志, 为开发人员分析定位问题提供充分依据,能够节约很大一部分开发调试时间。


图1为本发明实施例所述内存管理模块集成的流程示意图2为本发明实施例所述内存池的结构示意图; 图3为本发明实施例所述系统的结构示意图。
具体实施例方式
本发明实施例的目的是为C语言(包括VC、 0++等)应用程序开发者提供
一种高效的内存监控和管理模块,该模块可以集成到应用程序中,并对应用程
序运行时的内存分配与访问进行监控,跟踪记录内存泄漏和非法访问信息,为
开发人员快速准确定位程序问题提供回溯依据。
下面结合附图对本发明实施例所述方法进行详细说明。 首先,将内存管理^t块集成到应用程序中;具体如图l所示,图l为内存 管理模块集成到应用程序的流程示意图,具体包括以下步骤
步骤101:将内存管理模块源代码添加到目标工程中。
步骤102:在目标C文件中增加并include "./mem/dmal loc. h"引用,引入 重载函数;具体的说就是,对C语言库最基本的内存分配、释放、复制、设置、 比较函数和字符串操作函数作宏定义重载,即用自定义的mem_alloc函数系列 对系统的malloc等内存操作函数进行封装,增加内存使用监控代码,再以封 装后的代码替换原函数的实现,从而实现函数的宏定义重载,以下简称重载函 数。
<吏用自定义的mem—al loc重载mal loc的示例 #undef malloc
#define malloc(size) mem_alloc ((size), —FILE—, —LINE—)
通过重载函数策略,内存监控模块确保了重载前后应用程序对C语言库函
数的接口调用的 一致性,同时也实现了内存管理模块的自定义功能。
步骤103:在程序初始化启动时根据应用程序实际需求,创建一定大小的 内存池;
步骤104:设置内存检测定时器;
步骤105:设置—MEM_DEBUG——编译选项,该选项可以控制应用程序编译时 是否集成内存管理模块,编译目标工程。
其中,步骤103中,创建内存池的过程具体包括
采用在内存池的边界设置SAFE_MARGIN (边界保护)的方法,在内存池两 端各预留一定大小(如1M)的保护边界空间,具体应用中可以才艮据实际情况修 改保护空间的大小,确保该内存块的安全;
利用伙伴算法对大内存块进行细分,每块内存块包含一个内存管理信息块 (area-t)和应用程序数据内存块(data),内存管理信息块中记录了内存分 配时的源文件、代码行、分配时间、使用标志和内存块大小的级别,为内存泄 漏检查和内存使用监控提供依据;
将所述内存块同时挂接在红黑树和宏定义链表上。 上述对分配一整块内存块(系统预定义大小)进行细分后的内存池结构, 具体如图2所示。
当应用程序调试启动后,定期上报所述内存泄露和/或非法访问信息给用 户,以便于用户根据所述内存泄露和/或非法访问信息定位到相关代码,包括 定期上报所述内存泄露和/或非法访问信息给用户;
用户对所述内存非法访问信息分析进行分析,定位内存非法访问代码行; 和/或,比较前后内存泄露信息的差异来诊断是否存在内存泄漏,定位内存泄漏 代码行。
具体的说就是,在应用程序调时过程中,内存管理模块对所述内存块的状 况进行监控,并定期上报内存泄露和/或非法访问信息,将内存非法访问信息记
录在内存非法访问日志文件(如dmem. log文件)中,该文件记录了内存越界 访问、访问无效指针、内存重复分配代码所在源文件、源代码行号和操作的内 存地址;将内存泄漏信息记录在内存泄露日志文件(如memleak文件)中,该 文件记录了内存分配代码所在源文件、源代码行号、4乘作的内存地址、内存分 配时间和分配的内存块大小。
这样,用户可以通过对dmem. log文件的分析,定位内存非法访问;通过 实时监控memleak文件内容的变化,定位内存泄漏问题。具体的内存泄漏定位 方法是启动监控^t块进入稳定状态后,^r查memleak文件记录应用程序初始 化分配的动态内存,之后,按一定时间间隔检查memleak文件日志的变化,比 较前后两次跟踪日志的差异来诊断是否存在内存泄漏,以及定位内存泄漏代码 行。
下面结合附图对本发明实施例所述系统进行详细说明。
如图3所示,本发明实施例所述内存监控管理的系统具体包括内存管理
模块、集成模块、信息上报模块,其中,
内存管理模块,用于对应用程序运行时的内存分配与访问进行监控,跟踪
记录内存泄漏和/或非法访问信息。
集成模块,用于将内存管理模块集成到应用程序中;所述集成模块具体包

源代码添加单元,用于将内存管理模块源代码添加到目标工程中; 函数重载单元,用于引入重载函数;具体的说就是,在目标C文件中增加 弁include "./mem/dmalloc. h"引用,引入重载函数;具体的说就是,对C语言
库最基本的内存分配、释放、复制、设置、比较函数和字符串操作函数作宏定
义重载,即用自定义的mem-alloc函数系列对系统的malloc等内存操作函数 进行封装,增加内存使用监控代码,再以封装后的代码替换原函数的实现,从 而实现函数的宏定义重载;
内存池创建单元,用于在程序初始化启动时根据应用程序实际需求,创建 一预定大小的内存池;所述内存池的结构如图2所示,包括两端保护边界空 间和多个内存块,所述内存块包括内存管理信息块和应用程序数据内存块;
内存管理信息块,用于记录内存分配的上下文信息,所述上下文信息包括 源代码文件名称和所在行号;
应用程序数据内存块,用于存储应用程序的数据。
所述内存块同时挂接在红黑树和宏定义链表上。
信息上报模块,用于定期上报所述内存泄露和/或非法访问信息给用户,以 便于用户根据所述内存泄露和/或非法访问信息定位到相关代码;具体的说就 是,在应用程序调试过程中,所述信息上报模块定期上报内存泄露和/或非法访 问信息,将内存非法访问信息记录在内存非法访问日志文件(如dmem. log文 件)中,该文件记录了内存越界访问、访问无效指针、内存重复分配代码所在 源文件、源代码行号和操作的内存地址;将内存泄漏信息记录在内存泄露曰志 文件(如memleak文件)中,该文件记录了内存分配代码所在源文件、源代码 行号、操作的内存地址、内存分配时间和分配的内存块大小。
综上所述,本发明实施例提供了一种内存监控管理的方法及系统,通过使 用内存池、伙伴算法、红黑树算法以及宏定义链表这几项关键技术,在很大程 度上保证了应用程序内存使用安全,提高了内存分配效率,利用内存管理信息
块跟踪记录内存分配使用信息,在发生内存非法使用时,及时记录运行时日志, 为开发人员分析定位问题提供充分依据,能够节约很大一部分开发调试时间。 本发明实施例所述方法及系统在电信VC项目开发过程中,尤其可以发挥
其重要的作用,由于该项目中对diameter协议的解析使用了大量的动态内存
涉及协议解析部分的内存块通常都比较小,且随着项目的进一步开展,程序的 代码量和复杂度成倍增加,在这种情况下要定位内存泄漏,特别是定位隐示内 存泄漏将变得及其困难。本发明实施例所述方法及系统通过将该工具与工程文 件集成在一起进行开发,通过分析工程中内存使用概况,定时观察程序对内存 的使用情况,很快诊断出内存泄漏所在,并成功解决,为项目的开展带来很有 效的辅助手段。
以上所述,仅为本发明较佳的具体实施方式
,但本发明的保护范围并不局 限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易 想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护 范围应该以权利要求书的保护范围为准。
权利要求
1、一种内存监控管理的方法,其特征在于,包括A、将内存管理模块集成到应用程序中;B、所述内存管理模块对应用程序运行时的内存分配与访问进行监控,跟踪记录内存泄漏和/或非法访问信息;C、定期上报所述内存泄露和/或非法访问信息给用户,以便于用户根据所述内存泄露和/或非法访问信息定位到相关代码。
2、 如权利要求l所述的方法,其特征在于,所述步骤A具体包括Al、将内存管理模块源代码添加到目标工程中; A2、引入重载函数;A3、在程序初始化启动时根据应用程序实际需求,创建一预定大小的内存池;A4、设置内存检测定时器。
3、 根据权利要求2所述的方法,其特征在于,所述步骤A还包括A5、设置—MEM—DEBUG-—编译选项,该选项可以控制应用程序编译时是否 集成内存管理模块,编译目标工程。
4、 根据权利要求2或3所述的方法,其特征在于,所述步骤A3具体包括 利用边界保护方法,在内存池两端各预留预定大小的保护边界空间;利用伙伴算法将内存划分成多个内存块,所述内存块包含内存管理信息块 和应用程序数据内存块。
5、 根据权利要求4所述的方法,其特征在于,所述步骤A3还包括 将所述内存块同时桂接在红黑树和宏定义链表上。
6、 根据权利要求4所述的方法,其特征在于,所述内存管理信息块中记录有内存分配的上下文信息,所述上下文信息包括源代码文件名称和所在行号。
7、 根据权利要求1到3中任意一项所述的方法,其特征在于,所述步骤C 具体包括定期上报所述内存泄露和/或非法访问信息给用户;用户对所述内存非法访问信息分析进行分析,定位内存非法访问代码行; 和/或,比较前后内存泄露信息的差异来诊断是否存在内存泄漏,定位内存泄漏 代码行。
8、 一种内存监控管理的系统,其特征在于,包括内存管理模块,用于对应用程序运行时的内存分配与访问进行监控,跟踪 记录内存泄漏和/或非法访问信息;集成模块,用于将内存管理模块集成到应用程序中;信息上报模块,用于定期上报所述内存泄露和/或非法访问信息给用户,以 便于用户根据所述内存泄露和/或非法访问信息定位到相关代码。
9、 根据权利要求8所述的系统,其特征在于,所述集成模块具体包括源代码添加单元,用于将内存管理模块源代码添加到目标工程中; 函数重载单元,用于引入重载函数;内存池创建单元,用于在程序初始化启动时根据应用程序实际需求,创建 一预定大小的内存池。
10、 根据权利要求9所述的系统,其特征在于,所述内存池包括两端保 护边界空间和多个内存块,所述内存块包括内存管理信息块和应用程序数据 内存块;内存管理信息块,用于记录内存分配的上下文信息,所述上下文信息包括: 源代码文件名称和所在行号; 应用程序数据内存块,用于存储应用程序的数据。
全文摘要
本发明公开了一种内存监控管理的方法及系统,包括A.将内存管理模块集成到应用程序中;B.所述内存管理模块对应用程序运行时的内存分配与访问进行监控,跟踪记录内存泄漏和/或非法访问信息;C.定期上报所述内存泄露和/或非法访问信息给用户,以便于用户根据所述内存泄露和/或非法访问信息定位到相关代码。综上所述,本发明实施例提供了一种内存监控管理的方法及系统,通过跟踪记录内存分配使用信息,在发生内存非法使用或内存泄露时,及时记录运行时日志,为开发人员分析定位问题提供充分依据,能够节约很大一部分开发调试时间。
文档编号G06F9/46GK101110044SQ20071014554
公开日2008年1月23日 申请日期2007年8月28日 优先权日2007年8月28日
发明者郑兴友, 洪 高 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1