当前位置: 首页 > news >正文

debug函数

1.debug.c

// dbg.h #pragma once #include <stdio.h> // 日志级别枚举 typedef enum { DBG_NONE = 0, DBG_ERROR = 1, DBG_WARN = 2, DBG_INFO = 3, DBG_DEBUG = 4, DBG_TRACE = 5 } dbg_level_t; // 全局日志级别(外部定义) extern int g_dbg_level; // 带级别的调试宏(使用全局变量) #define dbg_log(level, fmt, ...) \ do { \ if (level <= g_dbg_level) { \ const char *level_str[] = { \ "NONE", "ERROR", "WARN", "INFO", "DEBUG", "TRACE" \ }; \ fprintf(stderr, "[%s] %s:%d:%s(): " fmt, \ level_str[level], __FILE__, __LINE__, \ __func__, ##__VA_ARGS__); \ } \ } while(0) // 快捷宏 #define dbg_error(fmt, ...) dbg_log(DBG_ERROR, fmt, ##__VA_ARGS__) #define dbg_warn(fmt, ...) dbg_log(DBG_WARN, fmt, ##__VA_ARGS__) #define dbg_info(fmt, ...) dbg_log(DBG_INFO, fmt, ##__VA_ARGS__) #define dbg_debug(fmt, ...) dbg_log(DBG_DEBUG, fmt, ##__VA_ARGS__) #define dbg_trace(fmt, ...) dbg_log(DBG_TRACE, fmt, ##__VA_ARGS__)

2.load_config.c

// config_loader.h #pragma once #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 日志级别枚举 typedef enum { DBG_NONE = 0, DBG_ERROR = 1, DBG_WARN = 2, DBG_INFO = 3, DBG_DEBUG = 4, DBG_TRACE = 5 } dbg_level_t; // 全局日志级别变量 extern int g_dbg_level; // 配置文件名 #define CONFIG_FILE "config.ini" // 从字符串转换为日志级别 static dbg_level_t string_to_level(const char *str) { if (str == NULL) return DBG_INFO; if (strcasecmp(str, "NONE") == 0) return DBG_NONE; if (strcasecmp(str, "ERROR") == 0) return DBG_ERROR; if (strcasecmp(str, "WARN") == 0) return DBG_WARN; if (strcasecmp(str, "INFO") == 0) return DBG_INFO; if (strcasecmp(str, "DEBUG") == 0) return DBG_DEBUG; if (strcasecmp(str, "TRACE") == 0) return DBG_TRACE; // 也支持数字 int num = atoi(str); if (num >= 0 && num <= 5) return num; return DBG_INFO; // 默认值 } // 读取配置文件 void load_config() { FILE *file = fopen(CONFIG_FILE, "r"); if (!file) { printf("无法打开配置文件 %s,使用默认设置\n", CONFIG_FILE); g_dbg_level = DBG_INFO; return; } char line[256]; char section[64] = ""; while (fgets(line, sizeof(line), file)) { // 去掉换行符 line[strcspn(line, "\n")] = 0; // 去掉首尾空格 char *p = line; while (isspace(*p)) p++; char *end = p + strlen(p) - 1; while (end > p && isspace(*end)) *end-- = 0; // 空行或注释 if (*p == 0 || *p == '#' || *p == ';') continue; // 检查是否是节 if (p[0] == '[' && strchr(p, ']')) { char *close_bracket = strchr(p, ']'); *close_bracket = 0; strncpy(section, p + 1, sizeof(section) - 1); continue; } // 解析键值对 char *equal = strchr(p, '='); if (!equal) continue; *equal = 0; char *key = p; char *value = equal + 1; // 去掉键和值的空格 while (isspace(*key)) key++; char *key_end = key + strlen(key) - 1; while (key_end > key && isspace(*key_end)) *key_end-- = 0; while (isspace(*value)) value++; char *value_end = value + strlen(value) - 1; while (value_end > value && isspace(*value_end)) *value_end-- = 0; // 如果是日志配置 if (strcmp(section, "logging") == 0) { if (strcasecmp(key, "level") == 0) { g_dbg_level = string_to_level(value); printf("从配置文件设置日志级别: %s (%d)\n", value, g_dbg_level); } } } fclose(file); } // 更新日志级别(可用于动态调整) void set_log_level(dbg_level_t level) { g_dbg_level = level; printf("日志级别已更改为: %d\n", level); }

3.main.c

// main.c #include "dbg.h" #include "config_loader.h" // 定义全局变量 int g_dbg_level = DBG_INFO; // 默认值 int main() { // 1. 加载配置 load_config(); // 2. 测试各种日志级别 dbg_error("这是一个错误消息\n"); dbg_warn("这是一个警告消息\n"); dbg_info("这是一个信息消息\n"); dbg_debug("这是一个调试消息\n"); dbg_trace("这是一个跟踪消息\n"); // 3. 动态调整级别 printf("\n动态调整日志级别为DEBUG...\n"); set_log_level(DBG_DEBUG); dbg_error("错误消息仍然显示\n"); dbg_debug("现在调试消息也会显示了!\n"); return 0; }

4.添加颜色

// main.c #include "dbg.h" #include "config_loader.h" // 定义全局变量 int g_dbg_level = DBG_INFO; // 默认值 int main() { // 1. 加载配置 load_config(); // 2. 测试各种日志级别 dbg_error("这是一个错误消息\n"); dbg_warn("这是一个警告消息\n"); dbg_info("这是一个信息消息\n"); dbg_debug("这是一个调试消息\n"); dbg_trace("这是一个跟踪消息\n"); // 3. 动态调整级别 printf("\n动态调整日志级别为DEBUG...\n"); set_log_level(DBG_DEBUG); dbg_error("错误消息仍然显示\n"); dbg_debug("现在调试消息也会显示了!\n"); return 0; }
http://www.jsqmd.com/news/197422/

相关文章:

  • IAR环境变量设置教程:操作指南
  • Proteus 8 Professional电路设计中的常见错误避坑指南
  • USB转485驱动程序下载后无法识别?排查操作指南
  • 从零实现工业控制平台的vivado2020.2安装流程
  • 语音识别Token计费模式对比:买断制vs按量付费哪个划算?
  • 语音情感识别延伸方向:在ASR基础上增加情绪判断模块
  • 2026年可靠的体系认证企业认证服务商推荐榜 - 行业平台推荐
  • 远洋船舶航行日志语音录入:抗风浪干扰优化
  • 煤矿井下通信辅助:噪声抑制增强识别效果
  • 2026年知名的耐油耐酸碱劳保鞋鞋实力源头 - 行业平台推荐
  • 2026年口碑好的白水苹果/陕西白水苹果产地影响力榜 - 行业平台推荐
  • 11_嵌入式C与控制理论入门:前馈控制算法与PID的复合控制实现
  • 2026年质量好的常熟劳务派遣专业服务推荐 - 行业平台推荐
  • 清华镜像源加速:pip install fun-asr时使用国内源
  • 2026年优秀的青年鸡顾客满意榜 - 行业平台推荐
  • CCS安装教程全面讲解:支持多版本适配指南
  • 东方通中间件集成方案制定
  • 沙漠油田作业区:沙尘防护外壳设计专利申报
  • 安全提醒:避免敏感信息上传公有云ASR接口,本地部署更安心
  • 版本控制系统集成:Git Commit提交时附带语音备注说明
  • 金融行业合规性改造:满足等保三级要求
  • QSPI在工业边缘计算节点中的高速数据缓存应用
  • 长句子识别耗时随长度线性增长趋势分析
  • 回滚机制预案:一键恢复至上一稳定版本
  • 十分钟,我在ModelEngine上构建了一个任务提醒智能体
  • 视频教程系列上线:B站/YouTube频道可观看
  • could not find driver调试技巧:内核日志分析完整示例
  • 军队项目特殊定制:涉密环境全离线运行
  • 电感的作用解析:LC滤波电路的深度剖析
  • 为什么在高并发系统中离不开 Redis?——核心场景与原理深度解析