The Kernel Module Debugger используется для отладки действующего ядра системы и драйверов устройств, а также когда требуется контролировать и приостанавливать выполнение ядра. Kmdb расширяет функциональные возможности отладчика mdb, чтобы контролировать выполнение команд ядра на низком уровне. С помощью mdb возможно только наблюдать работающее ядро. Основная функция kmdb состоит в том, чтобы использовать возможности отладки mdb для отладки ядра in situ. Kmdb позволяет пользователю как наблюдать выполнение команд, так и наблюдать и изменять состояние процессора.
Запуск kmdb:
Для запуска kmdb при загрузке в /boot/solaris/bootenv.rc было добавлено следующее:
setprop ttya-rts-dtr-off true
setprop console 'text'
Для запуска через Grub:
kernel /platform/i86pc/multiboot -kd -B console=ttya
Иногда требуется вывод отладки модуля. Можно установить значение переменной ядра при помощи /W. Например, установить значение moddebug =0x80000000 и затем продолжить загрузку ядра:
[0]> moddebug/W 80000000
[0]> :c
Эта команда производит отладку каждого загружаемого модуля ядра. В большинстве случаев получаемой при этом информации достаточно.
Во время kernel panic с помощью отладчика ядра можно получить интересующую информацию, например stack backtrace – все функции, активные в это время, в обратном порядке:
[0]> $c
Также могут быть полезными команды
[0]> ::msgbuf
[0]> ::status
Первая команда показывает последнюю выводимую ядром информацию, а вторая – состояние системы во время kernel panic.
Если kmdb запущен во время работы ядра, можно получить доступ к отладчику для проверки состояния системы. Это можно сделать, нажав одновременно F1 и A (на SPARC-системах - Stop+A).
На системах с несколькими процессорами можно увидеть, что номер CPU отличен от нуля. Для переключения на другой процессор можно использовать команду вида
[1]> 0::switch
0 – CPU number.
В большинстве случаев средства контроля, предоставляемые kmdb, аналогичны таковым в mdb: точки останова/прерывания (breakpoints, :bp), контрольные точки данных (устанавливаются не для кода, а для элемента данных – watchpoints, ::wp), а также ::continue и различные варианты ::step.
Некоторые команды
::status – выводит общую информацию об исследуемой системе.
$r
::regs - отображает текущие значения регистра.
$c
::stack
$C – трассировка стека ($C: - с указателями фрейма).
addr[,b]
::dump [-g sz] [-e] – дамп минимум b байтов, начиная с адреса addr. Для 64-разрядных систем обычно используется -g 8.
addr::dis – дизассемблирование текста начиная с адреса addr.
[ addr ] :b
[ addr ] ::bp [+/-dDestT] [-n count]
sym ... addr – устанавливает breakpoint по адресу addr.
$b – выводит на экран все breakpoints.
::branches – выводит все переходы (branches) для данного CPU (только для x86).
addr ::delete [id | all]
addr :d [id | all] – удаляет breakpoint по адресу addr.
:z – удаляет все breakpoints.
function ::call [arg [arg ...]] – вызывает указанную функцию с соответствующими аргументами.
cpuid] ::cpuregs [-c cpuid] – показывает текущий набор регистров.
[cpuid] ::cpustack [-c cpuid] – обратная трассировка стека С данного процессора.
::cont
:c – продолжить выполнение программы.
$M – показывает файлы, находящиеся в кэше kmdb для использования с $< dcmd.
::next
:e – анализируемой программе посылается команда, но анализируются вызовы подпрограмм.
$<systemdump - вызывает panic или dump.
::step [branch | over | out] – посылает одну команду анализируемой программе.
::quit [-u]
$q – выход из отладчика. При использовании –u система выходит из состояния ожидания и kmdb выгружается.
addr [, len]::wp [+/-dDestT] [-rwx]
[-ip] [-n count] – установка watchpoint по заданному адресу.
Пример установки breakpoint: