Куда идет вывод печати в ядре?

Я отлаживаю драйвер для Linux (в частности, сервер Ubuntu 9.04), и в коде есть несколько операторов printf.

Где я могу просмотреть вывод этих операторов?

РЕДАКТИРОВАТЬ 1: я пытаюсь записать в ядро, используя файловую систему proc. Код печати

static int proc_fractel_config_write(struct file *file, const char *argbuf, unsigned long count, void *data)
{
    printk(KERN_DEBUG "writing fractel config\n");
    ...

В kern.log я вижу следующее сообщение, когда пытаюсь перезаписать файл /proc/net/madwifi/ath1/fractel_config (конечно, с разным временем).

[ 8671.924873] proc write 
[ 8671.924919] 

Любые объяснения?


person apoorv020    schedule 23.12.2010    source источник


Ответы (7)


Это зависит от дистрибутива, но многие используют klogd(8) для получения сообщений от ядра и либо записывают их в файл (иногда /var/log/dmesg или /var/log/kernel), либо в системный журнал через syslog(3). В последнем случае то, куда попадут записи журнала, будет зависеть от конфигурации syslogd(8).

Одно замечание по поводу команды dmesg: сообщения ядра хранятся в кольцевом буфере, поэтому большие объемы вывода будут перезаписаны.

person Blrfl    schedule 23.12.2010

Много раз сообщения уровня KERN_DEBUG фильтруются, и вам необходимо явно увеличить уровень ведения журнала. Вы можете увидеть системные значения по умолчанию, изучив /proc/sys/kernel/printk. Например, в моей системе:

# cat /proc/sys/kernel/printk
4       4       1       7

первая цифра показывает, что уровень журнала консоли KERN_WARNING (см. proc(5) справочные страницы для получения дополнительной информации). Это означает, что сообщения KERN_NOTICE, KERN_INFO и KERN_DEBUG будут отфильтрованы из консоли. Чтобы увеличить уровень ведения журнала или уровень детализации, используйте dmesg

$ sudo dmesg -n 7
$ cat /proc/sys/kernel/printk
7       4       1       7

Здесь установка уровня 7 (KERN_DEBUG) позволит отображать сообщения всех уровней на консоли. Чтобы автоматизировать это, добавьте loglevel=N к параметрам загрузки ядра, где N — уровень ведения журнала, который вы хотите вывести на консоль, или ignore_loglevel, чтобы вывести все сообщения ядра на консоль.

person ctuffli    schedule 23.12.2010
comment
Константы уровня журнала в настоящее время (начиная с версии 3.6?) определены в ‹linux/kern_levels. .h› - person pevik; 01.04.2014

Вы получите вывод с помощью команды dmesg

person chris    schedule 23.12.2010
comment
Не могу найти то, что ищу, но попробую еще раз. - person apoorv020; 23.12.2010
comment
Это действительно операторы printf? Они действительно должны быть printk, я не думаю, что printf определен в ядре (пожалуйста, поправьте меня, если я ошибаюсь). - person chris; 23.12.2010
comment
Насколько я понимаю, Крис прав. printk() будет выводить в dmesg или /var/log/messages - person cheesysam; 23.12.2010

dmesg выводит все сообщения от ядра. Найти нужные сообщения будет сложно. Лучше использовать комбинацию dmesg и grep и использовать метку, специфичную для драйвера, во всех ваших printk сообщениях. Это облегчит устранение всех нежелательных сообщений.

printk("test: hello world")

dmesg | grep test
person Abhisheietk    schedule 27.12.2010

У меня была эта проблема в Ubuntu 11.10 и 10.04 LTS, в первой я отредактировал /etc/rsyslog.d/50-default.conf, а затем перезапустил rsyslog, используя «sudo service rsyslog restart», чтобы перезапустить rsyslogd. Тогда это сработало.

Обратите внимание, что Ubuntu использует *r*syslogd, а не syslogd.

person Vectorio    schedule 19.01.2012

Вы можете попробовать более высокий уровень, чем KERN_DEBUG, например KERN_INFO. В зависимости от вашей конфигурации сообщения с самым низким приоритетом могут не отображаться.

person Eric Seppanen    schedule 23.12.2010

В centos (по крайней мере, в centos 6.6) вывод будет в /var/log/messages

person Thiyagarajan    schedule 07.12.2014