Отладка встроенного ПО (coredump)

В настоящее время я работаю над встроенным процессором (ARM cortex-M0) на борту. У меня возникают сбои (HardFault), поэтому я пытаюсь их отладить.

В настоящее время я могу получить дамп памяти (я отправляю все в шестнадцатеричном формате через консоль printf, мой единственный доступ к памяти).

Моя идея состоит в том, чтобы загрузить этот дамп как coredump в gdb и, таким образом, иметь возможность отлаживать программу. Как можно создать «настоящий» файл дампа памяти из необработанного дампа памяти, чтобы я мог передать его непосредственно в gdb?

Я также пытался запустить свою программу в симуляторе gdb, чтобы использовать команду restore с моей необработанной памятью, но я не понимаю, как ее запустить. У вас есть идея?

Главный вопрос здесь на самом деле: как создать файл дампа памяти, совместимый с gdb, на основе программы elf и необработанного содержимого памяти?


person Gp2mv3    schedule 09.11.2016    source источник
comment
Есть ли причина, по которой вы не можете использовать встроенный отладчик?   -  person Lundin    schedule 09.11.2016
comment
Я сомневаюсь, что дампа памяти достаточно; состояние регистра также было бы необходимо. Об этом есть ветка от 1999 года по адресу sourceware.org/ml/gdb. /1999-q2/msg00065.html . К тому времени, когда вы получите серьезную ошибку, вы многого требуете от printf, чтобы во многих случаях все еще работало, особенно если оно буферизовано и управляется прерываниями. Аппаратный отладчик был бы гораздо эффективнее в этой ситуации.   -  person Clifford    schedule 09.11.2016
comment
@Lundin Отладчик Cortex M0 очень дорогой и отсутствует на плате. Клиффорд: Да, у меня тоже есть регистры, а printfs на самом деле не printfs, а просто запись в аппаратный FIFO.   -  person Gp2mv3    schedule 09.11.2016
comment
@ Gp2mv3 Gp2mv3 Не уверен, что ты имеешь в виду под очень дорого, 100 долларов? Для Cortex M0 есть много дешевых отладчиков. На плате не должно быть ничего, кроме разъема SWD.   -  person Lundin    schedule 09.11.2016
comment
@Lundin Это немного сложнее. Я работаю над микросхемой безопасности, которая не имеет возможности отладки по очевидным причинам безопасности. Таким образом, аппаратный отладчик не является опцией, и его очень дорого добавить к дизайну HDL.   -  person Gp2mv3    schedule 09.11.2016
comment
Обычной практикой для таких проектов является наличие отладочной версии оборудования. По крайней мере, это то, что я делал, когда работал с проектами, включающими защитные замки от обратного проектирования. Даже что-то такое простое, как eval board + ICD + разное спаянное вручную барахло, будет лучше, чем отладка через printf. Тем более, что stdio.h не используется в производственном коде.   -  person Lundin    schedule 09.11.2016
comment
Отладчик cortex-m0 стоит около 10 долларов плюс доставка, программное обеспечение бесплатное, не знаю, насколько это дорого.   -  person old_timer    schedule 09.11.2016
comment
Ваша настоящая проблема заключается в том, как мне отладить этот аппаратный сбой, а не в том, как использовать дамп памяти. И ответ — просто используйте или разработайте обычные методы отладки. Даже с помощью отладчика вы можете не найти проблему, отладчики изменяют способ работы программы, и это может быть связано с проблемой. Таким образом, вы должны пройти через обычный цикл проверки вашего кода, изучения документации, разделения проблемы пополам и продолжайте делить, пока не найдете ее. Дамп памяти может помочь только с некоторыми классами проблем.   -  person old_timer    schedule 09.11.2016
comment
Начните с использования вашей шестнадцатеричной функции печати в обработчике жестких ошибок (в любом случае вы мертвы, нет смысла беспокоиться о том, что вы можете и не можете делать в обработчике), чтобы сбросить стек и выяснить, какая инструкция (адрес) вызвала ошибку, используйте дизассемблирование вашей программы, чтобы работать в обратном направлении, используйте шестнадцатеричный printf в этом кодовом пространстве, чтобы распечатать значения данных/адреса, чтобы подтвердить, что они являются тем, что вы думаете, что они ведут к рассматриваемой инструкции.   -  person old_timer    schedule 09.11.2016
comment
@ Gp2mv3: отладчик предоставляется бесплатно, если вы используете современный и бесплатный набор инструментов. Как вы уже упоминали, почему бы не использовать gdb на цели? И на мишени нет отладчика cortex-M0. Просто встроенное отладочное IP-ядро. Какое устройство не обеспечивает это? Соображения безопасности не препятствуют средствам отладки. Как правило, их можно деактивировать навсегда, например. путем сжигания предохранителей.   -  person too honest for this site    schedule 09.11.2016
comment
Отладочное IP-ядро отсутствует, и это дорогая часть. Я пытаюсь сделать именно то, что говорит @dwelch, но я подумал, что, например, с GDB есть лучшее решение. Без изменения HDL или добавления дополнительного оборудования.   -  person Gp2mv3    schedule 10.11.2016
comment
запутался, так что вы используете rtl? затем просто запустите его в симуляторе и посмотрите на осциллограммы.   -  person old_timer    schedule 11.11.2016
comment
Нет, я бегу на борт.   -  person Gp2mv3    schedule 11.11.2016


Ответы (1)


Для этого есть пара библиотек: CrashCatcher и CrashDebug. Сначала печатается дамп (который вы уже делаете, но он печатается в определенном формате), а второй подключается к gdb, чтобы разрешить загрузку дампа. По какой-то причине CrashDebug не создает основной файл, а взаимодействует с gdb с помощью команды gdb target remote. Хотя тот же эффект. Он поддерживает Cortex-M0, M3 и M4.

person Dan Stahlke    schedule 26.03.2018