Debug信息分级别输出

Debug信息分级别输出

简介

驱动需要实现一个功能:将输出信息根据重要程度分成三个级别,INFO < DEBUG < ERROR,有一个全局变量debug_level控制当前驱动允许输出信息的级别,要做到能实时修改这个debug_level,从而控制驱动输出的级别(级别>=debug_level的信息才可输出)。

代码实现

首先,在头文件test.h里定义下三种级别:

#define INFO_LEVEL		2
#define DEBUG_LEVEL		1
#define ERROR_LEVEL		0

其次,需要在C文件test.c里定义一个全局变量(如果全局变量定义在头文件里,那么凡是引用了此头文件的C文件会重复定义一次这个变量,编译会报错):

int debug_level = DEBUG_LEVEL;//赋初值

之后,在test.h里添加debug_level 全局变量的声明,并define调试输出函数:

#define INFO_LEVEL		2
#define DEBUG_LEVEL		1
#define ERROR_LEVEL		0
... ...
extern int debug_level;
#define my_dbg(level, format, ...) \
	do { \
		if(level <= debug_level) { \
			switch(level) { \
				case ERROR_LEVEL: \
					printk("E: <%s, %d>: " format, __func__, __LINE__, ##__VA_ARGS__); \
					break; \
				case DEBUG_LEVEL: \
					printk("D: <%s, %d>: " format, __func__, __LINE__, ##__VA_ARGS__); \
					break; \
				case INFO_LEVEL: \
					printk("I: <%s, %d>: " format, __func__, __LINE__, ##__VA_ARGS__); \
                                        break; \
			} \
		} \
	} while(0) \

最后,实现实时控制全局输出级别:
参考以下博客,创建一个文件来控制全局变量的值,在该文件的read操作函数里,读取用户空间输入的值,然后赋给全局变量debug_level。还需针对错误的输入值进行处理。
linux驱动之debugfs使用_krokodil98的博客

使用:
C文件如果需要使用my_dbg,#include “test.h” 然后直接调用即可。
不引用.h文件直接调用会编译报错:error : implicit declararion of function 'my_dbg'
例如,在C文件中添加以下代码:

#include "test.h"
... ...
void debug_test(){
    my_dbg(INFO_LEVEL, "debug_test1\n");
    my_dbg(DEBUG_LEVEL, "debug_test1\n");
    my_dbg(ERROR_LEVEL, "debug_test1\n");
    printk("---------------------------------\n");
    int temp = 10;
    char test[20]="hello today! ";
    my_dbg(INFO_LEVEL, "%s with param %d\n", test, temp);
    my_dbg(DEBUG_LEVEL, "%s with param %d\n", test, temp);
    my_dbg(ERROR_LEVEL, "%s with param %d\n", test, temp);
}

运行效果

  • 输入非法数值
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# echo 3 > debug_level
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# sudo dmesg -c
[28183.500689] debug_level : wrong input level number 3
[28183.500691] -->  ERROR_LEVEL:0
[28183.500692] -->  DEBUG_LEVEL:1
[28183.500693] -->  INFO_LEVEL:2
  • 输入不同级别
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# echo 0 > debug_level
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# sudo dmesg -c
[28229.492752] debug_level : 1 -> 0
[28229.492755] -->  ERROR_LEVEL:0
[28229.492756] -->  DEBUG_LEVEL:1
[28229.492757] -->  INFO_LEVEL:2
... ...
[28237.968524] E: <debug_test,1783>: debug_test1
[28237.968524] ---------------------------------
[28237.968525] E: <debug_test,1789>: hello today!  with param 10
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# echo 2 > debug_level
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# sudo dmesg -c
[28275.668899] debug_level : 0 -> 2
[28275.668901] -->  ERROR_LEVEL:0
[28275.668902] -->  DEBUG_LEVEL:1
[28275.668903] -->  INFO_LEVEL:2
... ...
[28280.544955] I: <debug_test,1781>: debug_test1
[28280.544955] D: <debug_test,1782>: debug_test1
[28280.544955] E: <debug_test,1783>: debug_test1
[28280.544956] ---------------------------------
[28280.544957] I: <debug_test,1787>: hello today!  with param 10
[28280.544957] D: <debug_test,1788>: hello today!  with param 10
[28280.544958] E: <debug_test,1789>: hello today!  with param 10
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
logging 模块定义了五个日志级别别是: - DEBUG:详细的程序执行信息,通常用于调试程序。 - INFO:一般的程序执行信息,例如程序启动、连接数据库等。 - WARNING:警告信息,表示程序可能出现问题,但不影响程序运行。 - ERROR:错误信息,表示程序出现了错误,但不影响程序运行。 - CRITICAL:严重的错误信息,表示程序出现了严重的错误,可能导致程序崩溃。 在使用 logging 模块时,我们可以通过设置日志级别来控制输出信息量,只输出大于等于某一级别的日志信息。例如,如果将日志级别设置为 INFO,则只会输出 INFO、WARNING、ERROR 和 CRITICAL 四个级别的日志信息,而不会输出 DEBUG 级别的日志信息。 下面是一个详细的示例代码,展示了不同级别的日志信息: ```python import logging # 设置 logging 的配置 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('这是一条 DEBUG 级别信息') logging.info('这是一条 INFO 级别信息') logging.warning('这是一条 WARNING 级别信息') logging.error('这是一条 ERROR 级别信息') logging.critical('这是一条 CRITICAL 级别信息') ``` 在这个示例代码中,我们通过 `basicConfig` 方法设置了 logging 的配置,包括日志级别输出格式等。然后使用 `debug`、`info`、`warning`、`error` 和 `critical` 等方法输出不同级别信息。 注意,以上代码只是一个简单的示例,实际应用中可能需要更加细致的配置和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值