1. 打开dynamic_debug
1CONFIG_DYNAMIC_DEBUG=y
运行时控制:/proc/dynamic_debug/control
,如果开启了CONFIG_DEBUG_FS
,在<debugfs>/dynamic_debug/control
,两者效果是相同的。
2. 使用dynamic_debug
可以使用pr_debug
或者dev_dbg
来打印调试信息。
1#define pr_fmt(fmt) fmt
2
3#include <linux/kernel.h>
4#include <linux/init.h>
5#include <linux/module.h>
6
7static int __init hello_init(void)
8{
9 pr_info("%s enter\n", __func__);
10 pr_debug("debug enter\n");
11 return 0;
12}
13
14static void __exit hello_exit(void)
15{
16 pr_info("%s exit\n", __func__);
17 pr_debug("debug exit\n");
18}
19
20module_init(hello_init);
21module_exit(hello_exit);
按照如下步骤查看输出,发现只有hello_exit
中的pr_debug
可以输出。
1echo 8 > /proc/sys/kernel/printk
2insmod hello.ko
3echo -n 'module hello +p' > <debugfs>/dynamic_debug/control
4rmmod hello
5dmesg | tail
2.1. 让hello_init中的pr_debug也可以输出
一种方式是在modprobe
时,指定dyndbg==p
,insmod不适用。
另一种方法是在文件头部定义DEBUG
。
1#define DEBUG
2#define pr_fmt(fmt) fmt
3
4#include <linux/kernel.h>
5#include <linux/init.h>
6#include <linux/module.h>
原理是使pr_debug
内部的static struct _ddebug
变量中的flags
默认值(_DPRINTK_FLAGS_DEFAULT
)为_DPRINTK_FLAGS_PRINT
。
1#if defined DEBUG
2#define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT
3#else
4#define _DPRINTK_FLAGS_DEFAULT 0
5#endif