В отличие от обычных 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.
|