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

18

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

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

EDIT1: то, что я пытаюсь сделать, это записать в ядро ​​с помощью файловой системы 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] 

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

    
задан apoorv020 23.12.2010 в 12:42
источник

7 ответов

10

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

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

    
ответ дан Blrfl 23.12.2010 в 13:00
23

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

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

первое число показывает, что уровень журнала консоли равен KERN_WARNING (см. proc (5) man для получения дополнительной информации). Это означает, что 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 , чтобы распечатать все сообщения ядра на консоли.

    
ответ дан ctuffli 23.12.2010 в 18:16
  • Константы уровня журнала в настоящее время (начиная с 3.6?), определенные в <linux / kern_levels.h> –  pevik 01.04.2014 в 18:26
5

Вы получите результат с командой dmesg

    
ответ дан chris 23.12.2010 в 12:52
  • Не могу найти то, что я ищу, но я попробую еще раз. –  apoorv020 23.12.2010 в 13:02
  • Являются ли они действительно "printf" заявлениями? Они действительно должны быть «printk», я не думаю, что printf определен в ядре (пожалуйста, поправьте меня, если я ошибаюсь). –  chris 23.12.2010 в 13:14
  • Я понимаю, что Крис прав. printk () будет выводить на dmesg или / var / log / messages –  cheesysam 23.12.2010 в 13:50
3

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

printk("test: hello world")

dmesg | grep test
    
ответ дан Abhisheietk 27.12.2010 в 06:44
1

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

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

    
ответ дан Vectorio 19.01.2012 в 17:31
0

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

    
ответ дан Eric Seppanen 23.12.2010 в 16:57
0

В centos (Atleast in centos 6.6) вывод будет в / var / log / messages

    
ответ дан Thiyagarajan 07.12.2014 в 17:33