KGDB + QEMU шаг за шагом
Мой пример QEMU + Buildroot — хороший способ почувствовать вкус без реального оборудования: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/1969cd6f8d30dace81d9848c6bacbb8bad9dacd8#kgdb
Плюсы и минусы по сравнению с другими методами:
Основные шаги:
Скомпилируйте ядро с помощью:
CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_INFO=y
CONFIG_CONSOLE_POLL=y
CONFIG_KDB_CONTINUE_CATASTROPHIC=0
CONFIG_KDB_DEFAULT_ENABLE=0x1
CONFIG_KDB_KEYBOARD=y
CONFIG_KGDB=у
CONFIG_KGDB_KDB=y
CONFIG_KGDB_LOW_LEVEL_TRAP=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_KGDB_TESTS=y
CONFIG_KGDB_TESTS_ON_BOOT=n
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
CONFIG_SERIAL_KGDB_NMI=n
Большинство из них не являются обязательными, но это то, что я тестировал.
Добавьте в команду QEMU:
-append 'kgdbwait kgdboc=ttyS0,115200' \
-serial tcp::1234,сервер,сейчас
Запустите GDB из корня исходного дерева ядра Linux с помощью:
gdb -ex 'file vmlinux' -ex 'target remote localhost:1234'
В GDB:
(gdb) c
и загрузка должна завершиться.
В QEMU:
echo g > /proc/sysrq-trigger
И GDB должен сломаться.
Теперь мы закончили, вы можете использовать GDB как обычно:
b sys_write
с
Протестировано в Ubuntu 14.04.
KGDB + Raspberry Pi
Та же установка, что и выше, почти работала на Raspberry Pi 2, Raspbian Jessie 27 мая 2016 г.
Вам просто нужно научиться выполнять шаги QEMU на Pi, которые легко Google:
добавьте параметры конфигурации и перекомпилируйте ядро, как описано в https://www.raspberrypi.org/documentation/linux/kernel/building.md. К сожалению, в ядре по умолчанию отсутствуют параметры. build, в частности без символов отладки, поэтому требуется перекомпиляция.
отредактируйте cmdline.txt
загрузочного раздела и добавьте:
kgdbwait kgdboc=ttyAMA0,115200
подключить gdb
к последовательному порту с помощью:
gdb -ex 'file vmlinux' -ex 'target remote /dev/ttyUSB0'
Если вы не знакомы с серийным номером, посмотрите это: https://www.youtube.com/watch?v=da5Q7xL_OTo Все, что вам нужно, это дешевый адаптер , подобный этому . Убедитесь, что вы можете получить оболочку через последовательный порт, чтобы убедиться, что она работает, прежде чем пробовать KGDB.
do:
echo g | sudo тройник /proc/sysrq-триггер
из сеанса SSH, поскольку серийный номер уже занят GDB.
С помощью этой настройки я смог поставить точку останова в sys_write
, приостановить выполнение программы, вывести список источников и продолжить.
Однако иногда, когда я делал next
в sys_write
, GDB несколько раз зависал и печатал это сообщение об ошибке:
Ignoring packet error, continuing...
, так что я не уверен, что что-то не так с моим setup, или если это ожидается из-за того, что какой-то фоновый процесс делает в более сложном образе Raspbian.