if (terrible_thing)
panic("foo is %ld!\n", foo);
Иногда необходимо просто вывести на консоль трассировку стека, чтобы облегчить отладку. В этих случаях используется функция dump_stack()
. Эта функция отображает на консоль содержимое регистров процессора и обратную трассировку вызовов функций.
if (!debug_check) {
printk(KERN_DEBUG "выдать некоторую информацию...\n");
dump_stack();
}
Магическая клавиша SysRq
Использование магической клавиши SysRq
, которую можно активизировать с помощью конфигурационного параметра CONFIG_MAGIC_SYSRQ
на этапе компиляции, часто позволяет значительно облегчить жизнь. Клавиша SysRq
является стандартной на многих клавиатурах. Для аппаратных платформ i386 и PPC ей соответствует комбинация клавиш ALT-PrintScreen
. Если указанный конфигурационный параметр активизирован, то специальные комбинации клавиш позволяют взаимодействовать с ядром независимо от того, чем ядро в данный момент нанимается. Это в свою очередь позволяет выполнять некоторые полезные операции даже на неработоспособной системе.
В дополнение к конфигурационному параметру существует вызов sysctl
для включения и выключения этого свойства.
echo 1 > /proc/sys/kernel/sysrq
Список возможных комбинаций клавиш можно получить с консоли путем нажатия комбинации клавиш SysRq-h
. Комбинация клавиш SysRq
-s выполняет синхронизацию не сохраненных буферов файловых систем на диск, комбинация SysRq-u
размонтирует все файловые системы, a SysRq-b
— перегружает машину. Последовательное использование этих комбинаций клавиш позволяет более безопасно перегрузить машину, которая зависла, чем простое нажатие кнопки reset
.
Если машина заблокирована очень сильно, то она может не отвечать на магические комбинации клавиш SysRq
, или соответствующая операция не будет выполнена. Если же повезет, то эти комбинации клавиш смогут помочь при отладке, а также сохранить данные. В табл. 18.2 приведен список поддерживаемых команд SysRq
.
Таблица 18.2. Список поддерживаемых команд SysRq
Команда | Описание |
---|---|
SysRq-b |
Перегрузить машину (reboot) |
SysRq-e |
Послать сигнал SIGTERM всем процессам, кроме процесса init |
SysRq-h |
Отобразить на консоли помощь по использованию комбинаций клавиш SysRq |
SysRq-i |
Послать сигнал SIGKILL всем процессам, кроме процесса init |
SysRq-k |
Клавиша безопасного доступа: завершить все процессы, связанные с текущей консолью |
SysRq-l |
Послать сигнал SIGKILL всем процессам, включая процесс init |
SysRq-m |
Отобразить на консоли дамп информации по использованию памяти |
SysRq-o |
Завершить работу машины (shutdown) |
SysRq-p |
Отобразить на консоли дамп регистров памяти |
SysRq-r |
Отключить прямой режим работы клавиатуры (raw mode) |
SysRq-s |
Синхронизировать данные смонтированных файловых систем с дисковыми устройствами |
SysRq-t |
Отобразить на консоли дамп информации о заданиях |
SysRq-u |
Размонтировать все смонтированные файловые системы |
В файле Documentation/sysrq.txt
, который находится в каталоге исходных кодов ядра, приводится более полное описание. Реализация поддержки магической комбинации клавиш находится в файле drivers/char/sysrq.с
. Магические комбинации клавиш SysRq
— жизненно необходимый инструмент, который помогает в отладке и сохранении "гибнущей" системы, так как предоставляет большие возможности для любого пользователя при работе с консолью. Тем не менее необходимо соблюдать осторожность при его использовании на критичных машинах. Если же машина используется для разработок, то польза от этих команд огромная.
Сага об отладчике ядра
Многие разработчики ядра давно высказываются о необходимости встроенного в ядро отладчика. К сожалению, Линус не желает видеть отладчик ядра в своем дереве исходного кода, Он уверен, что использование программ-отладчиков приводит к плохому исправлению ошибок неправильно информированными разработчиками. Никто не может поспорить с его логикой — исправления ошибок, построенные на основании хорошего понимания кода скорее всего будут верными. Тем не менее большинство разработчиков ядра все же нуждаются в официальном отладчике, встроенном в ядро. Поскольку такая возможность навряд ли появится в ближайшее время, то взамен было разработано несколько заплат, которые добавляют поддержку отладчика в стандартном ядре. Не смотря на то, что это внешние и неофициальные заплаты, они являются мощными инструментами с высокой функциональностью. Перед тем, как обращаться к этим решениям, посмотрим, на сколько нам может помочь стандартный отладчик ОС Linux — gdb.
Использование отладчика gdb
Для того, чтобы мельком заглянуть внутрь работающего ядра можно использовать стандартный отладчик GNU. Запуск отладчика для работы с ядром почти ни чем не отличается от отладки выполняющегося процесса.
gdb vmlinux /proc/kcore
Файл vmlinux
— это декомпрессированный исполняемый образ ядра, который хранится в корне каталога исходных кодов, где выполнялась сборка выполняющегося ядра. Сжатые файлы zImage
, или bzImage
использовать нельзя.
Опциональный параметр /proc/kcore
исполняет роль файла core
, чтобы позволить отладчику читать из памяти выполняющегося ядра. Чтобы иметь возможность читать этот файл, необходимо иметь права пользователя root.
Можно пользоваться практически всеми командами программы gdb для чтения информации. Например, чтобы напечатать значение переменной можно воспользоваться командой.
p global_variable
Для того, чтобы дизассемблировать код функции можно выполнить следующую команду.
disassemble function
Если ядро было скомпилировано с указанием флага -g (необходимо добавить -g
к значению переменной CFLAGS
в файле Makefile
ядра), то отладчик gdb сможет выдавать больше информации. Например, можно выводить дампы структур данных и разыменовывать указатели. При этом также получается ядро значительно большего размера, поэтому для обычной работы не следует компилировать ядро с отладочной информацией.