dmesg не показывает оператор printk

Я пытаюсь создать запись proc. Моя функция init_module выглядит следующим образом:

int init_module()
{
printk(KERN_INFO "proc2:Module Loaded\n");
proc_entry=proc_create_data(proc_name,0644,NULL,&fops,NULL);
if(proc_entry==NULL)
{
    printk(KERN_INFO "proc2:Error registering proc entry");
}
else
{
    printk(KERN_INFO "proc2:Proc Entry Created");
}
return 0;
}

следующий метод очистки

void cleanup_module()
{
printk(KERN_INFO "proc2:module unloaded");
remove_proc_entry(proc_name,proc_entry);
}

остальная часть программы включает определение переменных и функции обратного вызова.

когда я компилирую эту программу, она компилируется хорошо. когда я использую insmod, он не отвечает мне. lsmod перечисляет мой модуль и показывает, какой из них используется (не знаю каким). dmesg не показывает ни одного из приведенных выше сообщений printk.

Вы можете сказать мне, что здесь не так?


person Kumar Gaurav    schedule 04.09.2013    source источник


Ответы (3)


Попробуйте echo "7" > /proc/sys/kernel/printk включить все уровни журнала консоли.

Цифры соответствуют приведенным ниже:

#define KERN_EMERG "<0>" /* system is unusable*/
#define KERN_ALERT "<1>" /* action must be taken immediately*/
#define KERN_CRIT "<2>" /* critical conditions*/
#define KERN_ERR "<3>" /* error conditions*/
#define KERN_WARNING "<4>" /* warning conditions*/
#define KERN_NOTICE "<5>" /* normal but significant condition*/
#define KERN_INFO "<6>" /* informational*/
#define KERN_DEBUG "<7>" /* debug-level messages*/

Число по умолчанию — 4, что позволяет консоли отображать сообщения только по крайней мере в KERN_WARNING. Вот почему вы не можете видеть лог на уровне KERN_INFO.

person Wayne    schedule 04.09.2013
comment
на удивление не только сообщение KERN_INFO. но весь модуль заработал с помощью echo 7 › /proc/sys/kernel/printk - person Kumar Gaurav; 04.09.2013
comment
Поскольку 7 позволяет отображать все виды журналов от KERN_DEBUG до KERN_EMERG, а не только KERN_INFO. - person Wayne; 04.09.2013
comment
Я просто хочу добавить, что это удается только в том случае, если пользователь является пользователем root. В противном случае перенаправление не удастся. Перенаправление можно заменить на | sudo tee, чтобы оно работало. - person russoue; 20.05.2014
comment
@russoue: Или sudo sh -c 'echo 7 > /proc/sys/kernel/printk' - person Keith Thompson; 25.03.2015

Даже после использования echo "7" > /proc/sys/kernel/printk у меня не сработало printk.

https://lwn.net/Articles/487437/ говорит об измененной или более расширенной версии printk называется pr_** API (pr_info,pr_emerg).

Я использовал pr_info вместо printk, и это решило мою проблему.

person Vijay Kumar    schedule 02.05.2017
comment
У меня даже pr_info() не работает :( Я поместил его в do_tcp_getsockopt(), а затем выполнил wget для общедоступного www-сайта. - person Sridhar Sarnobat; 20.10.2019
comment
Этот ответ только добавляет путаницы. pr_info — это макрос для printk(KERN_INFO, .... Вы также не включили свой код (он отсутствует KERN_INFO или, может быть, есть какая-то другая проблема), так что это просто догадки для любого читателя. - person domen; 30.09.2020

В дополнение к ответу Уэйна, исходный код ядра говорит

Этот макрос заменяется на dynamic_pr_debug(), если установлен параметр CONFIG_DYNAMIC_DEBUG. В противном случае, если DEBUG определен, он эквивалентен printk с уровнем журнала KERN_DEBUG. Если DEBUG не определен, он ничего не делает.

Это означает, что вам нужно либо определить DEBUG, либо использовать динамическая отладка. Мне удалось успешно загрузить модуль с отладочной печатью через

$ sudo insmod module-name.ko dyndbg
person Hritik    schedule 11.05.2021