ロード可能なカーネルモジュールがあり、その初期化は以下のとおりです
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ステートメントが見つかりませんでした。それで、私は何が欠けているか間違っているのですか?
filename.c
がモジュールソースファイルであると仮定して、Makefileに以下を追加します。
CFLAGS_filename.o := -DDEBUG
ない
CFLAGS_[filename].o := -DDEBUG
_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