内存泄漏检测程序的算法优化.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
内存泄漏检测程序的算法优化

内存泄漏检测程序的算法优化   内存泄漏检测动态链接库(ResLeak),是白箱测试部门为了检查达梦服务器是否存在内存泄漏的情况而专门开发的。通过在达梦服务器代码中使用该动态链接库,可以很方便的检查出存在内存泄漏的情况,并能保存发生内存泄漏的堆栈信息,方便开发人员定位存在问题的代码。 1、 工作原理   内存泄漏检测动态链接库的工作原理,基于达梦服务器统一的内存管理架构:   达梦服务器的内存管理系统有利于控制使用的内存总量,及加快内存释放和申请的速度。系统对不同的内存需求采用不同的方式,如系统缓冲区,由于在系统运行时大小不会改变,所以就直接利用OS的malloc/free调用,对大量的动态申请/释放, 则采用标准的“Buddy System”模式来管理内存池。对于前一种方式,统一调用函数 void* os_malloc(ulint n_size)   从操作系统中分配指定大小的内存块,调用函数 void* os_free(void* p)   释放指定首地址的内存块;对于后一种方式,系统首先通过前一种方式申请一块固定大小的内存池,单独对此共享内存池进行管理,达梦服务器退出时再调用os_free释放掉整个内存池,其他模块可以直接从该共享内存池上分配内存,统一调用函数 void* mem_malloc(ulint size_in_bytes)   从共享内存池分配指定大小的内存块,调用函数 void mem_free(void* p)   释放指定首地址的内存块,注意,这里释放内存并不是把该内存块返回给操作系统,而是返回给达梦的内存管理系统。   由于达梦服务器的所有内存分配和释放的操作都统一在上面这四个函数中,这样就可以简单的修改这四个函数,在分配一块内存成功之后,保存其首地址、大小、堆栈跟踪等信息,在释放某一内存块时,删除其相关的保存信息;最后,在达梦服务器正常退出时,如果存在内存泄漏的情况,则把没有正常释放的内存块相关的保存信息打印出来,便于开发人员进行代码分析。 2、 调用接口和数据结构   内存泄漏检测动态链接库提供的头文件resleak.h定义了所申请内存块的相关信息结构: typedef struct leak_struct leak_t; struct leak_struct{ void*???p;????????? //要跟踪的指针 char*???callstack[MAX_LEVEL];?? //堆栈跟踪信息,MAX_LEVEL宏定义为10 int????level;???????? //堆栈深度 char??????? time[128];??????? //内存块申请时间 unsigned int?????? size;?????????????????? //内存块申请大小 unsigned int?????? thrdid;???????????????? //当前线程ID int??????????????? type;?????????????????? //申请方式,区分os_malloc和mem_malloc int??????????????? nChanged;?????????????? //linux下用于堆栈跟踪信息转换的标志 struct leak_struct*?next; };   该数据结构定义的变量用于保存达梦服务器申请内存时的相关信息,并用一个单向链表串联起来。该单向链表的起始长度为1,在调用初始化接口leak_init函数时创建了一个头结点,当达梦服务器申请新的内存时,则创建新的信息结点,插入到该链表中,而在达梦服务器释放内存时,则遍历该链表,寻找到对应的信息结点后,将其从该链表中删除。   头文件resleak.h中还申明了动态链接库的调用接口,如下: 1) 初始化函数接口: leak_t* leak_init(); 接口功能:创建信息结点链表的头结点,和多线程互斥变量,并返回头结点地址。 2) 退出清理函数接口 void leak_deinit(leak_t*?head); 接口功能:释放链表中所有信息结点和互斥变量 3) 添加信息结点 BOOL add_leak_point(leak_t*?head, void*?p,unsigned int nSize,int nType); 接口功能:申请内存成功后,向信息结点链表中添加该内存块相关的信息结点。 4) 删除信息结点 BOOL release_leak_point(leak_t*?head, void*?p,int nType); 接口功能:释放内存成功后,在信息结点链表中删除该内存块相关的信息结点。 5) 保存未释放信息结点的堆栈信息到文件中 BOOL write_leak_to_file

文档评论(0)

sh4125733 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档