嵌入式项目调试
嵌入式产品项目调试,别再用printf了
·
一. 简介
给大家分享一下嵌入式项目中的调试,有的是printf打印,有的是log日志的记录,相信大家用的比较多,虽然有gdb的调试,但是简单的打印对我们了解整个软件的运行还是很有帮助的。
二. 项目应用
- 条件编译的打印可显示打印的文件函数以及第几行,就可以很快定位。调试完成后可直接屏蔽宏定义来关闭调试,打印也是会占有资源的
//条件编译实现日志打印 注释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
- 再就是不同类型的打印,想提示错误警告等等,打印可显示出不同的颜色更加的直观
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 文件打印
更多推荐
所有评论(0)