Настройки формата диска для загрузочного Linux

KGDB + QEMU шаг за шагом

Мой пример QEMU + Buildroot — хороший способ почувствовать вкус без реального оборудования: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/1969cd6f8d30dace81d9848c6bacbb8bad9dacd8#kgdb

Плюсы и минусы по сравнению с другими методами:

  • Преимущество по сравнению с QEMU:
    • у вас часто нет программной эмуляции для вашего устройства, поскольку поставщики оборудования не любят выпускать точные программные модели для своих устройств
    • реальное оборудование намного быстрее, чем QEMU
  • преимущество по сравнению с JTAG: нет необходимости в дополнительном JTAG оборудование, проще в настройке
  • Недостатки по сравнению с QEMU и JTAG: менее заметный и более навязчивый. KGDB полагается на то, что определенные части ядра работают, чтобы иметь возможность общаться с хостом. Так, например. ломается в панике, нельзя посмотреть последовательность загрузки.

Основные шаги:

  1. Скомпилируйте ядро ​​с помощью:

     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
     

    Большинство из них не являются обязательными, но это то, что я тестировал.

  2. Добавьте в команду QEMU:

     -append 'kgdbwait kgdboc=ttyS0,115200' \
    -serial tcp::1234,сервер,сейчас
     
  3. Запустите GDB из корня исходного дерева ядра Linux с помощью:

     gdb -ex 'file vmlinux' -ex 'target remote localhost:1234'
     
  4. В GDB:

     (gdb) c
     

    и загрузка должна завершиться.

  5. В QEMU:

     echo g > /proc/sysrq-trigger
     

    И GDB должен сломаться.

  6. Теперь мы закончили, вы можете использовать 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.

1
25.12.2015, 02:36
0 ответов

Теги

Похожие вопросы