本文主要是介绍Linux内核printk宏开关,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在内核开发时经常使用printk打印调试信息,但是printk又对性能有一定的影响,比如写了一个驱动调试完毕要发布或者做内核实验调试完毕正式测试时将这些printk删除又很麻烦,之后再想调试又要重新添加。
在内核中可以使用printk宏开关来控制这些信息的显示:
#define DEBUG_A
#ifdef DEBUG_A
#define DEBUG(fmt, args...) printk( KERN_DEBUG "DEBUG_A: " fmt, ## args)
#else
#define DEBUG(fmt, args...)
#endif
使用案例
debug.c:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>#define DEBUG_A
#ifdef DEBUG_A
#define DEBUG(fmt, args...) printk( KERN_DEBUG "DEBUG_A: " fmt, ## args)
#else
#define DEBUG(fmt, args...)
#endifstatic int __init hello_init(void)
{DEBUG("hello this is debug! \n");return 0;
}static void __exit hello_exit(void)
{DEBUG("exit! \n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
Makefile:
ifneq ($(KERNELRELEASE),)
obj-m:=debug.o
elseCURRENT_PATH:=$(shell pwd)
LINUX_KERNEL_PATH:=/lib/modules/$(shell uname -r)/builddefault:make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
endif
运行结果:
当不想要打印信息的时候把#define信息注释掉即可,以后再进行调试再将#define信息取消注释。
(19年9月3日,感谢评论区指正,并已更新)
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>//#define DEBUG_A
#ifdef DEBUG_A
#define DEBUG(fmt, args...) printk( KERN_DEBUG "DEBUG_A: " fmt, ## args)
#else
#define DEBUG(fmt, args...)
#endifstatic int __init hello_init(void)
{DEBUG("hello this is debug! \n");return 0;
}static void __exit hello_exit(void)
{DEBUG("exit! \n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
这篇关于Linux内核printk宏开关的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!