在内核模块中引用console_loglevel ERROR

时间:2015-04-20 19:06:35

标签: linux linux-kernel linux-device-driver

我有一个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

你能帮忙找出如何使这项工作?感谢!!!

1 个答案:

答案 0 :(得分:1)

编译错误的原因是console_printk符号未导出,因此模块无法使用它。

但您真正应该使用的是Dynamic debug功能及其pr_debug() / dev_dbg()功能。

基本上,您需要确保在内核中启用CONFIG_DYNAMIC_DEBUG,在要编写一些调试代码的所有位置使用dev_dbg(),然后动态启用调试消息,例如:

  1. 要启用模块中的所有消息,请在dyndbg=+p / insmod来电结束时添加modprobe

  2. 要有选择地仅启用某些消息,请使用文档中描述的查询语言。例如,要仅启用模块中函数foo()bar()的消息,请使用:

    insmod mymodule.ko dyndbg="func foo +p; func bar +p"