目前公司的项目规模都不算大,但确都是多线程的程序,在调试上还是用最原始的看打印信息的方式,不知道之前有无考虑过gdbserver的方式。但是多线程的东西牵一发动全身,调试工具很多时候也会显得无能为力。在没有更好的调试方法之前,一组好用可靠的DEBUG打印函数能在很大程度上减小DEBUG的难度。最近闲一点,写了一个先贴在这里,不断去完善吧。
#ifndef MODULE_NAME
#define MODULE_NAME "[generic]"
#endif
#if defined(DEBUG_BOTH)
#define TRACE(fmt,arg...) /
do /
{ /
Trace_log(MODULE_NAME,fmt,##arg); /
Trace_print(MODULE_NAME,fmt,##arg); /
}while(0)
#define ERROR(fmt,arg...) /
do /
{ /
Trace_log(MODULE_NAME,fmt,##arg); /
Trace_log(">>FILE","%s/n",__FILE__); /
Trace_log(">>FUNC","%s/n",__FUNCTION__); /
Trace_log(">>LINE","%d/n",__LINE__); /
Trace_print(MODULE_NAME,fmt,##arg); /
Trace_print(">>FILE","%s/n",__FILE__); /
Trace_print(">>FUNC","%s/n",__FUNCTION__); /
Trace_print(">>LINE","%d/n",__LINE__); /
}while(0)
#elif defined(DEBUG_LOG)
#define TRACE(fmt,arg...) /
do /
{ /
Trace_log(MODULE_NAME,fmt,##arg); /
}while(0) /
#define ERROR(fmt,arg...) /
do /
{ /
Trace_log(MODULE_NAME,fmt,##arg); /
Trace_log(">>FILE","%s/n",__FILE__); /
Trace_log(">>FUNC","%s/n",__FUNCTION__); /
Trace_log(">>LINE","%d/n",__LINE); /
}while(0)
#elif defined(DEBUG_PRINT)
#define TRACE(fmt,arg...) /
do /
{ /
Trace_print(MODULE_NAME,fmt,##arg); /
}while(0)
#define ERROR(fmt,arg...) /
do /
{ /
Trace_print(MODULE_NAME,fmt,##arg); /
Trace_print(">>FILE","%s/n",__FILE__); /
Trace_print(">>FUNC","%s/n",__FUNCTION__); /
Trace_print(">>LINE","%d/n",__LINE); /
}while(0)
#else
#define TRACE(fmt,arg...) /
do /
{ /
printf("nothing defined"); /
}while(0)
int Trace_log(const char *pm,const char *fmt,...);
int Trace_print(const char *pm,const char *fmt,...);
int Debug_init();
#endif
#endif
int Trace_log(const char *pm,const char *fmt,...)
{
FILE *fp;
va_list myvar;
fp=fopen("/log/debug.log","a");
if(fp==NULL)
{
return -1;
}
fprintf(fp,"%s:",pm);
va_start(myvar,fmt);
vfprintf(fp,fmt,myvar);
va_end(myvar);
fclose(fp);
}
int Trace_print(const char *pm,const char *fmt,...)
{
va_list myvar;
printf("%s:",pm);
va_start(myvar,fmt);
vprintf(fmt,myvar);
va_end(myvar);
return 0;
}
int Debug_init()
{
mkdir("/log",0);
return 0;
}