Отладка модуля ядра linux

Linux kernel debug

Содержание

Использование только отладчика GDB

Запуск отладчика для работы с ядром почти ни чем не отличается от отладки выполняющегося процесса.

Можно пользоваться практически всеми командами программы GDB для чтения информации. Если ядро было собрано с отладочной информацией, то GDB сможет выдавать больше информации (разыменовывать указатели и выводить дампы структур данных). Нельзя изменять данные ядра. Нет возможности пошагово выполнять код ядра, или устанавливать точки остановки.

Отладка ядра Linux с использованием отладчика GDB и эмулятора аппаратного обеспечения QEMU

Подготовка ядра

Ядро необходимо собрать с отладочной информацией:

Или в файле .config изменить строки «# CONFIG_DEBUG_KERNEL is not set» и «# CONFIG_FRAME_POINTER is not set» на «CONFIG_DEBUG_KERNEL=y» и «CONFIG_FRAME_POINTER=y» соответственно.

Запуск QEMU

После того как ядро будет собрано можно ( в том случае если не требуется отлаживать модули ) сразу же приступать к запуску QEMU без подготовки образа диска.

Аргумент -s необходим для того, чтобы эмулятор ожидал подключения отладчика к порту 1234. Сменить порт можно аргументом [-p порт].
Аргумент -S необходим для того, чтобы QEMU не запускал процессор при запуске эмулятора ( это необходимо для того, что бы ядро можно было отлаживать начиная со start_kernel ).

В том случае, если требуется отладка модулей то необходимо сначала скопировать модули и ядро на образ диска QEMU. Далее предполагается что образ диска в формате raw.

Примечание:
Преобразовать из формата, например qcow, в raw можно следующей командой:

Из других форматов преобразуется аналогичным образом.

Монтирование образа диска:

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

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

Пример для rpm и дистрибутива Fedora 9:

Примечание:
Иногда установить пакет не получается, тогда можно сделать это вручную.

Если скрипта installkernel нет, то необходимо скопировать ядро и настроить загрузчик самостоятельно информацию о том, как это сделать можно найти, например, здесь:
Grub: http://en.gentoo-wiki.com/wiki/Quick_GRUB
Lilo: http://www.acm.uiuc.edu/workshops/linux_install/lilo.html

Запуск GDB

Файл vmlinux — это декомпрессированный исполняемый образ ядра, который хранится в корне каталога исходных кодов, где выполнялась сборка работающего ядра. Сжатые файлы zImage, или bzImage использовать нельзя.

Чтобы отлаживать модуль необходимо импортировать таблицу имён модуля в GDB и указать адрес в памяти, куда он был загружен.

Источник

Драйверы устройств в 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, является частью ядра.

Читайте также:  Запуск восстановления системы при запуске windows 10

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

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

  • Добавьте отладчик в само ядро, доступное через обычную консоль. Например, в случае 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 ) с помощью следующей команды:

Рис.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.

Читайте также:  Canon l11121e драйвер mac os

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Русские Блоги

элементы отладки ядра Linux

1、early printk loglevel

Вывод журнала printk реализуется консолью (будет объяснено в других статьях). Поскольку консоль не была зарегистрирована для последовательного порта и других устройств (реализованных на этапе проверки устройства) во время первоначального запуска ядра, журнал не может быть выведен через обычную консоль.
С этой целью Linux предоставляет ранний консольный механизм для реализации раннего вывода журнала до регистрации консоли для устройства. Эта консоль будет зарегистрирована на ранней стадии запуска ядра и в основном будет печатать данные напрямую через простой метод записи устройства вывода (например, последовательного устройства).

CONFIG_DEBUG_LL
ENTRY (printch) определен в arch / arm / debug.S и должен быть открыт с помощью этого макроса.
CONFIG_EARLY_PRINTK

2、initcall_debug

Параметр initcall_debug определяет местонахождение сообщения об ошибке во время инициализации.

3 , Печать ядра

Linux Ядро использует функцию printk для вывода отладочной информации.Эта функция аналогична функции printf библиотеки C, но используется в ядре. Пользователь может добавить функцию printk в определенную позицию в коде ядра и напрямую распечатать интересующую информацию на экране или в файле журнала.

Читайте также:  Вставить символ mac os

Функция printk классифицирует отладочную информацию в соответствии с уровнем журнала (loglevel). Уровень журнала определяется макросом, раскрываемым в строку, и препроцессор объединяет его и текст сообщения в строку во время компиляции.

(1) , Не вызывайте printk напрямую, а вызывайте pr_xxx следующим образом

(2) 、 Не вызывайте printk напрямую, а вызывайте dev_xxx

Имя устройства будет префиксом печати, dev_warn (); dev_info (); dev_emerg ();

(3) Печать с указанием функции и номера строки

printk(«%s%d\n», __func__, __LINE__);

Динамическая регулировка уровня печати printk

Printk имеет 8 уровней логирования, которые определены в lichee \ linux-3.10 \ include \ linux \ kern_levels.h, где значение варьируется от 0 до 7. Чем меньше значение, тем ниже приоритет. Уровень неопределенного приоритета по умолчанию определен в /kernel/printk.c. Если значение приоритета меньше значения целочисленной переменной console_loglevel, информация может отображаться

Printk можно вызывать в прерываниях, мягких прерываниях и спин-блокировках. Накладные расходы printk очень высоки, особенно печать через последовательный порт, что значительно замедлит работу системы, поэтому ненужная печать в продукте или «тихая» в bootargs уменьшаются.

(5) Печать ядра с отметкой времени

Проследите процесс вызова функции.

4, Отладка модуля ядра на уровне исходного кода

Менее используется, обратитесь к документам по отладке kdb, gdb (продолжение следует, я использовал gdb только для отладки верхнего уровня, я не настраивал ядро, и видео носит общий характер).

5, Ой и паника

Китайское значение английского слова «упс» — «упс», что означает «воскликнуть», а китайское значение английского слова «паника» — «паника». Таким образом, степень паники, очевидно, выше, чем степень паники, потому что удивление не обязательно вызывает панику, а паника — это легче всего потерять контроль.После паники ядра происходит сбой, обычно известный как сбой ядра. Но ядро ​​сообщает об упс, на этот раз может не быть паники, оно может просто сообщить об упс, чтобы убить процесс.

Упс не обязательно паника, ой контекста прерывания будет паника, если panic_on_oops установлено в 1, все паника.

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

6, Другие параметры и функции отладки ядра

(1)、 no_console_suspend

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

(2), SLUB_DEBUG kmemleak —> Обнаружение памяти

Linux Общие ошибки доступа к памяти включают: выход за границы, доступ к памяти, которая была освобождена (использование после освобождения), повторное освобождение, утечка памяти, переполнение стека и т. Д.

(A). SLUB_DEBUG использует распределители slab / slub в большом количестве небольшой памяти в ядре SLUB_DEBUG.Slub_debug предоставляет такие функции, как доступ к освобожденной памяти, международный доступ и повторное освобождение памяти. 。

Поддержка конфигурации ядра slub_debug

Перенастройте параметры ядра и откройте следующие параметры.

(1) , Повторный выпуск

(2) , Память вне пределов

(b) , Kmemleak — это инструмент для обнаружения утечек памяти, обеспечиваемых ядром. Он запускает поток ядра для сканирования памяти и выводит количество новых найденных объектов, на которые нет ссылок.

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

CONFIG_HAVE_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=400
# CONFIG_DEBUG_KMEMLEAK_TEST is not set
CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y——— Или отключите эту опцию, вам не нужно добавлять kmemleak = on в командную строку.

(3), DEBUG_ATOMIC_SLEEP -> Обнаружение сна при спин-блокировке, прерывании, мягком прерывании

(4) 、RCU Stall

Элементы конфигурации ядра:

(5)、Lockup detector

Прерывание NMI + прерывание по таймеру + поток RT с высоким приоритетом

Используйте прерывания таймера, чтобы определить, есть ли у высокоприоритетных потоков шанс на выполнение -> softlockup

Используйте NMI, чтобы проверить, есть ли шанс выполнить прерывание таймера -> жесткая блокировка

Источник

Оцените статью