【IT专家网独家】内存泄漏检测动态链接库(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; }; |

