最後にサンプルコード
上の半分くらいが仕組みとして構築したデバッグログのコードになります。
可変長引数とかマイナーな機能を使って実現しています。
#include <stdio.h>
#include <stdarg.h>
#define DBG_ERROR 0x00000001
#define DBG_INFO 0x00000002
#define DBG_DEBUG 0x00000004
#define DBG_APIS 0x00000008
#define DBG_APIE 0x00000010
#define DBG_APIINF 0x00000020
#define DEBUG_LEVEL_NORMAL DBG_INFO | \
DBG_ERROR
#define DEBUG_LEVEL_API DEBUG_LEVEL_NORMAL | \
DBG_APIS | \
DBG_APIE | \
DBG_APIINF
#define DEBUG_LEVEL_NONE 0
#define DEBUG_LEVEL_ALL 0xffffffff
#define PRINT(A, B... ) dbg_print(__FILE__,__LINE__,__FUNCTION__,A, ##B)
static unsigned int debug_flag;
void dgb_set_flag( unsigned int flag)
{
debug_flag = flag;
}
void dbg_print( const char *filename, unsigned int line, const char *funcname, unsigned int flag, const char *format, ... )
{
char buf[256];
va_list ap;
if( flag & debug_flag )
{
flag &= debug_flag;
va_start( ap, format );
vsnprintf(buf, 256, format, ap);
va_end(ap);
if(flag & DBG_ERROR)
{
printf("<<<ERROR>>>%s(),Line%d :%s %s\n",filename,line,funcname,buf);
}
if(flag & DBG_INFO)
{
printf("[INFO]%s\n",buf);
}
if(flag & DBG_DEBUG)
{
printf("[DBG]%s(),Line%d :%s %s\n",filename,line,funcname,buf);
}
if(flag & DBG_APIS)
{
printf("[APIS]%s() %s\n",funcname,buf);
}
if(flag & DBG_APIE)
{
printf("[APIE]%s() %s\n",funcname,buf);
}
if(flag & DBG_APIINF){
printf("[%s()]%s\n",funcname,buf);
}
}
}
//------------------------------------------------------------------------
int _func(const char *filename, unsigned int line, const char *funcname, int input);
#define FUNC(a) _func(__FILE__,__LINE__,__FUNCTION__,a)
int _func(const char *filename, unsigned int line, const char *funcname, int input)
{
PRINT(DBG_APIS,"<- form %s:%d %s()",filename,line,funcname);
PRINT(DBG_APIINF,"input = %d",input);
if(input > 10){ //parameter check
PRINT(DBG_ERROR|DBG_APIE,"");
return 1;
}
input++;
PRINT(DBG_APIE,"Line%d",__LINE__);
return input;
}
void main(void)
{
int ret = 0;
dgb_set_flag(DEBUG_LEVEL_ALL);
ret = FUNC(10);
PRINT(DBG_INFO,"ret = %d",ret);
PRINT(DBG_DEBUG,"main end");
return;
}
ではグッドラック!
コメント