学过C语言的都知道,如果发生内存泄漏是一件很可怕的事情,如果能够对系统的资源进行跟踪记录可以方便以后查看程序的bug(内存泄漏导致的),何乐而不为呢?呵呵,首先我介绍下我的思想:利用申请系统资源和释放系统资源地址的一致性,我们可以查看资源分配的记录,依次剔除地址成对出现的,剩下的要么没有释放资源或者重复释放(呵呵),为以后查看bug提供依据(大型服务器内存泄漏多可怕啊 ,重新检查代码?不可能吧.....),我对系统函数进行简单封装,对运行中的程序记录状态包括记录行号、被调用函数名、调用malloc返回的地址、文件名和时间(以后还可加其他信息),然后保存在本地磁盘中,好了,废话不多说了,仔细分析代码吧,如果哪位弟兄愿意写个程序,专门分析这个记录的日志,对成对出现的地址进行过滤掉,实在是太好不过了,那就不要用人眼一个一个找了,愿意写的联系小弟我,邮箱:skyingshang@126.com

1.先贴出我头文件的定义,“jlib.h”,小弟不才,欢迎拍砖。

View Code
 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”

View Code
 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.贴出主函数调用演示,跟踪资源分配情况,记录在本地磁盘中。

View Code
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.贴出记录截图:

 

posted on 2013-03-10 23:50  Jason_shang  阅读(1352)  评论(2编辑  收藏  举报