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

使用示例

Dynamic debug — The Linux Kernel documentation(v6.6)

Dynamic debug — The Linux Kernel documentation(latest)