我有一个Linux模块,它有一个调试功能,我只想在调试模式下调用该函数。 现在我有这样的代码:
if (console_loglevel >= CONSOLE_LOGLEVEL_DEBUG)
dump_my_message(dev, my_msg);
但是当在linux-next中构建这个代码时,它会抛出以下错误:
CHK include/generated/uapi/linux/version.h
Kernel: arch/x86/boot/bzImage is ready (#2)
Building modules, stage 2.
MODPOST 2738 modules
ERROR: "console_printk" [drivers/mymodule.ko] undefined!
scripts/Makefile.modpost:91: recipe for target '__modpost' failed
make[1]: *** [__modpost] Error 1
Makefile:1117: recipe for target 'modules' failed
make: *** [modules] Error 2
你能帮忙找出如何使这项工作?感谢!!!
答案 0 :(得分:1)
编译错误的原因是console_printk
符号未导出,因此模块无法使用它。
但您真正应该使用的是Dynamic debug功能及其pr_debug()
/ dev_dbg()
功能。
基本上,您需要确保在内核中启用CONFIG_DYNAMIC_DEBUG
,在要编写一些调试代码的所有位置使用dev_dbg()
,然后动态启用调试消息,例如:
要启用模块中的所有消息,请在dyndbg=+p
/ insmod
来电结束时添加modprobe
。
要有选择地仅启用某些消息,请使用文档中描述的查询语言。例如,要仅启用模块中函数foo()
和bar()
的消息,请使用:
insmod mymodule.ko dyndbg="func foo +p; func bar +p"