Отладка ядра Linux с помощью GDB через проблему QEMU - PullRequest
1 голос
/ 13 мая 2019

Я новичок в ядре 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

Я сделал следующие шаги:

  1. Скомпилировать ядро ​​с
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_KERNEL=y
CONFIG_GDB_SCRIPTS=y
# CONFIG_DEBUG_INFO_REDUCED is not set
  1. Попробуйте запустить систему LFS-8.4 с ядром через QEMU
qemu-system-x86_64 lfs-8.4-08052019.raw

Система запускается хорошо.

  1. Запустите эту систему с опциями stop CPU и gdbserver через QEMU
qemu-system-x86_64 lfs-8.4-08052019.raw -S -s
  1. Start GDB
$ gdb
  1. Загрузить символы
(gdb) file /mnt/lfs/sources/linux-4.20.12/vmlinux
Reading symbols from /mnt/lfs/sources/linux-4.20.12/vmlinux...done.
  1. Подключение к QEMU
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x000000000000fff0 in cpu_hw_events ()
  1. Установить точку останова
(gdb) break start_kernel
Breakpoint 1 at 0xffffffff82761ab5: file init/main.c, line 538.

(я пробовал аппаратную точку останова hbreak, но результат тот же)

  1. Продолжить
(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.

...