Есть ли краткое описание от A до Z того, как отладить ядро ​​Linux, которое было протестировано и содержит ВСЕ необходимые шаги? Особенно для Йокто? - PullRequest
0 голосов
/ 17 апреля 2020

Отладка ядра Linux с kgdb поверх rs-232 требует нескольких этапов подготовки. Я нашел отличную документацию, но нет единственного источника, который полностью самодостаточен и суммирует все необходимые шаги, не объясняет целую вечность и был протестирован. А также охватывает Yocto.

Существует ли какой-либо источник, который охватывает все, что необходимо в одном кратком описании?

Т.е.:

  • Какие файлы необходимы в каталог, из которого запускается GDB (например, сведения о ядре, источник, vm linux) и как его найти, где его разместить?
  • Когда и где можно получить кросс-gdb?
  • ВСЕ необходимы параметры конфигурации ядра, также неочевидные (например, CONFIG_RANDOMIZE_BASE)
  • Как настроить последовательные порты
  • Объяснение работы взад и вперед взлома в debugee и отладчик, чтобы начать работу.
  • Объяснение одной из опций rock- solid остановки ядра, которое работает везде.
  • Объяснение того, как это сделать не только для P C - P C отладка, но также и для целей Yocto.

1 Ответ

2 голосов
/ 17 апреля 2020

Отладка ядра Linux с помощью Nullmodem-Cable:

Мне потребовалось некоторое время, чтобы получить соединение kgdb с полностью работающим ядром Linux. Я поделюсь своим способом сделать это с Ubuntu Eoan (необязательно: Yocto Warrior) в 2020 году здесь:

Протестировано с:

  • Отладка Intel P C на основе linux от Intel MacBook под управлением MacOS Catalina. Использование gdb из пакета Homebrew «i386-elf-gdb». (Без опции «-tui» в GDB)
  • Отладка цели ARM на основе linux (i.mx6, Yocto) из linux на базе Intel P C.

Пререквизиты:

Вам нужны два компьютера и последовательный нуль-модемный кабель. Проверьте кабель, выдав последовательный термин (например, экран или замазку) на обоих хостах подключение к вашему последовательному порту (например, / dev / ttyS0 или / dev / ttyUSB0) и печать символов с каждой станции на другую. Запомните подтвержденные порты / dev / tty.

Подготовка:

Вам нужно на первом компьютере-отладчике, мы называем его «target»:

  • Установлено специальное ядро, содержащее символы, поддержка kgdb и т. Д. c.
  • Узнайте, как скомпилировать и установить ядро ​​и использовать его в конфигурации make menuconfig ниже. Вы можете искать Sybmbols с помощью клавиши F8 или клавиши / в menuconfig. (Например, wiki.ubuntu.com . В первом абзаце позаботьтесь о том, чтобы выполнить deb-sr c перед apt-get:)

    # CONFIG_SERIAL_KGDB_NMI не установлено

    CONFIG_CONSOLE_POLL = y

    # CONFIG_DEBUG_INFO не задано

    CONFIG_KGDB = y

    CONFIG_KGDB_SERIAL_CONSOLE = y

    ДБ

    КОНФ. * # CONFIG_KGDB_KDB не задано

    CONFIG_FRAME_POINTER = y

    CONFIG_DEBUG_INFO = y

    # CONFIG_DEBUG_INFO_REDUCED не задано

    * 1048_49_ CONFIG * CONFIG * CONFIG * CONFIG * CONFIG не установлен 1050 * CONFIG_DEBUG_INFO_DWARF4 = y

    CONFIG_GDB_SCRIPTS = y

    CONFIG_STRIP_ASM_SYMS = y

    # CONFIG_RANDOMIZE_BASE не установлено * 10 * * * * * * * * * * * * * * * * * Примечание для расширенного использования в Yocto, пропустите, если вы отлаживаете P C: в yocto я создал на своем слое файл: recipes-kernel / linux / linux -mainline _%. Bbappend с содержимым: FILESEXTRAPATHS_prepend: = " $ {THISDIR} / files: "SRC_URI + =" file: //kgdb.cfg «И в files / kgdb.cfg Я добавил фрагмент конфигурации, показанный выше (без недоступных параметров ARM CONFIG_RANDOMIZE_BASE и CONFIG_FRAME_POINTER))

    Вам нужен второй компьютер отладчика, мы называем его «отладчик p c» ":

    • Полный исходный код ядра, тот же код, который вы использовали для компиляции ядра выше. (Если вы скомпилировали объекты .o и .ko на месте, а не в папке сборки, вам лучше не копировать каталог из другого p c, где вы вызвали make et c. In, но тогда лучше захватить fre sh исходники снова.)
    • vm linux файл, содержащий символы (находится в исходном тексте ядра root или в папке сборки самого высокого уровня после создания ядра).
    • vm linux -gdb.py файл, созданный во время сборки ядра (также находится на той же позиции на самом высоком уровне.).
    • Все скрипты в папке scripts / gdb (Скрипты папки на одном и том же верхнем уровне -позиция. Если вы используете выделенную папку сборки, используйте папку сценария оттуда, а не из исходной папки.)
    • (Дополнительно: если оба компьютера не совпадают по процессору, как Intel и Arm, крестик -gdb build. Игнорировать, если вы используете Intel / AMD.)

    Примечание для расширенного использования Yocto, я сделал что-то вроде (игнорировать, если вы отлаживаете P C):

     bitbake -c patch virtual/kernel     #(apply the changed kernel config from above)
     bitbake -f -c compile virtual/kernel   #(unpack is not sufficient because of vmlinux-gdb.py)
     mkdir ~/gdbenv
     cp -a tmp/work-shared/phyboard-mira-imx6-14/kernel-source/. ~/gdbenv
     cp tmp/work/phyboard_mira_imx6_14-phytec-linux-gnueabi/linux-mainline/4.19.100-phy1-r0.0/build/vmlinux ~/gdbenv
     cp tmp/work/phyboard_mira_imx6_14-phytec-linux-gnueabi/linux-mainline/4.19.100-phy1-r0.0/build/vmlinux-gdb.py ~/gdbenv
     mkdir ~/gdbenv/scripts
     cp -r tmp/work/phyboard_mira_imx6_14-phytec-linux-gnueabi/linux-mainline/4.19.100-phy1-r0.0/build/scripts/gdb ~/gdbenv/scripts
    

    Затем (игнорируйте, если вы используете йо-бит P C) bake - c populate_sdk [my-image]

    Затем (все еще игнорировать на P C) установите файл sdk. sh -installation из каталога развертывания в отладчике p c и запустите окружение в соответствии с выводом сценария установки (запомните эту команду), затем используйте «$ GDB» для запуска cross-gdb вместо «gdb».

    Выполнение отладки

    Запустите на отладчике два экрана консоли:

    Консоль 1, s sh: +++++++++++ ++++++++++++++++++++++++++++

     ssh user@192.168.x.y
     sudo -s
     echo ttyS0,9600n8 > /sys/module/kgdboc/parameters/kgdboc
     echo 1 > /proc/sys/kernel/sysrq
     echo g > /proc/sysrq-trigger
    

    Консоль 2, локальная: ++++++++ ++++++++++++++++++++++++++++++++

     cd ~/gdbenv
     gdb -tui ./vmlinux
    
     add-auto-load-safe-path ~/gdbenv
     source ~/gdbenv/vmlinux-gdb.py
     set serial baud 9600
     target remote /dev/ttyS0                        (use the tty port you confirmed in the beginning)
     b [name of the c funtion you want to debug]
     cont
    

    Вернуться к консоли 1, s sh : +++++++++++++++++++++++++++++++++++++++

     [Now trigger the function, e.g. sudo modprobe yourFancyKernelModule]
    

    Назад на консоль 2, локально: ++++++++++++++++++++++++++++++++++++++++

    Теперь используйте функции GDB, такие как bt, step, next, fini sh ...

    Вы также можете использовать linux -ware-команды. Вызовите "apropos lx" в gdb для получения списка команд.

...