学过C语言的都知道,如果发生内存泄漏是一件很可怕的事情,如果能够对系统的资源进行跟踪记录可以方便以后查看程序的bug(内存泄漏导致的),何乐而不为呢?呵呵,首先我介绍下我的思想:利用申请系统资源和释放系统资源地址的一致性,我们可以查看资源分配的记录,依次剔除地址成对出现的,剩下的要么没有释放资源或者重复释放(呵呵),为以后查看bug提供依据(大型服务器内存泄漏多可怕啊 ,重新检查代码?不可能吧.....),我对系统函数进行简单封装,对运行中的程序记录状态包括记录行号、被调用函数名、调用malloc返回的地址、文件名和时间(以后还可加其他信息),然后保存在本地磁盘中,好了,废话不多说了,仔细分析代码吧,如果哪位弟兄愿意写个程序,专门分析这个记录的日志,对成对出现的地址进行过滤掉,实在是太好不过了,那就不要用人眼一个一个找了,愿意写的联系小弟我,邮箱:skyingshang@126.com:
1.先贴出我头文件的定义,“jlib.h”,小弟不才,欢迎拍砖。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 1 #ifndef jmf 2 2 #define jmf 3 3 4 4 #include <stdlib.h> 5 5 #define _FILENAME "mf.log" 6 6 7 7 extern void* jmalloc(size_t size); 8 8 /*为对象分配资源,不管是否分配成功都会记录在日志文件中,默认mf.log*/ 9 9 10 10 extern void jfree(void *p); 11 11 /*释放资源,不管释放是否成功都会记录在日志文件中,默认mf.log*/ 12 12 13 13 extern void record(char *message,char *filename); 14 14 /*对进行的操作进行记录*/ 15 15 16 16 extern char* getcurtime(); 17 17 18 18 #endif
2.贴出我函数体的实现,文件名“jmf.c”
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 1 /* 2 2 * jmf.c 3 3 * 4 4 * Created on: Mar 10, 2013 5 5 * Author: skyingshang 商宗海 6 6 */ 7 7 #include "jlib.h" 8 8 #include<stdio.h> 9 9 #include<string.h> 10 10 #include<time.h> 11 11 12 12 char* getweekofday(int num); 13 13 14 14 void* jmalloc(size_t size) /*为对象分配资源,记录分配的记录,防止内存泄漏*/ 15 15 { 16 16 char message[200]; 17 17 void *p = malloc(size); 18 18 sprintf(message,"Line : %d\tCall function : %s\tAddress : %p\tFile : %s\t Time :%s", 19 19 __LINE__,__FUNCTION__,p,__FILE__,getcurtime()); 20 20 /*记录行号、被调用函数名、调用malloc返回的地址、文件名和时间,保存到文件中*/ 21 21 message[199]='\0'; /*信息过长,截断操作*/ 22 22 record(message,_FILENAME); /*记录调用*/ 23 23 return p; 24 24 } 25 25 26 26 void record(char *message,char *filename) 27 27 { 28 28 FILE *p; 29 29 char *file; 30 30 if(filename!=NULL && strlen(filename)>0) /*不指定文件名称,用默认名称*/ 31 31 { 32 32 p = fopen(filename,"a"); /*打开文件,文件不存在重新创建,存在追加操作*/ 33 33 if(p == NULL) fprintf(stderr,"can't open file %s.",filename); 34 34 file = filename; /*记录文件名称*/ 35 35 } 36 36 else 37 37 { 38 38 p = fopen(_FILENAME,"a");/*打开文件,文件不存在重新创建,存在追加操作*/ 39 39 if(p == NULL) fprintf(stderr,"can't open file %s.",_FILENAME); 40 40 file = _FILENAME; /*记录文件名称*/ 41 41 } 42 42 fprintf(p,"%s.\n",message);/*记录存盘处理,自动追加新行(newline)*/ 43 43 if(fclose(p) != 0) fprintf(stderr,"can't close file %s.",file);/*关闭文件出错提示*/ 44 44 } 45 45 46 46 47 47 void jfree(void *p) /*为对象释放资源,记录释放的记录,防止内存泄漏*/ 48 48 { 49 49 char message[200]; 50 50 sprintf(message,"Line : %d\tCall function : %s\tAddress : %p\tFile : %s\t Time :%s", 51 51 __LINE__,__FUNCTION__,p,__FILE__,getcurtime()); 52 52 /*记录行号、被调用函数名、调用malloc返回的地址、文件名和时间,保存到文件中*/ 53 53 message[199]='\0'; 54 54 record(message,_FILENAME);/*记录调用*/ 55 55 free(p); 56 56 } 57 57 58 58 char* getcurtime() 59 59 { 60 60 static char str[35]; 61 61 struct tm* timeNow; 62 62 time_t now; 63 63 time(&now); 64 64 timeNow = localtime(&now); 65 65 sprintf(str,"%d-%02d-%d %d:%02d:%d %s",(timeNow->tm_year+1900), 66 66 (timeNow->tm_mon+1),timeNow->tm_mday,timeNow->tm_hour, 67 67 timeNow->tm_min,timeNow->tm_sec,getweekofday(timeNow->tm_wday)); 68 68 /*记录日期的格式:2013-03-10 23:09:39 Mon*/ 69 69 return str; 70 70 } 71 71 72 72 char* getweekofday(int num) 73 73 { 74 74 if(num < 0) exit(1); 75 75 static char wday[5]; 76 76 if(num%7 == 0) strcpy(wday,"Sun"); 77 77 else if(num%7 == 1) strcpy(wday,"Mon"); 78 78 else if(num%7 == 2) strcpy(wday,"Tue"); 79 79 else if(num%7 == 3) strcpy(wday,"Wed"); 80 80 else if(num%7 == 4) strcpy(wday,"Thu"); 81 81 else if(num%7 == 5) strcpy(wday,"Fri"); 82 82 else if(num%7 == 6) strcpy(wday,"Sat"); 83 83 return wday; 84 84 }
3.贴出主函数调用演示,跟踪资源分配情况,记录在本地磁盘中。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include "jlib.h" 2 #include <malloc.h> 3 4 #define CANCEL 5 6 int main(void) 7 { 8 #ifdef CANCEL 9 char *p =(char *)jmalloc(sizeof(int)); 10 /*分配资源,已经被记录了*/ 11 jfree(p); 12 /*释放资源,已经被记录了*/ 13 #endif 14 15 printf("OK..."); 16 17 return 0; 18 }
4.贴出记录截图: