Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Драйверы устройств в Linux

Часть 10: Отладка в пространстве ядра Linux

Оригинал: "Device Drivers, Part 10: Kernel-Space Debuggers in Linux"
Автор: Anil Kumar Pugalia
Дата публикации: September 1, 2011
Перевод: Н.Ромоданов
Дата перевода: июнь 2012 г.

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

Светлана, вернувшись из больницы, отдыхала в библиотеке, читая разные книги. С тех пор, как она узнала о способе отладки с использованием ioctl, ей не терпелось узнать больше об отладке в пространстве ядра. Ей бы хотелось узнать, как и где можно запускать отладчик пространства ядра. Отладка в пространстве ядра отличается от отладки приложений в пользовательском пространстве, когда у нас в нижнем слое работает операционная система, а над ней есть оболочка или графический интерфейс для запуска отладчика (например, отладчика gdb и отладчика data display debugger - ddd). Затем она наткнулась на интересный способ отладки в пространстве ядра с использованием отладчика kgdb, который, начиная с ядра 2.6.26, является частью ядра.

Изучаем отладку в пространстве ядра

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

  • Добавьте отладчик в само ядро, доступное через обычную консоль. Например, в случае kdb, который не был официальным отладчиком до ядра 2.6.35, нужно было с этого адреса FTP загрузить исходный код (два набора патчей: один — зависящий от архитектуры и один — не зависящий от архитектуры), а затем пропатчить ими исходный код ядра. Но, начиная с ядра 2.6.35, большая часть возможностей отладчика уже есть в официально выпущенном исходном коде ядра. В любом случае необходимо, чтобы поддержка kdb была добавлена в исходный код ядра при его компиляции, установке и загрузке. Отладочный интерфейс kdb будет предоставлен в загрузочном экране.
  • Установите в ядре минимальный отладочный сервер; клиент через определенный интерфейс (например, последовательный или Ethernet) будет подключаться к нему с удаленного хоста или из локального пользовательского пространства. Это kgdb, сервер gdb ядра, должен использоваться с gdb в качестве его клиента. Начиная с ядра 2.6.26, последовательный интерфейс этого сервера является частью официального релиза ядра. Но, если вам интересен сетевой интерфейс, вам все равно придется пропатчить ядро с использованием одного из релизов, взятых на странице проекта kgdb. В любом случае, вам потребуется включить в ядре поддержку kgdb, перекомпиировать, установить и загрузить новое ядро.

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

Настройка ядра Linux с kgdb

Предварительные требования: либо в вашей системе для используемого ядра должен быть установлен исходный код ядра, либо соответствующий релиз исходного кода ядра следует загрузить с сайта kernel.org.

Прежде всего, чтобы можно было в ядре осуществлять отладку, в нем должен присутствовать отладчик kgdb. Чтобы этого добиться, в исходном коде ядра следует указать параметр CONFIG_KGDB=y. Кроме того, чтобы можно было получать доступ к отладчику kgdb через последовательный порт, нужно указать параметр CONFIG_KGDB_SERIAL_CONSOLE=y. Чтобы сделать использование отладчика gdb более информативным, предпочтительно указать параметр CONFIG_DEBUG_INFO с тем, чтобы в ядре можно было формировать символьные данные. Параметр CONFIG_FRAME_POINTER=y разрешает в ядре использовать указатели фреймов, что позволяет gdb более точно выполнять трассировку стека. Все эти параметры есть в пункте "Kernel hacking" ("Настройки ядра") в меню директория исходного кода (все это предпочтительнее выполнять в роли пользователя root или с помощью команды sudo) с помощью следующей команды:

$ make mrproper      # To clean up properly
$ make oldconfig     # Configure the kernel same as the current running one
$ make menuconfig    # Start the ncurses based menu for further configuration

Рис.1: Конфигурирование параметров ядра для отладчика kgdb

На рис.1 эти параметры выделены:

  • "KGDB: kernel debugging with remote gdb" ("KGDB: Отладка ядра с дистанционным использованием gdb") –> CONFIG_KGDB
  • "KGDB: use kgdb over the serial console" ("KGDB: Использование kgdb черед консоль последовательного доступа") –> CONFIG_KGDB_SERIAL_CONSOLE
  • "Compile the kernel with debug info" ("Компиляция ядра с добавленем отладочной информацией") –> CONFIG_DEBUG_INFO
  • "Compile the kernel with frame pointers" ("Компиляция ядра с использование указателей фреймов") –> CONFIG_FRAME_POINTER

Как только вы сохраните конфигурацию, соберите ядро (запустите команду make), а затем выполните команду make install для того, чтобы установить его, а также добавить в конфигурационный файл GRUB запись для установленного ядра. Конфигурационным файлом GRUB может быть, в зависимости от дистрибутива, файл /boot/grub/menu.lst, файл /etc/grub.cfg или аналогичный. После того, как выполните установку, в эту новую запись нужно будет добавить загрузочные ядра kgdb-related так, как показано в выделенном тексте на рис.2.

Рис.2: Конфигурирование GRUB для kgdb

Параметр kgdboc указывается при подключении к gdb через консоль; формат параметра kgdboc= <serial_device>, <baud-rate> где:

  • <serial_device> — файл последовательного устройства (порт) в системе, работающей с отлаживаемым ядром
  • <baud-rate> — скорость в бодах последовательного порта

Параметр kgdbwait указывает ядру задержать загрузку до тех пор, пока клиент gdb не подсоединится к нему, этот параметр должен указываться только после параметра kgdboc.

После этого мы готовы начать. Сделайте копию образа ядра vmlinux для использования в клиентской системе gdb. Перезагрузитесь и в меню GRUB выберите новое ядро, после чего ядро будет ожидать, пока gdb не подключится через последовательный порт.

Все приведенные выше копии экранов сделаны для версии ядра 2.6.33.14. Для исходного кода ядра любого другого релиза 2.6.3x все должно работать точно также. Кроме того, копии экранов для kgdb были получены с использованием файла последовательного устройства /dev/ttyS0, т. е. с использованием первого последовательного порта.

Настройка gdb на другой системе

Ниже приводятся требования к системе:

  • Последовательные порты системы, которая отлаживается, и второй системы, на которой запускается gdb, должны быть соединены с помощью кабеля "нуль-модем" (т. е. переходного последовательного кабеля).
  • Сборку образа ядра vmlinux с подключенным kgdb необходимо скопировать из системы, которая отлаживается, в рабочий директорий в системе, где будет выполняться gdb.

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

(gdb) file vmlinux
(gdb) set remote interrupt-sequence Ctrl-C
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
(gdb) continue

В приведенных выше командах vmlinux является ядром, скопированным из системы, которая отлаживается.

Отладка с использованием gdb и kgdb

Затем все остальные действия будут похожи на отладку приложений с использованием gdb. Можно остановить выполнение с помощью нажатия клавиш Ctrl+C, добавить точки останова с помощью команды b[reak], остановить исполнение с помощью команды s[tep] или команды n[ext] …. - точно также как и при обычном использовании gdb. Если вам потребуются учебники, то в сети есть достаточное количество учебников по GDB. В действительности, если вы не знакомы с текстовым режимом GDB, то воспользуйтесь для GDB любым из стандартных инструментов с графическим интерфейсом, например, ddd, Eclipse и др.

Подведем итог

В настоящий момент Светлане не терпелось попробовать kgdb . Поскольку ей для этого нужно было две системы, она отправилась в лабораторию драйверов устройств Linux. Там она настроила системы и запустила gdb так, как это было описано выше.


К предыдущей статье Оглавление К следующей статье