Отладка ядра Linux на ARM с использованием KGDBoC не работаетLinux

Ответить
Anonymous
 Отладка ядра Linux на ARM с использованием KGDBoC не работает

Сообщение Anonymous »

Я пытаюсь выполнить перекрестную отладку ядра Linux на целевом компьютере ARM и хосте x86_64. Для сборки образа Linux я использую PetaLinux, который внутри использует Yocto Linux. Я включил отладочную информацию и кгдб для ядра. Моя установка работает «немного». Я могу устанавливать точки останова и выполнять код, но в какой-то момент плата перестает отвечать и не может ни продолжить, ни прервать выполнение.
Я включил следующие конфигурации для ядра Linux:

Код: Выделить всё

CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_INFO=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_KGDB=y
CONFIG_FRAME_POINTER=y
Сначала я регистрирую модульkgdboc:

Код: Выделить всё

echo ttyPS0 > /sys/module/kgdboc/parameters/kgdboc
Затем я активирую точку останова:

Код: Выделить всё

echo g > /proc/sysrq-trigger
Теперь я закрываю minicom и подключаюсь к GDB, используя перекрестный GDB, используемый PetaLinux (aarch64-linux-gnu-gdb):

Код: Выделить всё

$ aarch64-linux-gnu-gdb vmlinux
(gdb)set serial baud 115200
(gdb)set debug remote 1
(gdb)set architecture armv7
(gdb)set substitute-path /usr/src/debug/linux-xlnx/6.1.30-xilinx-v2023.2+git999-r0 /home/test/repos/linux-xlnx
(gdb)target remote /dev/ttyACM0
Я могу продолжить, устанавливать точки останова и выполнять код.
Я тестировал отладку, устанавливая точки останова в коде ядра, который я может запускаться из командной строки. В частности, я установил точку останова на meminfo_proc_show, которую можно запустить, выполнив cat /proc/meminfo из цели. Я могу выполнять код до тех пор, пока не будет выполнена следующая инструкция:

Код: Выделить всё

│   0xc02ae480        bl      0xc082ca80 
Ссылка на ветку memset. Memset для ARM определен в ядре Linux в сборке. Используя objdump в vmlinux, я могу подтвердить, что memset присутствует в двоичном файле ядра. Кроме того, нормальное выполнение функции не останавливает процессор. Когда я устанавливаю точку останова сразу после инструкции bl memset и продолжаю, выполнение останавливается на точке останова сразу после инструкции bl memset. Проблема возникает только тогда, когда я выполняю команду bl memset. Я включаю установку удаленного отладки 1, чтобы иметь более подробный журнал. Это журнал после выполнения bl memset:

Код: Выделить всё

(gdb) si
Sending packet: $Z0,c02ae43c,4#6b...Ack
Packet received: OK
Sending packet: $Z0,c02ae474,4#40...Ack
Packet received: OK
Sending packet: $Z0,c02ae484,4#41...Ack
Packet received: OK
Sending packet: $mc02ae470,4#f3...Ack
Packet received: 82f915eb
Sending packet: $mc02ae470,4#f3...Ack
Packet received: 82f915eb
Sending packet: $mc082ca80,4#f6...Ack
Packet received: 033010e2
Sending packet: $mc02ae470,4#f3...Ack
Packet received: 82f915eb
Sending packet: $mc02ae470,4#f3...Ack
Packet received: 82f915eb
Sending packet: $mc02ae470,4#f3...Ack
Packet received: 82f915eb
Sending packet: $Z0,c082ca80,4#3f...Ack
Packet received: OK
Sending packet: $c#63...Ack

Устанавливаются некоторые точки останова, и выполнение продолжается, но выполнение никогда не останавливается. Отсюда плата не отвечает и не может прервать/продолжить работу платы из GDB. Через некоторое время плата сообщает, что процессор остановлен.
Я пробовал разные версии GDB (включая последнюю), разные комбинации записей конфигурации Kconfig, отладочную информацию хранил в отдельных файлах. , KGDB через Ethernet.
Но как только я обнаруживаю bl memset, плата перестает отвечать. Я заметил, что другие инструкции ветвления и ссылки вызывают такое же поведение (только те, которые переходят в удаленное место). Другие инструкции ветвления работают нормально.
Когда я искал альтернативы, я обнаружил, что отладка через QEMU и встроенный в него GDB работает безупречно, но мне хотелось бы отладить реальное оборудование.
Может ли кто-нибудь мне помочь? Неправильная настройка КГДБ? Я понятия не имею, как продолжить дальше.

Подробнее здесь: https://stackoverflow.com/questions/786 ... ot-working
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»