问题 为什么Linux内核的pr_debug没有提供任何输出?


我有一个可加载的内核模块,它的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 是文件名。

现在我检查了 /sys/kernel/debug/dynamic_debug/control 在做了这个模块的insmod之后,我在其中找到了下面的行

/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语句。那么我错过了什么或做错了什么?


8716
2018-03-08 05:22


起源

检查系统的日志级别。可能是它不应该打印调试日志。 - Milind Dumbare
您是不是在dmesg或屏幕上或两者兼而有之?尝试添加 dyndbg 加载时模块的参数。如果您已编译使用 <NAME>.dyndbg,其中<NAME>是与Makefile相关的模块名称。 - 0andriy
@Miline您的意思是CONFIG_MESSAGE_LOGLEVEL_DEFAULT吗?那是4,正如配置文件所报告的那样。但这有什么不同吗? - PaulDaviesC
你不能使用printk的任何具体原因? - Milind Dumbare
@AndyShevchenko我没有得到它。你能详细说明吗? - PaulDaviesC


答案:


假设,在Makefile中添加以下内容 id.c 是模块源文件。

CFLAGS_id.o := -DDEBUG

CFLAGS_[id].o := -DDEBUG

参考 https://www.kernel.org/doc/local/pr_debug.txt


10
2018-03-09 11:58



Atleast为我工作。 - Milind Dumbare
它也是我的工作:) - PaulDaviesC


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 

特别是它包含了 模块加载地址

[   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 将它添加到我们自己的模块中。

用内核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/372​​83021/895245


1
2018-04-14 19:34