8.6 Отладчики ядра

Предыдущая  Содержание  Следующая V*D*V

В отличие от обычных RTOS, где для отладки программного обеспечения используется один отладчик, система на базе Linux требует двух отладчиков: отладчик ядра и отладчик приложений. Так происходит потому, что ядро и приложения используют разные адресные пространства. Этот раздел рассказывает об использовании двух популярных отладчиков ядра: KDB и KGDB.

Ядро Linux не имеет встроенного отладчика; отладчики ядра сохраняются в виде отдельных проектов. (* Хотя это больное место многих разработчиков ядра, Линус считает, что отладчики исправляют симптомы, а не предлагают лечение.) KDB и KGDB имеют разные среды работы и предоставляют разные функциональные возможности. В то время, как KDB является частью ядра Linux и обеспечивает механизм выполнения для просмотра различных компонентов, таких как память и структуры данных ядра, KGDB работает в тандеме с GDB и требует для взаимодействия с заглушкой KGDB, работающей на целевой платформе, отдельную базовую машину. Таблица 8.2 сравнивает KGDB и KDB.

 

Таблица 8.2 Сравнение KDB и KGDB

 

 

KDB

KGDB

Среда отладчика

Это отладчик, который должен быть встроен в ядро. Всё, что требуется, это консоль, с помощью которой могут быть введены команды, вывод также отображается в консоли.

Требует отдельной машины разработчика, чтобы запустить отладчик как обычный процесс, который взаимодействует с целевой платформой с использованием протокола GDB через последовательный кабель. Последние версии KGDB поддерживают интерфейс Ethernet.

Требования к поддержке ядром/патчам

KDB требует два патча: универсальный патч для ядра, который реализует архитектурно-независимые функциональные возможности, и архитектурно-зависимый патч.

KGDB использует один патч, который состоит из трёх компонентов:

Заглушка GDB, которая реализует протокол GDB на целевой стороне,

Изменения в последовательном (или Ethernet) драйвере для отправки и получения сообщений между целевой платформой и машиной разработчика,

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

Поддержка отладки на уровне исходных текстов

Отладка на уровне исходных текстов не поддерживается

Поддержка отладки на уровне исходных текстов предоставляется при условии, что ядро на машине разработчика скомпилировано с флагом -g и доступно дерево исходных кодов ядра. На машине разработчика, на которой запускается приложение отладчика, опция -g указывает gcc создать во время компиляции отладочную информацию, которая в сочетании с исходными файлами обеспечивает отладку на уровне исходных текстов.

Предлагаемые возможности для отладки

Наиболее часто используемыми функциями отладки KDB являются:

отображение и изменение содержимого памяти и регистров

применение точек останова

трассировка стека

Наряду с установленными пользователем точками останова, KDB вызывается, когда ядро попадает в состояние неисправимой ошибки, такой как паника или OOPS. Для выявления проблемы пользователь может использовать вывод KDB.

Поддержка команд контроля исполнения GDB, трассировки стека и установленных KGDB точек наблюдения, наряду с множеством других функций, таких как анализ потоков.

Отладка модулей ядра

KDB обеспечивает поддержку для отладки  модулей ядра.

Отладка модулей с использованием KGDB сложна, потому что модуль загружен на целевой машине, а отладчик (GDB) работает на другой машине; так что отладчик KGDB должен быть проинформирован об адресе загрузки модуля. KGDB версии 1.9 сопровождается специальным GDB, который может автоматически обнаружить загрузку и выгрузку модуля. Для KGDB версий равной или меньшей 1.8, разработчик для загрузки модуля объекта в память GDB и указания адреса загрузки модуля должен использовать явную команду GDB addsymbol-file.

Веб-сайты для загрузки

http://oss.sgi.com/projects/kdb/

http://kgdb.linsyssoft.com/

 

Использование KDB может быть разделено на два этапа:

 

Сборка ядра с патчем KDB: загрузите патчи с веб-сайта, указанного в Таблице 8.2, и примените его к дереву исходных текстов ядра. После настройки ядра с включённой опцией KDB соберите ядро.

Запуск ядра с включённым KDB: включен или выключен KDB при загрузке ядра определяет параметр конфигурации сборки KDB_OFF; при выборе этой опции KDB не активирован. В таком случае KDB должен быть активирован явно; это делается двумя способами. Один из способов состоит в передаче ядру аргумента строки загрузки kdb=on. Другим способом активации является использование файла /proc/sys/kernel/kdb с помощью следующей команды:
 
echo “1” > /proc/sys/kernel/kdb

 

Список команд KDB может быть найден в файлах каталога Documentation/kdb после того, как дерево исходных текстов ядра было пропатчено.

Использование KGDB можно разделить на три этапа:

 

Сборка ядра с патчем KGDB: это требует получения патча ядра KGDB, применение патча к ядру, сборку ядра с  включённой поддержкой KGDB.

Установление соединения между целевой машиной и базовой машиной с помощью протокола GDB: когда ядро загружается, оно ожидает установления соединения от базовой машины с помощью протокола KGDB и сообщает это пользователю, выбрасывая следующее сообщение:
 
Waiting for connection from remote gdb...
 
Пользователь должен запустить отладчик на базовой машине и подключиться к целевой машине, что укажет ядру продолжить загрузку.

Использование отладчика для отладки ядра: после этого можно удалённо отлаживать ядро при помощи стандартных команд GDB.

 

Предыдущая  Содержание  Следующая