LINUX.ORG.RU

не работает printk()

 , ,


1

1

Всем доброго…

Собираю свою сборку linux из исходников (с помощью buildroot). Отлаживал драйвера, которые вбиты в ядро и в deviceTree. вывод делал через printk(). Потом отвлекся от кастомизации… подключил к процу дополнительную внейшнюю перефирию и решил её добавить в linux как модуль, чтобы быстрее собирать/пересобирать/дебажить. В модуле использовал вывод также через printk()

Кое что не пошло в ядре/deviceTree, решил ядро ещё раз подебажить. printk перестал работать. Не могу потять почему? при сборке ядра вызываю make menuconfig - там куча галок. Может случайно какую-нить галку убрал и вывод printk пропал.

Как заставить printk делать вывод? u-boot+kernel+deviceTree+rootfs заливается в плату. При включении питания идет вывод в кансоль (на RS-232) о ходе загрузки u-boot и ядра Linux. В этом выводе информации не уменьшилось. Но вот printk в не выводит.

Как заставить printk выводить? Почему он не выводит? Может он выводит, но не в туда? Как сам printk подебажить?


Ответ на: комментарий от apt_install_lrzsz

да, 100% загружается. Есть драйвер сетевой карты. В начало функций драйвера probe() и open() я вставил printk(KERN_ALERT, «int fec_enet_open»);

При загрузке ядра вызывается probe() - вывода нет. Если вызвать ifconfig eth0 192.168.1.1, то вызывается open() - вывода нет.

Хорошо, я после printk() в probe() вставил деление на 0. Во время загрузки ядра получаю исключение. Убрал из probe деление на ноль. Вставил деление на ноль рядом с printk в функции open(). Запускаю… ядро загрузилось. Залогинился. Сетевой интерфейс eth0 не поднят. Вызываю ifconfig eth0 192.168.1.1 - падает при делении на ноль (т.к. вызывается open).

Т.е. я 100% прохожу через printk(). Я думаю что printk всё таки выводит. Но куда? может он выводит не в тот tty? или вообще в /dev/null? Как бы его отдебажить?

juvf
() автор топика
Ответ на: комментарий от juvf

Ты ждёшь вывод именно в консоль? В dmesg тоже не видны твои сообщения?

Как подебажить – хз, но просто в ядре много чего использует printk. Если я не ошибаюсь, раз при загрузке ты хоть что-то видишь, то printk в целом работает.

apt_install_lrzsz ★★★
()
Ответ на: комментарий от apt_install_lrzsz

в dmesg моих сообщений нет.

вот например вывод при загрузке… ха… из-за тебя случайно в тонне сообщений в dmesg удел свет в конце тоннеля… Starting kernel …

cmd_mode is 1 ** 517 printk messages dropped ** [ 0.072951][ T1] NET: Registered protocol family 16 [ 0.087298][ T1] DMA: preallocated 256 KiB pool for atomic coherent allocations [ 0.089712][ T1] thermal_sys: Registered thermal governor ‘step_wise’ [ 0.090044][ T1] cpuidle: using governor menu [ 0.090251][ T1] CPU identified as i.MX6Q, silicon rev 1.5 [ 0.302343][ T1] vdd3p0: supplied by regulator-dummy [ 0.319581][ T1] vddarm: bypassed regulator has no supply! [ 0.319619][ T1] vddarm: failed to get the current voltage: -EPROBE_DEFER [ 0.319647][ T1] kobject: ‘regulator.4’ ((ptrval)): kobject_release, parent 00000000 (delayed 300) [ 0.336957][ T1] vddsoc: bypassed regulator has no supply!

все эти сообщения выводятся не через printk(). Я их нашел в исходниках ядра. Зато увидел «printk messages dropped» - вот зацепка…. полез зарываться в сырцы.

juvf
() автор топика
Последнее исправление: juvf (всего исправлений: 1)
Ответ на: комментарий от juvf

Чисто уточнить:

printk(KERN_ALERT, «int fec_enet_open»);

Именно так и написал?

Если да, то запятая не нужна. Изучи сигнатуру printk: https://elixir.bootlin.com/linux/v5.10.111/source/kernel/printk/printk.c#L2096

И что это за KERN_ALERT: https://elixir.bootlin.com/linux/v5.10.111/source/include/linux/kern_levels.h#L9

И как происходит конканетация строк в макросах.

А вообще, если нет под рукой объекта struct device (что бы использовать dev_XXX [dev_alert/dev_err/dev_dbg/etc]), то используй pr_XXX, например: pr_alert() который за тебя всё сделает.

Ну и ещё, освой /dev/kmsg. Т.е. в твоём случае там появится выхлоп от твоего некорректного принта, только с цифирью. Осваивать просто:

cat /dev/kmsg
hatred ★★★
()
Последнее исправление: hatred (всего исправлений: 2)