Некоторое время назад я успешно использовал технику, к которой относится «alinrus». Часть, которую он упомянул, подробно объясняется на:
http://stackframe.blogspot.com/2007/04/debugging-linux-kernels-with.html
Я фактически использовал его непосредственно с хоста Windows. Поэтому после настройки виртуальной машины (главным образом, включающей удаленную отладку и загрузку ядра (файл vmlinux, , а не файл vmlinuz, который не может интерпретироваться gdb)), вам необходимо выполнить следующее:
- Установите последнюю версию gdb на вашем компьютере с Windows (я использовал тот, что в Cygwin).
- Запустите gdb с файлом vmlinux, а затем выполните команду «target remote localhost: 8832» для подключения виртуальной машины (когда она работает).
Это то, что вам нужно для отладки кода, который статически связан с ядром. Вы можете попробовать статически связать свой модуль, и выше будет достаточно. Настройка отладки для динамически связанного модуля требует дополнительного шага, чтобы сообщить gdb об использовании файла вашего модуля и о том, как интерпретировать разделы файла.
3a. Запустите приведенный ниже скрипт для вашего файла .ko после загрузки модуля (и до его сбоя :)).
3b. Вставьте получившиеся строки «add-symbol-file mymodule.ko 0xe8884000 ...» в gdb. Затем GDB загрузит ваш модуль, если он сможет найти его в текущем каталоге или указанном вами пути.
Сценарий от http://anomit.com/2009/11/04/kernel-module-debugging-a-simple-technique/
#!/bin/sh
#
# gdbline module image
#
# Outputs an add-symbol-file line suitable for pasting into gdb to examine
# a loaded module.
#
cd /sys/module/$1/sections
PROG=${1}.ko
echo -n add-symbol-file ${PROG} `/bin/cat .text`
#echo -n add-symbol-file $2 `/bin/cat .text` #Take second argument to be gdb name of program/object file
for section in .[a-z]* *; do
if [ $section != ".text" ]; then
echo " \\"
echo -n " -s" $section `/bin/cat $section`
fi
done
echo
Есть еще вещи, которые вы можете захотеть сделать. Для реальной отладки на уровне исходного кода вам понадобится отсосать весь исходный код ядра и модуля, чтобы GDB мог его найти. И есть некоторые приемы, которые вы можете использовать для компиляции вашего модуля без оптимизации, как только вы доберетесь до этого.
Возможно, вы также захотите взглянуть на техническую заметку Workstation 7.0 по отладке воспроизведения, которая содержит информацию об отладке модулей ядра. VMware знает свое дело.
http://www.vmware.com/pdf/ws7_replay_linux_technote.pdf