реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
Метценгерштейн
сообщение Mar 23 2016, 09:57
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Допустим, надо негде в драйвере вывести сообщение отладочное.
Как это делать? Printk?
Чуть подробней можно с примером.

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

Как-то это не правильно поиском по всем файлам рыться...
Go to the top of the page
 
+Quote Post
des333
сообщение Mar 23 2016, 11:17
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(Метценгерштейн @ 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+]

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


--------------------
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 23 2016, 11:37
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(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 и много чего другого.

Кстати единое адресное пространство ядра позволяет читать и печатать значения переменной любого драйвера. Пишете модуль, который имеет только метод инициализации модуля и он возвращает ошибку(прием из книжки Олега Цилюрика). При инициализации модуля все переменные ядра доступны и могут быть распечатаны. Ну а потом модуль не ставится из-за заложенной ошибки, но при попытке установки вы распечатали нужные вам переменные.
Go to the top of the page
 
+Quote Post
_3m
сообщение Mar 23 2016, 12:22
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



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

Например Eclipse
HowTo use the CDT to navigate Linux kernel source
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 23 2016, 12:38
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(_3m @ Mar 23 2016, 16:22) *


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

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

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


grep имеете ввиду?
Очень удобно.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Mar 23 2016, 13:59
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Спасибо за подробное изложение- буду пользоваться.
Поиском по всем файлам- имею ввиду не 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 вывел мне мои сообщения.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 23 2016, 14:02
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



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


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


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

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


Go to the top of the page
 
+Quote Post
nill
сообщение Mar 28 2016, 06:52
Сообщение #8


Частый гость
**

Группа: Validating
Сообщений: 124
Регистрация: 10-08-05
Пользователь №: 7 502



Цитата(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

Сообщение отредактировал nill - Mar 28 2016, 06:53
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Mar 28 2016, 11:54
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



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



Спасибо. Много нового узнал.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 11:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01414 секунд с 7
ELECTRONIX ©2004-2016