Я новичок в ядре Linux и пытаюсь отладить его с помощью gdb через QEMU. Моя проблема в том, что GDB не останавливается после break start_kernel
. Более подробная информация ниже.
Моя хост-система - ArchLinux 5.0.10-arch1-1-ARCH x86_64
.
Qemu is QEMU emulator version 4.0.0
ГБД GNU gdb (GDB) 8.2.1
.
Отлаженное ядро linux-4.20.12
Я сделал следующие шаги:
- Скомпилировать ядро с
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_KERNEL=y
CONFIG_GDB_SCRIPTS=y
# CONFIG_DEBUG_INFO_REDUCED is not set
- Попробуйте запустить систему LFS-8.4 с ядром через QEMU
qemu-system-x86_64 lfs-8.4-08052019.raw
Система запускается хорошо.
- Запустите эту систему с опциями
stop CPU
и gdbserver
через QEMU
qemu-system-x86_64 lfs-8.4-08052019.raw -S -s
- Start GDB
$ gdb
- Загрузить символы
(gdb) file /mnt/lfs/sources/linux-4.20.12/vmlinux
Reading symbols from /mnt/lfs/sources/linux-4.20.12/vmlinux...done.
- Подключение к QEMU
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x000000000000fff0 in cpu_hw_events ()
- Установить точку останова
(gdb) break start_kernel
Breakpoint 1 at 0xffffffff82761ab5: file init/main.c, line 538.
(я пробовал аппаратную точку останова hbreak
, но результат тот же)
- Продолжить
(gdb) c
Continuing.
Далее система загружает запрос на вход в систему без перерывов, и GDB не показывает никаких новых сообщений.
Что я делаю не так?
UPD: запуск QEMU с возможностью встраивания -kernel
дает тот же результат
qemu-system-x86_64 -kernel /mnt/lfs/sources/linux-4.20.12/arch/x86/boot/bzImage -append 'root=/dev/sda3' -drive file=lfs-8.4-08052019.raw -S -s
UPD2: я попытался запустить QEMU без ключа -S
и немедленно запустить target remote localhost:1234
в gdb. QEMU прекратил загрузку на
Decompressing Linux... Parsing ELF... Performing relocations... done.
Booting kernel.
Когда я набираю s
в GDB, он говорит
(gdb) s
Cannot find bounds of current function
Я подозреваю, что символы отладки в vmlinux не связаны с bzImage. Может быть, они были сделаны неправильно, но я не знаю, как сделать их по-другому.
UPD3: Я собрал ядро 2.6
в среде chroot LFS-8.4. Система не загружена, но ядро успешно отлажено способом, описанным выше! Итак, я думаю, что это проблема новых ядер. Может быть, я должен выключить / включить что-то в моем ядре 4.20.12, но я не знаю, что именно. Для моей цели (читаю Роберта Лава "Разработка ядра Linux") достаточно версии ядра 2.6.