Удаленная отладка ядра в FreeBSD с использованием последовательной связи

Основные технологии для сохранения времени и сил

Уровень сложности: средний

Джейеш Реин, системный разработчик программного обеспечения, IBM 25.04.2007

В статье исследуется, каким образом удаленно отлаживать ядро FreeBSD, которое работает на целевой машине, не оказывая влияния на производительность системы. Также рассматриваются установка среды отладки с использованием порта последовательной связи, компиляция модифицированного кода ядра, отладка, и даются рекомендации по устранению неисправностей.

Введение

FreeBSD - это развитая операционная система, созданная на базе BSD - версии UNIX®, разработанной в Калифорнийском Университете, Беркли. Она обеспечивает высокую производительность, больше совместимости с другими операционными системами и меньше системного администрирования. FreeBSD включает поддержку на уровне ядра фильтрации брандмауэром IP с учетом контекста и другие сервисы, такие как посреднические шлюзы IP, списки контроля доступа, мандатный контроль доступа, виртуальный хостинг, основанный на jail, и криптографически защищенное хранение данных.

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

Утилита kgdb - это отладчик, основанный на gdb, который предоставляет возможность отладки основных файлов ядра. FreeBSD 5.3 и выше снабжены утилитой kgdb. Если у Вас более старая версия FreeBSD, Вы, тем не менее, можете воспользоваться командой gdb -k, чтобы прочесть файл дампа памяти. kgdb помогает помещать в код ядра точки останова, так что Вы можете пошагово отслеживать значения переменных.

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

Установка среды отладки

Чтобы установить среду удаленной отладки для отладки ядра FreeBSD, Вам требуются две машины: целевая машина и та машина, на которой ведется разработка. Целевая машина работает с образом нового ядра, которое требуется отлаживать. Машина, на которой ведется разработка, используется для отладки ядра, запущенного на целевой машине. Для улучшения производительности в качестве машины, на которой ведется разработка, можно использовать машину с лучшей конфигурацией.

кабель "Нуль-модем"

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

Если Вы подключаете кабель "нуль-модем" к последовательному порту, отладчик может работать на своей текущей максимальной скорости 19200, в отличие от скорости 9600 при соединении через модем. Эта конфигурация, как правило, считается более надежной, чем использование модема, поскольку:

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

" При использовании "нуль-модема" для установки прямого последовательного соединения между двумя компьютерами кабель должен быть подключен, как это показано ниже в листинге 1

Листинг 1. Схема 25-контактного кабеля "нуль-модем"

2 3 "Передача данных" (Transmit Data)

3 2 "Прием данных" (Receive Data)

4 5 "Запрос передачи" (Request to Send)

5 4 "Гашение передачи" (Clear to Send)

6 20 "Готовность набора данных" (Data Set Ready) и

"Идет передача данных" (Carrier Detect)

7 7 "Сигнальная земля" (Signal Ground)

20 6 "Готовность терминала" (Data Terminal Ready)

Модифицирование файлов ядра

Чтобы ядро FreeBSD распознавало среду его удаленной отладки, использующую последовательное соединение, Вам потребуется модифицировать определенные файлы его конфигурации. Прежде всего, сделайте резервную копию изначального конфигурационного файла /usr/src/sys/i386/conf/GENERIC следующим образом:

$cd /usr/src/sys/i386/conf/

$cp GENERIC MYKERNEL

На той машине, на которой ведется Ваша разработка, откройте этот конфигурационный файл предпочитаемым Вами редактором (vi или emacs):

$ emacs /usr/src/sys/i386/conf/MYKERNEL

Добавьте в него следующие строки:

options ddb

#Эта строка добавит отладчик в ядро после компиляции ядра.

makeoptions debug = -g

#Эта строка сообщит компилятору добавить отладочную информацию в новый откомпилированный

#образ ядра, который Вы собираетесь разместить на целевой машине.

Чтобы активизировать соединение по последовательному порту для отладки ядра, Вам потребуется модифицировать тот же самый конфигурационный файл. Найдите в файле /usr/src/sys/i386/conf/MYKERNEL слово sio0, которое обозначает Ваш последовательный порт COM1 на Вашем компьютере. Установите флаг порта 0x80 следующим образом:

device sio0 at isa? port IO_COM1 flags 0x80

Компилирование ядра FreeBSD

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

Сконфигурируйте ядро при помощи следующей команды:

$ cd /usr/src/sys/i386/conf/

$ config -g MYKERNEL

Опция -g добавляет отладочную информацию в образ ядра. После успешного выполнения этой команды обратите внимание на то, как она создает папку MYKERNEL в /usr/src/sys/compile/.

Перейдите в папку /usr/src/sys/compile/MYKERNEL/ следующим образом:

$ cd /usr/src/sys/compile/MYKERNEL/

Вам следует проверить разнообразные зависимости между различными модулями или файлами при помощи следующей команды:

$ make depend

Теперь настала пора собирать ядро и устанавливать новый образ ядра следующим образом:

$ make

$ make install

После успешной операции сборки Ваш образ ядра в папке boot переписывается только что собранным образом ядра; старый образ ядра сохраняется как kernel.old.

Отладка ядра

Перед тем, как начать, удостоверьтесь в том, что Вы соединили кабелем "нуль-модем" машину, на которой ведется разработка, и целевую машину.

Как только компиляция завершится, скопируйте образ ядра /usr/src/sys/compile/MYKERNEL/kernel.debug с машины, на которой ведется разработка, на целевую машину. Поскольку Вам потребуется отлаживать новый образ kernel.debug, Вам следует перезапустить целевую машину с образом

kernel.debug.

Введите следующие команды при загрузке машины, чтобы она вошла в режим отладки:

load kernel.debug

boot -d

Интерфейс отладчика запущен, и это позволяет Вам начать отладку с машины, на которой ведется разработка. Введите:

ddb> gdb

Вам потребуется сразу же форсировать следующий шаг, попросту набрав s (step). Чтобы начать отладку ядра, откройте редактор emacs на машине, на которой ведется разработка. Это позволит Вам открыть утилиту kgdb; только в emacs Вы можете осуществлять отладку ядра построчно. После того, как Вы откроете редактор emacs, запустите gdb с тем образом kernel.debug, который Вы хотите отлаживать, с опцией -k для отладки ядра. В редакторе emacs появится приглашение на ввод команд kgdb. Чтобы начать сессию удаленной отладки, введите:

(kgdb) target remote /dev/cuaa0

Рекомендации по устранению неполадок

Для установки среды отладки очень важно, чтобы у Вас был при себе подходящий кабель "нуль-модем". В этой статье рассматривается 25-контактная схема нуль-модема. Если Вы хотите использовать 9-контактную схему "нуль-модема", посмотрите в раздел Ресурсы, чтобы получить больше информации об установке "нуль-модема".

В момент инициации удаленной отладки Вы можете получить сообщение об ошибке Ignoring packet error.... Эта ошибка указывает на то, что скорости двоичной передачи машины, на которой ведется Ваша разработка, и целевой машины различаются. Скорость двоичной передачи машины - это количество символов, передаваемых в секунду. Скорость двоичной передачи может отличаться от скорости передачи в битах, так как у символа может быть более двух состояний. Вам потребуется настроить обе машины на одинаковую скорость двоичной передачи. Это можно сделать с помощью следующей команды:

set baudrate 9600

Заключение

У применения удаленной отладки ядра вместо традиционной есть различные преимущества. Производительность Вашей системы вообще не затрагивается, поскольку Вы ее отлаживаете удаленно, на машине, на которой ведется Ваша разработка (одной в один момент времени). Вы можете отлаживать столько образов ядра (находящихся на целевых машинах), сколько вы хотите; это становится очевидным для пользователей, как только начинается отладка. Если gdb зависает или прекращает работу из-за какой-нибудь проблемы, стартуйте новый экземпляр gdb и подключитесь к kgdb при помощи целевой дистанционной команды.

Обновлено: 12.03.2015