写程序的过程中,debug是不可避免的,printf可以说是最常用的debug方法(当然还有其它...),不过若是程序里面printf满天飞的 话,将是一件非常头疼的事情,最后发布时printf怎么处理?我在实际的工作中做了一套trace模块,便于调试,与大家分享,也希望大家一起来补充完 善它。
使用方法就不说了,看源码。
- #ifndef __CS_TRACE_H__
- #define __CS_TRACE_H__
-
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
-
-
- #define CLR_BLACK 0
- #define CLR_RED 1
- #define CLR_GREEN 2
- #define CLR_MAGENTA 3
- #define CLR_BLUE 4
- #define CLR_PINK 5
- #define CLR_CYAN 6
- #define CLR_WHITE 7
- #define CLR_NONE 8
- #define CLR_DEFAULT 8
-
-
- #define DBG_NONE 0
- #define DBG_MESSAGE 1
- #define DBG_FATAL 2
- #define DBG_ERROR 3
- #define DBG_WARNNING 4
- #define DBG_NOTICE 5
- #define DBG_INFO 6
- #define DBG_DEBUG 7
- #define DBG_LOG 8
- #define DBG_VERBOSE 9
- #define DBG_MIN DBG_NONE
- #define DBG_MAX DBG_VERBOSE
-
- #define CS_TRACE_DFT 0 /* default solution */
- #define CS_TRACE_FTP 1 /* ftp solution */
-
- #define CS_LOG_FILE "/tmp/cs_log.txt" /* log file */
-
-
- #define cs_message(format, arg...) cs_printf( CS_TRACE_DFT, DBG_MESSAGE, format, ##arg )
- #define cs_fatal(format, arg...) cs_printf( CS_TRACE_DFT, DBG_FATAL, format, ##arg )
- #define cs_error(format, arg...) cs_printf( CS_TRACE_DFT, DBG_ERROR, format, ##arg )
- #define cs_warning(format, arg...) cs_printf( CS_TRACE_DFT, DBG_WARNING, format, ##arg )
- #define cs_notice(format, arg...) cs_printf( CS_TRACE_DFT, DBG_NOTICE, format, ##arg )
- #define cs_info(format, arg...) cs_printf( CS_TRACE_DFT, DBG_INFO, format, ##arg )
- #define cs_debug(format, arg...) cs_printf( CS_TRACE_DFT, DBG_DEBUG, format, ##arg )
- #define cs_log(format, arg...) cs_printf( CS_TRACE_DFT, DBG_LOG, format, ##arg )
- #define cs_verbose(format, arg...) cs_printf( CS_TRACE_DFT, DBG_VERBOSE, format, ##arg )
- #define cs_logf(format, arg...) cs_logfile( CS_TRACE_DFT, DBG_LOG, format, ##arg )
-
- int cs_init(char *magic, int debug, int log, int fg, int bg, char *fname);
-
-
- #if defined(__cplusplus)
- }
- #endif
-
- #endif /* __CS_TRACE_H__ */
源码文件trace.c:
- #include <stdarg.h>
- #include <stdio.h>
- #include <errno.h>
- #include <time.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include <trace.h>
-
- typedef struct {
- char magic[3];
- int dlevel;
- int llevel;
- int fg;
- int bg;
- }cs_unit;
-
-
- cs_unit _cs_solution[] = {
- { "csn", DBG_VERBOSE, DBG_INFO, CLR_WHITE, CLR_RED },
- { "ftp", DBG_VERBOSE, DBG_VERBOSE, CLR_WHITE, CLR_BLACK },
- };
-
- static char _logfile[1024];
- static char _magic[3] = "_";
- static int _fgcolor = CLR_CYAN + 30;
- static int _bgcolor = CLR_BLUE + 40;
- static int _dlevel = DBG_MAX;
- static int _llevel = DBG_MIN;
- static int _cs_inited = 0;
- static int _solulen = sizeof(_cs_solution)/sizeof(_cs_solution[0]);
-
-
-
-
-
-
-
-
-
-
-
-
- char *cs_strtime(char *buf)
- {
- struct tm ltm;
- time_t t;
-
- t = time(NULL);
- bzero(<m, sizeof(ltm));
- localtime_r(&t, <m);
- sprintf(buf, "%02d:%02d:%02d", ltm.tm_hour, ltm.tm_min, ltm.tm_sec);
-
- return buf;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int cs_init(char *magic, int debug, int log, int fg, int bg, char *fname)
- {
- _magic[0] = magic[0];
- _magic[1] = magic[1];
- _magic[2] = magic[2];
- _magic[3] = '\0';
- _fgcolor = 30 + fg;
- _bgcolor = 40 + bg;
- _dlevel = debug;
- _llevel = log;
- _cs_inited = 1;
- strcpy(_logfile, fname);
-
- return 0;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int cs_printf(int index, int level, char *format, ...)
- {
- int fg = 0;
- int bg = 0;
- int dlevel = 0;
- int llevel = 0;
- char *fname = 0;
- char *ps = 0;
- char *ts = 0;
- char *magic = 0;
- char msgbuf[1024];
- char timbuf[32];
- va_list valst;
-
- ts = cs_strtime(timbuf);
- ps = msgbuf;
- fname = CS_LOG_FILE;
- if ( strlen(_logfile) ) {
- fname = _logfile;
- }
-
- cs_unit *pm = _cs_solution;
- if(index) {
- if(index < _solulen) {
- pm += index;
- }
- fg = pm->fg + 30;
- bg = pm->bg + 40;
- magic = pm->magic;
- dlevel = pm->dlevel;
- llevel = pm->llevel;
- } else {
- if ( _cs_inited ) {
- fg = _fgcolor;
- bg = _bgcolor;
- magic = _magic;
- dlevel = _dlevel;
- llevel = _llevel;
- } else {
- fg = pm->fg + 30;
- bg = pm->bg + 40;
- magic = pm->magic;
- dlevel = pm->dlevel;
- llevel = pm->llevel;
- }
- }
-
- va_start( valst, format );
-
-
- if( level <= dlevel ) {
- fprintf(stderr, "[%d;%dm[%s|%s][0m ", fg, bg, magic, ts);
- vfprintf(stderr, format, valst);
- }
-
-
- if(level <= llevel) {
- if(level) { ps += sprintf(ps, "[%s|%s] ", magic, ts); }
- vsprintf(ps, format, valst);
-
- FILE *fp = fopen(fname, "at");
- if(fp) {
- int len = strlen(ps);
- fwrite(ps, 1, len, fp);
- fclose(fp);
- }
- }
-
- va_end(valst);
-
- return 0;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int cs_logfile(int index, int level, char *format, ...)
- {
- int llevel = 0;
- char *fname = 0;
- char *ps = 0;
- char msgbuf[1024];
- va_list valst;
-
- ps = msgbuf;
- fname = CS_LOG_FILE;
- if ( strlen(_logfile) ) {
- fname = _logfile;
- }
-
- cs_unit *pm = _cs_solution;
- if(index) {
- if(index < _solulen) {
- pm += index;
- }
- llevel = pm->llevel;
- } else {
- if ( _cs_inited ) {
- llevel = pm->llevel;
- } else {
- llevel = _llevel;
- }
- }
-
-
- if(level <= llevel) {
- va_start( valst, format );
- vsprintf(ps, format, valst);
- va_end(valst);
-
- FILE *fp = fopen(fname, "at");
- if(fp) {
- int len = strlen(ps);
- fwrite(ps, 1, len, fp);
- fclose(fp);
- }
- }
-
- return 0;
- }
(stavy.sun) |