一. 简介

给大家分享一下嵌入式项目中的调试,有的是printf打印,有的是log日志的记录,相信大家用的比较多,虽然有gdb的调试,但是简单的打印对我们了解整个软件的运行还是很有帮助的。

二. 项目应用

  1. 条件编译的打印可显示打印的文件函数以及第几行,就可以很快定位。调试完成后可直接屏蔽宏定义来关闭调试,打印也是会占有资源的
//条件编译实现日志打印 注释define可关闭
#define LOG
#ifdef  LOG
#define LOG_OUTPUT(fmt...) \
    do {\
        printf("[%s-%s-%d]: ", __FILE__, _FUNCTION__, __LINE__);\
        printf(fmt);\
       }while(0)
#else
#define LOG_OUTPUT(fmt...)
#endif
  1. 再就是不同类型的打印,想提示错误警告等等,打印可显示出不同的颜色更加的直观
    debug.h
#ifndef __DEBUG_H__
#define __DEBUG_H__

#include <syslog.h>
#include <signal.h>
#include <time.h>

extern void debug_hex(const char* head_l, unsigned char*date_in, int length_l);
extern void debug(int level, const char *sFormat, ...);

#define LOG_D(format, ...)    debug(LOG_DEBUG, "[%s:%s] "format, __FILE__,__FUNCTION__, ##__VA_ARGS__)
#define LOG_I(format, ...)    debug(LOG_INFO, "[%s:%s] "format, __FILE__,__FUNCTION__, ##__VA_ARGS__)
#define LOG_W(format, ...)    debug(LOG_WARNING, "[%s:%s] "format, __FILE__,__FUNCTION__, ##__VA_ARGS__)
#define LOG_E(format, ...)    debug(LOG_ERR, "[%s:%s] "format, __FILE__,__FUNCTION__, ##__VA_ARGS__)
//16进制打印
#define LOG_HEX               debug_hex

#endif /* __DEBUG_H__ */

debug.c

syslog()函数 void syslog(int priority, const char *fmt, …);
是系统的日志打印,将打印的结果写入到 /var/log/syslog 文件中

#include <stdio.h>
#include <stdarg.h>
#include <syslog.h>
#include <string.h>

static char buff[1024];
static char buff_log[1024];
void debug(int level, const char *sFormat, ...)
{
    char *p;
    va_list ParamList;

	va_start(ParamList, sFormat);
    memset(buff, '\0', sizeof(buff));
    vsprintf(buff, sFormat, ParamList);
    va_end(ParamList);

    switch(level)
    {
        case LOG_INFO:
            sprintf(buff_log, "\033[0;32m[info]%s\033[0m", buff);
            puts(buff_log);
            //syslog(LOG_INFO, "%s", buff);
        break;

        case LOG_WARNING:
            sprintf(buff_log, "\033[0;33m[waring]%s\033[0m", buff);
            puts(buff_log);
            //syslog(LOG_WARNING, "%s", buff);    
        break;

        case LOG_ERR:
            sprintf(buff_log, "\033[0;31m[error]%s\033[0m", buff);
            puts(buff_log);
            //syslog(LOG_ERR, "%s", buff);
        break;

        case LOG_DEBUG:
            sprintf(buff_log, "\033[0;31m[error]%s\033[0m", buff);
            puts(buff_log);
            // syslog(LOG_ERR, "%s", buff);
        break;

        default:
            sprintf(buff_log, "[debug]%s", buff);
            puts(buff_log);
            // syslog(LOG_DEBUG, "%s", buff);
        break;

    }
}


static char buff_hex[1024];
void debug_hex(const char* head_l, unsigned char* date_in, int length_l)
{
    int len = 0;
    memset(buff, '\0', sizeof(buff));

    sprintf(buff_hex, "\033[1;32m[HEX][%d]%s:\n[", length_l, head_l);

    len = strlen(buff_hex);

    for (int k = 0; k < length_l; k++)
    {
        sprintf(&buff_hex[len + 3*k], "%02X ", date_in[k]);
    }
    len = strlen(buff_hex);

    sprintf(&buff_hex[len], "]\033[0m");

    puts(buff_hex);
    // syslog(LOG_DEBUG, "%s", buff_hex);
} 

三. 测试

#include <stdio.h>
#include "debug.h"

int main()
{
	LOG_D("aaa");
	LOG_I("bbb");
	LOG_W("CCC");
	LOG_E("DDD");
	LOG_HEX("HEX", "1234", 4);
}

在这里插入图片描述

/var/log/syslog 文件打印

在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐