Linux下打印调试管理
生活随笔
收集整理的這篇文章主要介紹了
Linux下打印调试管理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#ifndef _DEBUG_MANAGE_H_
#define _DEBUG_MANAGE_H_/* 信息的調試級別,數值起小級別越高 */
#define APP_EMERG "<0>" /* system is unusable */
#define APP_ALERT "<1>" /* action must be taken immediately */
#define APP_CRIT "<2>" /* critical conditions */
#define APP_ERR "<3>" /* error conditions */
#define APP_WARNING "<4>" /* warning conditions */
#define APP_NOTICE "<5>" /* normal but significant condition */
#define APP_INFO "<6>" /* informational */
#define APP_DEBUG "<7>" /* debug-level messages *//* 信息的默認調試級別 */
#define DEFAULT_DBGLEVEL 4typedef struct debug_opt
{char *name;int is_can_use;int (*debug_init)(void); /* 調試模塊的初始化函數 */int (*debug_exit)(void); /* 退出函數 */int (*debug_print)(char *data); /* 輸出函數 */struct debug_opt *next;
} debug_opt_t, *debug_t;int DebugRegister(debug_t node);
void DebugShow(void);
debug_t DebugGet(char *name);
int DebugSetLevel(char *buffer);
int DebugSetChannel(char *buffer);
int DebugInit(void);
int DebugPrint(const char *format, ...);
int DebugChannelInit(void);
int StdoutInit(void);#endif /* _DEBUG_MANAGE_H_ */
#include "debug_manage.h" #include <stdio.h> #include <stdarg.h> #include <string.h>static debug_t head; static int debug_leval_limit = DEFAULT_DBGLEVEL;int DebugRegister(debug_t node) {debug_t point;if(!head){head = node;head->next = NULL;}else{point = head;while(point->next){point = point->next;}point->next = node;node->next = NULL;}return 1; }void DebugShow(void) {int i = 0;debug_t point = head;while(point){DebugPrint("%02d %s\n", i++, point->name);point = point->next;} }debug_t DebugGet(char * name) {debug_t point = head;while(point){if(strcmp(point->name, name) == 0){return point;}point = point->next;}return NULL; }int DebugSetLevel(char * buffer) {debug_leval_limit = buffer[9] - '0';printf("debug_leval_limit = %d\r\n", debug_leval_limit);return 0; }int DebugSetChannel(char * buffer) {char *temp, name[100];debug_t point;temp = strchr(buffer, '=');if(!temp){return -1;}else{strncpy(name, buffer, temp - buffer);name[temp - buffer] = '\0';point = DebugGet(name);if(!point){return -1;}if(temp[1] == '0'){point->is_can_use = 0;}else{point->is_can_use = 1;}return 0;} }int DebugPrint(const char * format, ...) {char buffer[1000];char *temp;va_list list;int num;debug_t point = head;int debug_level = DEFAULT_DBGLEVEL;/* 可變參數的處理, 抄自glibc的printf函數 */va_start (list, format);num = vsprintf (buffer, format, list);va_end (list);buffer[num] = '\0';temp = buffer;/* 根據打印級別決定是否打印 */if ((buffer[0] == '<') && (buffer[2] == '>')){debug_level = buffer[1] - '0';if (debug_level >= 0 && debug_level <= 9){temp = buffer + 3;}else{debug_level = DEFAULT_DBGLEVEL;}}if (debug_level >= debug_leval_limit){return -1;}/* 調用鏈表中所有isCanUse為1的結構體的DebugPrint函數* 用來輸出調試信息*/while (point){if (point->is_can_use){point->debug_print(temp);}point = point->next;}return 0; }int DebugChannelInit(void) {debug_t point = head;while(point){if(point->is_can_use && point->debug_init){point->debug_init();}point = point->next;}return 0; }static int stdout_debug_print(char *data) {printf("%s", data);return strlen(data); }static debug_opt_t debug_stdout = {.name = "stdout",.is_can_use = 1,.debug_print = stdout_debug_print, };int StdoutInit(void) {return DebugRegister(&debug_stdout); }int DebugInit(void) {int error;error = StdoutInit(); // error |= NetPrintInit();return error; }int main(void) {int error = DebugInit();printf("error: %d\n", error);DebugPrint("---------------\n");return 0; }
#include "debug_manage.h" #include <stdio.h> #include <stdarg.h> #include <string.h>static debug_t head; static int debug_leval_limit = DEFAULT_DBGLEVEL;int DebugRegister(debug_t node) {debug_t point;if(!head){head = node;head->next = NULL;}else{point = head;while(point->next){point = point->next;}point->next = node;node->next = NULL;}return 1; }void DebugShow(void) {int i = 0;debug_t point = head;while(point){DebugPrint("%02d %s\n", i++, point->name);point = point->next;} }debug_t DebugGet(char * name) {debug_t point = head;while(point){if(strcmp(point->name, name) == 0){return point;}point = point->next;}return NULL; }int DebugSetLevel(char * buffer) {debug_leval_limit = buffer[9] - '0';printf("debug_leval_limit = %d\r\n", debug_leval_limit);return 0; }int DebugSetChannel(char * buffer) {char *temp, name[100];debug_t point;temp = strchr(buffer, '=');if(!temp){return -1;}else{strncpy(name, buffer, temp - buffer);name[temp - buffer] = '\0';point = DebugGet(name);if(!point){return -1;}if(temp[1] == '0'){point->is_can_use = 0;}else{point->is_can_use = 1;}return 0;} }int DebugPrint(const char * format, ...) {char buffer[1000];char *temp;va_list list;int num;debug_t point = head;int debug_level = DEFAULT_DBGLEVEL;/* 可變參數的處理, 抄自glibc的printf函數 */va_start (list, format);num = vsprintf (buffer, format, list);va_end (list);buffer[num] = '\0';temp = buffer;/* 根據打印級別決定是否打印 */if ((buffer[0] == '<') && (buffer[2] == '>')){debug_level = buffer[1] - '0';if (debug_level >= 0 && debug_level <= 9){temp = buffer + 3;}else{debug_level = DEFAULT_DBGLEVEL;}}if (debug_level >= debug_leval_limit){return -1;}/* 調用鏈表中所有isCanUse為1的結構體的DebugPrint函數* 用來輸出調試信息*/while (point){if (point->is_can_use){point->debug_print(temp);}point = point->next;}return 0; }int DebugChannelInit(void) {debug_t point = head;while(point){if(point->is_can_use && point->debug_init){point->debug_init();}point = point->next;}return 0; }static int stdout_debug_print(char *data) {printf("%s", data);return strlen(data); }static debug_opt_t debug_stdout = {.name = "stdout",.is_can_use = 1,.debug_print = stdout_debug_print, };int StdoutInit(void) {return DebugRegister(&debug_stdout); }int DebugInit(void) {int error;error = StdoutInit(); // error |= NetPrintInit();return error; }int main(void) {int error = DebugInit();printf("error: %d\n", error);DebugPrint("---------------\n");return 0; }
總結
以上是生活随笔為你收集整理的Linux下打印调试管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: imx6 配置串口波特率_RS232串口
- 下一篇: linux cocos环境变量,Linu