2009-04-22

Linux kernel debugging

Всем известно, что в vmware 6-й ветки появилась возможность отлаживать ядро гостевой операционной системы. Для включения отладки необходимо в конфиг виртуальной машины (файл *.vmx) добавить строку debugStub.listen.guest32=1 либо debugStub.listen.guest64=1. Vmware откроет порт 8832 (или 8864 для 64-битных систем) на главной системе(хосте):
>netstat -an | grep 88
TCP 127.0.0.1:8832 0.0.0.0:0 LISTENING

Как видим, подключиться можно только с локалхоста. Используеться протокол gdb, соответственно, берём gdb (версию для Windows в сети найти не трудно), и подключаемся:
> gdb -q
(gdb) target remote localhost:8832

Для удобного ковыряния в ядре, потребуеться собрать ядро с отладочными сиволами, обчычно ядра, установленные в различных дистрибутивах по умолчанию собраны без отладочных символов (что и не удевительно, поскольку включение символов несколько увеличивает размер образа ядра). Чтобы пересобрать ядро используя текущюю рабочюю конфигурацию, переходим в каталог исходников ядра (обычно /usr/src/linux), и выролняем:
make oldconfig
make menuconfig

В меню включаем отладочные символы:
Kernel hacking  --->
[*] Compile the kernel with debug info

или "CONFIG_DEBUG_KERNEL=y" в конфиге ядра (/usr/src/linux/.config). На стадии конфигурирования ядра желательно отключить всё лишнее (например можно отключть поддержку IPv6, если она не нужна, и ненужные драйвера), и всё что возможно вкомпилить в ядро, а не в виде модулей. Однако netfilter и драйвера сетевых интерфейсов я бы посоветовал всё-таки собрать в виде модулей. Можно вместо make oldconfig, сделать make defconfig, что-бы создать минимальный конфиг по умолчанию для данной архитектуры, а потом в make menuconfig включать необходимые опции, и добавить нужные драйвера (lspci может в этом помоч). Далее собираем ядро:
make
make modules_install

Файл /usr/src/linux/vmlinux - это несжатый образ ядра, его переносим с гостевой системы на основную. Желательно так-же иметь на основной стсиеме исходные коды ядра соответсвующей версии. Кладём файл vmlinux на основную систему в папку где находяться исходники ядра (у меня D:\kernel\). Устанавливаем новое ядро и перезагружаем гостевую систему. Теперь можно спокойно отлаживать ядро загрузив в gdb несжатый образ ядра с отладочнымм символами:
> gdb -q
(gdb) target remote localhost:8832
<...>
(gdb) file vmlinux

P.S.
по этой ссылке http://wiki.opennet.ru/Linux_kernel_debug рекомендуют включить в ядре такие опции:
Kernel hacking  --->
[*] Compile the kernel with debug info
[*] Compile the kernel with frame pointers

Архив