我有一个可加载的内核模块,其init如下所示
static int __init id_init(void)
{
struct identity *temp;
/* some code which is not relevant to the question */
temp = identity_find(3);
pr_debug("id 3 = %s\n", temp->name);
temp = identity_find(42);
if (temp == NULL)
pr_debug("id 42 not found\n");
/* some code which is not relevant to the question */
return 0;
}
此外,我已在我正在使用的内核版本上启用了动态调试 - 即CONFIG_DYNAMIC_DEBUG=y
。
在模块的Makefile中,我添加了一行CFLAGS_[id].o := -DDEBUG
,其中id.c
是文件名。
现在我在做了这个模块的insmod之后检查了/sys/kernel/debug/dynamic_debug/control
,其中我找到了以下行
/home/pauldc/Programming/Kernel/id/id.c:69 [id]id_init =_ "id 42 not found\012"
/home/pauldc/Programming/Kernel/id/id.c:65 [id]id_init =_ "id 3 = %s\012"
即使在完成所有这些之后,令我失望的是,我无法在dmesg的输出中找到上述两个pr_debug语句。那么我错过了什么或做错了什么?
答案 0 :(得分:12)
在Makefile中添加以下内容,假设id.c
是模块源文件。
CFLAGS_id.o := -DDEBUG
不
CFLAGS_[id].o := -DDEBUG
答案 1 :(得分:1)
<强> CONFIG_DYNAMIC_DEBUG=y
强>
https://www.kernel.org/doc/html/v4.11/admin-guide/dynamic-debug-howto.html
如果使用此选项编译内核,则可以执行以下操作:
echo 8 > /proc/sys/kernel/printk
echo 'file kernel/module.c +p' > /sys/kernel/debug/dynamic_debug/control
这将有选择地启用您想要的pr_debug()
。
然后我们可以用以下方法测试:
insmod mymodule.ko
打印了许多额外的调试信息,如:
[ 84.875592] init_module: umod=0000000073518b66, len=185416, uargs=000000009c6e375a
[ 84.876099] Core section allocation order:
[ 84.876257] .text
[ 84.876332] .note.gnu.build-id
[ 84.876418] .rodata.str1.1
[ 84.876492] .orc_unwind_ip
[ 84.876568] .orc_unwind
[ 84.876636] __mcount_loc
[ 84.876705] .data
[ 84.876760] .gnu.linkonce.this_module
[ 84.876856] .bss
[ 84.876919] Init section allocation order:
[ 84.877041] .symtab
[ 84.877121] .strtab
[ 84.877235] final section addresses:
[ 84.877352] 0xffffffffc0006000 .note.gnu.build-id
[ 84.877482] 0xffffffffc0005000 .text
[ 84.877580] 0xffffffffc0006024 .rodata.str1.1
[ 84.877695] 0xffffffffc0006040 .orc_unwind_ip
[ 84.877805] 0xffffffffc0006050 .orc_unwind
[ 84.877905] 0xffffffffc0006068 __mcount_loc
[ 84.878012] 0xffffffffc0007000 .data
[ 84.878107] 0xffffffffc0007000 .gnu.linkonce.this_module
[ 84.878238] 0xffffffffc0007340 .bss
[ 84.878331] 0xffffffffc000a000 .symtab
[ 84.878430] 0xffffffffc000a348 .strtab
[ 84.878657] Absolute symbol: 0x00000000
[ 84.878951] Absolute symbol: 0x00000000
[ 84.879713] hello init
特别是,它包含module load address:
[ 84.877482] 0xffffffffc0005000 .text
用于将地址转换为行。
对于模块,我们可以这样做:
echo 8 > /proc/sys/kernel/printk
echo 'module myprintk +p' > /sys/kernel/debug/dynamic_debug/control
insmod /myprintk.ko
允许我们通过将pr_debug
添加到我们自己的模块中来轻松测试。{/ p>
使用this setup在内核4.16上进行测试。
当printk(KERN_DEBUG
时, 这是非常不一致的,但即使我们未启用pr_debug
!= CONFIG_DYNAMIC_DEBUG=y
printk(KERN_DEBUG
,loglevel=8
也会显示/sys/kernel/debug/dynamic_debug/control
,这可以从以下网址看到:https://stackoverflow.com/a/37283021/895245