web-dev-qa-db-ja.com

Linuxカーネルのpr_debugが何も出力しないのはなぜですか?

ロード可能なカーネルモジュールがあり、その初期化は以下のとおりです

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の出力に上記の2つのpr_debugステートメントが見つかりませんでした。それで、私は何が欠けているか間違っているのですか?

13
PaulDaviesC

filename.cがモジュールソースファイルであると仮定して、Makefileに以下を追加します。

CFLAGS_filename.o := -DDEBUG

ない

CFLAGS_[filename].o := -DDEBUG

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

12
Milind Dumbare

_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_ when _CONFIG_DYNAMIC_DEBUG=y_

これは非常に一貫性がありませんが、_printk(KERN_DEBUG_を有効にしない場合でも_loglevel=8_を使用すると_/sys/kernel/debug/dynamic_debug/control_が表示されます。これは次のように表示されます https://stackoverflow.com/a/37283021/895245