GNU/Linux >> Linux の 問題 >  >> Linux

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

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から見ることができます


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

CFLAGS_filename.o := -DDEBUG

CFLAGS_[filename].o := -DDEBUG

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


Linux
  1. Linux –なぜSuだけでなくSuを使用するのですか?

  2. Linux –システムにRootfsファイルシステムが存在しないのはなぜですか?

  3. Linux –カーネルメーリングリストに参加していますか?

  1. Grep-o-wでMacOsXで期待される出力が得られないのはなぜですか?

  2. Linux –カーネルがInitを実行できないのはなぜですか?

  3. Linux –ヘッドフォンが機能しないLinux Mint 18?

  1. Linuxカーネルをftraceで分析する

  2. root ユーザーから Linux カーネルを保護するのはなぜですか?

  3. Linux NFS サーバーがユーザー空間ではなくカーネルに実装されているのはなぜですか?