调试内核某模块,打印 pr_debug 信息

最近看Linux下netfilter中某个模块,文件自带有大量的 pr_debug 调试信息,就想输出来看一下,第一反应是用函数指针将 pr_debug 指向 printk,但一想,函数指针要解指针,不得行。

查了下一些文章,发现打开这个动态Debug比较麻烦(没有看懂),再一看 pr_debug 的实现,这个是宏定义耶,我自己重定义到 printk 估计可以。然后,拿出这个模块文件,放到桌面或者那个文件夹中,在头部引入头文件之后的位置加了如下宏定义:

#ifdef pr_debug
#undef pr_debug
#endif // pr_debug

#ifndef pr_debug

#ifndef KERN_DEBUG
#define KERN_DEBUG ""
#endif // KERN_DEBUG

#ifndef pr_fmt
#define pr_fmt(fmt) fmt
#endif // pr_fmt

#define pr_debug(fmt, ...) \
		printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#endif // pr_debug

然后,使用了如下Makefile,与内核文件 进行了编译

obj-m += module_file_name.o
# module_file_name-objs = other_dependence_file_1.o other_dependence_file_2.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
 
all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
	rm -rf *.ko *.o *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions

这个module_file_name是我在看的那个模块文件,make 之后,将得到一个 module_file_name.ko 的模块文件,
然后 使用

insmod module_file_name.ko # 加载 模块
rmmod module_file_name # 卸载 模块
lsmod # 查看 所有加载的模块
modprobe xxx # 加载 内核中已有的模块
modinfo module_file_name.ko # 查看 模块的信息(depends项是依赖模块,用modprobe加载)

加载模块后,可以在日志 /var/log/kern.log 看输出(因为我看的是netfilter的,所以,我发送模块相应的数据包就有输出了)。
可以使用tail命令跟踪日志输出。

tail -f /var/log/kern.log

此文件纯属记录,希望对他人有帮助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章