CONFIG_DYNAMIC_DEBUG=y
https://www.kernel.org/doc/html/v4.11/admin-guide/dynamic-debug-howto.html
Jika Anda mengkompilasi kernel dengan opsi ini, maka Anda dapat melakukan hal-hal luar biasa seperti:
echo 8 > /proc/sys/kernel/printk
echo 'file kernel/module.c +p' > /sys/kernel/debug/dynamic_debug/control
dan ini secara selektif akan mengaktifkan pr_debug()
yang Anda inginkan.
Kami kemudian dapat mengujinya dengan:
insmod mymodule.ko
yang mencetak banyak info debug tambahan seperti di:
[ 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
Dan khususnya, ini berisi alamat pemuatan modul:
[ 84.877482] 0xffffffffc0005000 .text
yang berguna untuk mengubah alamat menjadi baris.
Untuk modul, kita bisa melakukan:
echo 8 > /proc/sys/kernel/printk
echo 'module myprintk +p' > /sys/kernel/debug/dynamic_debug/control
insmod /myprintk.ko
yang memungkinkan kita untuk dengan mudah menguji pr_debug
dengan menambahkannya ke modul kita sendiri.
Diuji pada kernel 4.16 dengan pengaturan ini.
printk(KERN_DEBUG
!=pr_debug
saat CONFIG_DYNAMIC_DEBUG=y
Ini sangat tidak konsisten, tetapi printk(KERN_DEBUG
muncul saat loglevel=8
meskipun kami tidak mengaktifkan /sys/kernel/debug/dynamic_debug/control
, ini bisa dilihat dari:https://stackoverflow.com/a/37283021/895245
Tambahkan berikut ke Makefile, dengan asumsi filename.c
adalah file sumber modul.
CFLAGS_filename.o := -DDEBUG
tidak
CFLAGS_[filename].o := -DDEBUG
Lihat https://www.kernel.org/doc/local/pr_debug.txt