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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未来十大技能职场吃香

一个人掌握何种技能取决于他的兴趣、能力和聪明程度&#xff0c;也取决于他所能支配的资源以及制定的事业目标&#xff0c;拥有过硬技能的人有更多的工作机会。但是&#xff0c;由于经济发展前景不确定&#xff0c;掌握对你的事业有所帮助的技能显得尤为重要。相关网站通过多年…

linux学习一个服务(未完)

学习一个服务的过程 1.了解服务的作用&#xff1a;名字 功能&#xff0c;特点 2.安装 3.配置文件位置&#xff0c;端口 4.服务启动关闭的脚本 5.此服务的使用方法 6.修改配置文件&#xff0c;实战举例 7.排错&#xff08;从下到上&#xff0c;从内到外&#xff09; 转载于:http…

ReverseFind

函数原型&#xff1a;int ReverseFind( TCHAR ch ) const;   返回值: 返回此CString 对象中与要求的字符匹配的最后一个字符的索引&#xff1b;如果没有找到需要的字符则返回-1。   参数: ch 要搜索的字符。   说明:此成员函数在此CString 对象中搜索与一个子串匹配的最后…

Qt值得学习吗?详解Qt的几种开发方式

qt值得学习吗&#xff1f;嵌入式要学的东西真的很多&#xff0c;我们可能会说不写界面的话就不用学qt了&#xff1f;我不赞同。Qt的实现主要是采用p-impl手法&#xff0c;实现接口与实现分离&#xff0c;它有很好的消息循环机制&#xff0c;有的对象与线程的相关性&#xff0c;…

技术QA:如何安装并启用BITS和WebDAV?

引子&#xff1a; 在安装SCCM 2007 SP1时&#xff0c;必须要安装并启用BITS和WebDAV&#xff0c;否则在SCCM 2007 SP1安装先决条件检查时将会报错。它们以前都是IIS的功能组件&#xff0c;但是在IIS 7中变动很大&#xff0c;特别是在 Windows Server 2008 操作系统中现在已经不…

Linux下XPath对xml解析

#ifndef CONF_XML_H #define CONF_XML_H // xml文件Z在《Linux下获取xml调试信息等级》里有 #include <stdio.h> #include <string.h> #include <unistd.h> #include <assert.h>#include <libxml/parser.h> #include <libxml/tree.h> #inc…

LEFT函数

LEFT函数 函数执行成功时返回string字符串左边n个字符&#xff0c;发生错误时返回空字符串&#xff08;""&#xff09;。如果任何参数的值为NULL&#xff0c;Left()函数返回NULL。如果n的值大于string字符串的长度&#xff0c;那么Left()函数返回整个string字符串&a…

一个操作系统的实现(3)

文件系统 文件系统是建立在硬盘上的一个程序&#xff0c;所以由2部分组成&#xff1a;驱动和管理文件系统的进程FS。 首先看一下驱动是如何工作的&#xff1a; 通常&#xff0c;主板上面有2个IDE插槽&#xff0c;分别叫做IDE0/IDE1。每个IDE通道又可以接2个设备。驱动进程的目的…

C语言,谁都能看得懂的归并排序

喜欢看排序算法动态效果的&#xff0c;可以看看这个网站https://visualgo.net/zh/sorting里面很多算法的动画解释&#xff0c;可以看到算法的排序效果&#xff0c;而且还附带了伪代码的实现过程。本来想录制几张动图放上来&#xff0c;但是因为图片较大&#xff0c;传不上来&am…

一份详细的服务器安全解决方案

一、操作系统配置 1.安装操作系统(NTFS分区)后&#xff0c;装杀毒软件&#xff0c;我选用的是卡巴。 2.安装系统补丁。扫描漏洞全面杀毒 3.删除Windows Server 2003默认共享 首先编写如下内容的批处理文件&#xff1a; echo off net share C$ /del net share D$ /del net …

GetModuleFileName

GetModuleFileName 获取当前进程已加载模块的文件的完整路径&#xff0c;该模块必须由当前进程加载。如果想要获取另一个已加载模块的文件路径&#xff0c;可以使用GetModuleFileNameEx函数。 声明GetModuleFileName(VB) Declare Function GetModuleFileName Lib “kernel32”…

jQuery load() 中文乱码

1、使用editplus创建了demo.txt (ANSI保存的)&#xff0c; $("#div1").load("demo.txt");//div显示中文乱码--->html5中定义<meta charset"utf-8"/>,编码解码不一致造成中文乱码&#xff0c;将文本文件demo.txt另存为utf-8格式&#xf…

内核链表list.h文件剖析

内核链表list.h文件剖析 一、内核链表的结构【双向循环链表】 内核链表的好主要体现为两点&#xff0c;1是可扩展性&#xff0c;2是封装。可以将内核链表复用到用户态编程中&#xff0c;以后在用户态下编程就不需要写一些关于链表的代码了&#xff0c;直接将内核中list.h中的代…

CAN总线很难吗?CAN总线看不懂是不可能的!

CAN&#xff08;Controller Area Network&#xff09;即控制器局域网&#xff0c;是一种能够实现分布式实时控制的串行通信网络。想到CAN就要想到德国的Bosch公司&#xff0c;因为CAN就是这个公司开发的&#xff08;和Intel&#xff09;CAN有很多优秀的特点&#xff0c;使得它能…

GetDlgItem

GetDlgItemText() GetDlgItemText是C中的函数&#xff0c;调用这个函数以获得与对话框中的控件相关的标题或文本。GetDlgItemText成员函数将文本拷贝到lpStr指向的位置并返回拷贝的字节的数目。 函数说明 CWnd类的成员函数。 函数原型 int GetDlgItemText( HWND hDlg , int n…

开放课程管理系统(Moodle)的介绍(转)

一、虚拟学习环境 关于虚拟学习环境&#xff0c;很难用一个简单的定义来描述。可以说是&#xff0c;支持和管理教与学的各项活动的基于网络的环境。也可以认为是学习管理系统的组成部分。当应用于远程教育时&#xff0c;通常认为它包括“任何用于创造一个统一的、类似于面对面的…

C语言必须写main函数?最简单的 Hello world 你其实一点都不懂!

我们在刚写程序的时候&#xff0c;第一个都是 hello world&#xff0c;而在这里&#xff0c;完整的代码就是&#xff1a;我们打眼一看&#xff0c;其实很简单&#xff0c;就是引入头文件&#xff0c;写一个主函数&#xff0c;然后输出一句话&#xff0c;但是当我们编译出来ELF的…

内核链表使用举例

内核链表使用举例#ifndef _EVENT_LIST_H_ #define _EVENT_LIST_H_#include "list.h" // 内核链表头文件typedef int (*event_cb)(void *data);typedef struct {void *params;event_cb handle;struct list_head list; } event_elem_t;int EventListAdd(event_elem_t *…

CObList

CObList CObList类支持非唯一的CObject指针&#xff0c;并可顺次访问或通过指针值访问有序列表。CObList列表的行为类似于双向链接列表。CObList是非常有用的集合类族的代表&#xff0c;具有诊断转储的特性并且能够包含混合的指针。 POSITION类型的变量为列表的键。使用POSITIO…

源码包安装

一、源码包和RPM包的区别 1、区别 安装之前的区别&#xff1a;概念上的区别 安装之后的区别&#xff1a;安装位置不同 2、RPM包安装位置 是安装在默认位置中 注&#xff1a;安装位置是写RPM包的作者决定的 注&#xff1a;RPM包支持指定安装位置&#xff0c;但是不建议指定位置安…