Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: отладка ядра
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
Метценгерштейн
Допустим, надо негде в драйвере вывести сообщение отладочное.
Как это делать? Printk?
Чуть подробней можно с примером.

Есть ли какой механизм, чтобы можно было загрузить весь проект- ядро в него и от туда ходить по ф-ям. Например, выделил ф-ю- go to definition

Как-то это не правильно поиском по всем файлам рыться...
des333
Цитата(Метценгерштейн @ Mar 23 2016, 12:57) *
Допустим, надо негде в драйвере вывести сообщение отладочное.
Как это делать? Printk?
Чуть подробней можно с примером.

Код
printk("Debug message\n");

sm.gif

Цитата(Метценгерштейн @ Mar 23 2016, 12:57) *
Есть ли какой механизм, чтобы можно было загрузить весь проект- ядро в него и от туда ходить по ф-ям. Например, выделил ф-ю- go to definition

Как-то это не правильно поиском по всем файлам рыться...

Вы можете использовать ctags (например, в связке с vim).
Для этого нужно зайти в директорию с исходным кодом и выполнить команду:
Код
ctags --c-kinds=-m -R .

В vim после этого нужно поставить курсов на название функции и нажать Ctrl+]

Для исходников ядра также есть полезный сайт. Там всё уже проиндексировано и пожно удобно сёрфить по коду.
Tarbal
Цитата(des333 @ Mar 23 2016, 15:17) *
Код
printk("Debug message\n");

sm.gif


Вы можете использовать ctags (например, в связке с vim).
Для этого нужно зайти в директорию с исходным кодом и выполнить команду:
Код
ctags --c-kinds=-m -R .

В vim после этого нужно поставить курсов на название функции и нажать Ctrl+]

Для исходников ядра также есть полезный сайт. Там всё уже проиндексировано и пожно удобно сёрфить по коду.


printk(KERN_ERR " %s data %d\n", __func__, param);

В файле /proc/sys/kernel/printk устанавливается уровень от 0 до 7

KERN_ERR кажется raven 5. Если не писать KERN_ERR и т.д., то используется значение по умолчанию. Кажется это KERN_INFO.

echo 7 > /proc/sys/kernel/printk разрешит печатать все уровни.

Посмотреть напечатанное можнo в системной консоли, в системном логе или в буфере при помощь команды dmesg.

Кроме того можно сделать debug_fs и много чего другого.

Кстати единое адресное пространство ядра позволяет читать и печатать значения переменной любого драйвера. Пишете модуль, который имеет только метод инициализации модуля и он возвращает ошибку(прием из книжки Олега Цилюрика). При инициализации модуля все переменные ядра доступны и могут быть распечатаны. Ну а потом модуль не ставится из-за заложенной ошибки, но при попытке установки вы распечатали нужные вам переменные.
_3m
Цитата(Метценгерштейн @ Mar 23 2016, 12:57) *
Есть ли какой механизм, чтобы можно было загрузить весь проект- ядро в него и от туда ходить по ф-ям. Например, выделил ф-ю- go to definition

Например Eclipse
HowTo use the CDT to navigate Linux kernel source
Tarbal
Цитата(_3m @ Mar 23 2016, 16:22) *


Я платным пользуюсь:
http://www.sourceinsight.com/

Лучше ничего не видел.

Цитата(Метценгерштейн @ Mar 23 2016, 13:57) *
Как-то это не правильно поиском по всем файлам рыться...


grep имеете ввиду?
Очень удобно.
Метценгерштейн
Спасибо за подробное изложение- буду пользоваться.
Поиском по всем файлам- имею ввиду не grep, а реально поиск файлов и текста в них по всему проекту ядра...
Грустно (
http://www.sourceinsight.com/
Как-то бесплатно можно его получить?

Цитата(Tarbal @ Mar 23 2016, 15:38) *
Я платным пользуюсь:
http://www.sourceinsight.com/

Лучше ничего не видел.

Попытался я understand C++ скормить ядро линукса- на 99% ошибку выдает- много для него.


Цитата(Tarbal @ Mar 23 2016, 14:37) *
printk(KERN_ERR " %s data %d\n", __func__, param);

В файле /proc/sys/kernel/printk устанавливается уровень от 0 до 7

KERN_ERR кажется raven 5. Если не писать KERN_ERR и т.д., то используется значение по умолчанию. Кажется это KERN_INFO.

echo 7 > /proc/sys/kernel/printk разрешит печатать все уровни.

Посмотреть напечатанное можнo в системной консоли, в системном логе или в буфере при помощь команды dmesg.

Кроме того можно сделать debug_fs и много чего другого.

Кстати единое адресное пространство ядра позволяет читать и печатать значения переменной любого драйвера. Пишете модуль, который имеет только метод инициализации модуля и он возвращает ошибку(прием из книжки Олега Цилюрика). При инициализации модуля все переменные ядра доступны и могут быть распечатаны. Ну а потом модуль не ставится из-за заложенной ошибки, но при попытке установки вы распечатали нужные вам переменные.

можно немного подробней- как dmesg просмотреть printk?
Префикс был KERN_INFO

или не обязательно dmesg смотреть.
Что удобней? Чтобы только printk вывел мне мои сообщения.
Tarbal
Цитата(Метценгерштейн @ Mar 23 2016, 17:34) *
Поиском по всем файлам- имею ввиду не grep, а реально поиск файлов и текста в них по всему проекту ядра...


можно немного подробней- как dmesg просмотреть printk?
Префикс был KERN_INFO


Оттого вам и нелегко искать, что грепом не пользуетесь.

В консоле пишите команду dmesg и пользуетесь.
KERN_INFO может не напечатать сообщений если прежде не дать команды echo, которую я написал.


nill
Цитата(des333 @ Mar 23 2016, 18:17) *
Вы можете использовать ctags (например, в связке с vim).

А Вы не подскажете что-нибудь для этой связки, что помогло бы получить список функций, которые вызывают текущую или выделенную функцию? В эклипсе такое есть, но иногда хочется и для вима.

Цитата(Tarbal @ Mar 23 2016, 18:37) *
KERN_ERR кажется raven 5. Если не писать KERN_ERR и т.д., то используется значение по умолчанию. Кажется это KERN_INFO.

Этот уровень задаётся параметром CONFIG_DEFAULT_MESSAGE_LOGLEVEL в настройках ядра и в той системе, с которой я работаю в данный момент, он по умолчанию равен 7.

Цитата(Tarbal @ Mar 23 2016, 18:37) *
Кроме того можно сделать debug_fs и много чего другого.

DebugFS и dynamic debugFS - несколько разные вещи и об этом стоит помнить. Эх, если бы мне кто-нибудь об этом сказал чуть пораньше...

Вот неплохая статья по данному вопросу:
http://elinux.org/Debugging_by_printing
Tarbal
Цитата(nill @ Mar 28 2016, 10:52) *
Вот неплохая статья по данному вопросу:
http://elinux.org/Debugging_by_printing



Спасибо. Много нового узнал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.