printfログをデバッグレベルによって切り替える仕組みの作り方(C言語)

テクノロジー

最後にサンプルコード

上の半分くらいが仕組みとして構築したデバッグログのコードになります。
可変長引数とかマイナーな機能を使って実現しています。

#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;
}

ではグッドラック!

コメント

タイトルとURLをコピーしました