Debug_Info跨平台动态库实现(1)
今天过节,放假了,终于有时间可以写写博客了,要不还真不知道什么时候能够继续写下去。
从这次开始我的实现过程,实际上动态库的实现主要考虑的问题有如下一些。
1、文件存储出错的信息,文件不易太大,定义一个限制值。
2、文件大小到达限制大小时,错误信息应该进行自动备份。
3、错误信息规范化,便于以后对错误信息进行分析。
既然是跨平台的开发,那就要特别注意Windows和类Unix系统之间的差别。库尽量用C标准库,如果对C标准库不太清楚地化,可以看一下《C标准库》这本书,主要是一些库的方法,并且有实例。但是我也没有像看一般的书那样从头到尾的看,只是作为工具书来查阅。
一、头文件引入
首先是头文件的引入,<stdio.h><string.h>再熟悉不过了,另外的引入有什么用处呢?
<stdarg.h>是用于定义可接受可变参数列表的函数,可变参数就像printf一样,可以通过定义的format来添加参数列表。
<sys/stat.h>这个不是标准库里的库,是用于获取文件(普通文件,目录,管道,socket,字符,块)的属性。
<time.h>根据库文件名就可以知道与时间相关的。
#include <stdio.h>
#include <stdarg.h>
#include <sys/stat.h>
#include <string.h>
#include <time.h>
此外,有一些引用时只能在windows下才生效的,如下方式引用。主要是与文件夹和文件操作相关的库文件。具体包含的库函数及其功能,在此就不在详细解释了。因为实在太多内容了。
#ifdef _WIN32
#include <direct.h>
#include <io.h>
#endif
二、统一跨平台差异化
引入了头文件之后,按道理来说就可以写我们的函数了,可是会有另外一个跨平台的问题,那就是平台之间库函数的差异性。本文涉及的差异性函数有如下这些,本文利用宏来统一他们之间的差异。这几个函数的具体用途,将在具体的应用中可以知道,单纯的讲这些函数效果不太直观。
#ifdef _WIN32
#define access _access
#define snprintf _snprintf
#define mkdir(a) _mkdir((a))
#else
#define mkdir(a) mkdir((a),0755)
#endif
三、常量定义
首先定义一些常量,方便我们接下来的使用,至于好处吗,大家应该都学过。但是定义的时候,还是要会有些跟以前的不太一样,加入编译时的判断,这是很关键的,因为这可以防止对之前定义的常量失效,往往会带来很大的麻烦。
#ifndef MAX_PATH
#define MAX_PATH 256
#endif
#ifndef MAX_ARGS
#define MAX_ARGS 2048
#endif
#ifndef DEBUG_INFO_FILE_MAXLEN
#define DEBUG_INFO_FILE_MAXLEN 10 *1024*1024
#endif
四、信息结构体定义
为了便于参数传递,以及维护代码的可读性,本文增加了记录信息的结构体类型。
typedef struct{
char* _time; /*Error time*/
int _cat; /*Error category*/
int _code; /*Error code*/
int _module; /*Error module*/
char* _file; /*Error file*/
char* _func; /*Error function*/
int _line; /*Error line*/
}debug_info
五、内部函数定义
int create_dir(char* _pszDir);
int _debug_info_rec(debug_info _debug_info,char *_buffer);
int get_current_time(char* currenttime);
int create_or_bak_file();
函数的功能分别是:
create_dir:用于检测pszDir中的文件夹是否存在,如果不存在,创建它。要考虑到Windows和类Unix系统中分割符的不同。
_debug_info_rec:用于实际的记录信息,利用了错误信息结构,以及可变参数的信息字符串。
get_current_time:获得当前时间,由于多次地方用到。
create_or_bak_file:用于创建文件或者将大于限制大小的文件进行备份,所谓备份就是将名字改一下。
六、全局变量的定义
全局变量的定义如下所示:
//Define global variable of category, default value is 7.
int global_category =7;
//Define global variable of module, default value is -1;
int global_module=-1;
//Define global path directory, default value is NULL;
char global_path[MAX_PATH]="../data/";
//File name of recording debug info
char* debug_info_file_name = "debug_info_DUMP.bug";
//Define global path file name .
char global_path_file_name[MAX_PATH]={0};
//The record number of debug info
int sum_debug_info_rec;
//File of record the debug_info
FILE *debug_info_file;

浙公网安备 33010602011771号