GDB + CLion + STM32 - не будет отлаживать удаленно
Я читаю команды GDB Monitor в CLion, обеспечивая хорошее понимание, но у меня немного другая проблема:
Моя среда:
- Цель: ARM Cortex M4 (STM32F401RE)
- ST-UTIL GDB-сервер ( https://github.com/texane/stlink)
- arm-none-eabi-gdb 7.7.1 + dfsg-5 + 8 ~ bpo8 + 1
- CLion 2016.3.2 Build # CL-163.10154.43
- Debian 8
На панели конфигурации удаленной отладки GDB я установил:
GDB: /usr/bin/arm-none-eabi-gdb
Symbol file: /home/malachi/temp/mbed_test/mbed-os-program/BUILD/NUCLEO_F401RE/GCC_ARM/mbed-os-program.elf
От CLion, что бы я ни делал, я всегда получаю это для консоли:
Cannot configure GDB defaults: No symbol table is loaded. Use the "file" command.
Debugger connected to localhost:4242
Я пытался перебор файла с помощью.gdbinit, но gdbinit кажется проигнорированным
Кроме того, это указывает на подключение к st-util, работающему удаленно, но я не могу выполнить какие-либо команды (точки останова, пошаговое выполнение, пауза и т. Д.), Кроме завершения, которое, похоже, завершает его.
Если я использую arm-none-eabi-gdb прямо из командной строки (/usr/bin/arm-none-eabi-gdb
проверено), все работает как обычно, точки останова, пошаговое выполнение и т. д. Кроме того, символы.elf загружаются правильно непосредственно из командной строки.
Наконец, если я использую конфигурацию GDB: Default (Bundled)
Я не ожидаю, что он будет работать хорошо, но на самом деле он идет дальше и позволяет очень ограниченную функциональность приостановки / возобновления (но абсолютно без других способностей) и не жалуется на символы
2 ответа
Обновление до CLion 2016.3.3 решает эту проблему.
У меня возникают некоторые проблемы с замедлением / подключением, но я не уверен, что это CLion.
Спасибо Сэм Проценко и Эльдар Абусалимов за помощь в этом.
У меня есть аналогичная настройка (кроме CLion), и я могу отлаживать свою плату STM32 через STM32F4DISCOVERY (на котором установлен ST-LINK v2). Возможно, если вы будете следовать моим инструкциям, это сработает и для вас.
Прежде всего, предоставьте GCC следующие флаги при сборке вашей прошивки:
# Debug flags
CFLAGS += -Os -g -fno-schedule-insns -fno-schedule-insns2
# Backtrace support
CFLAGS += -fno-omit-frame-pointer -funwind-tables
CFLAGS += -mapcs -mno-sched-prolog
LDFLAGS += -mapcs -mno-sched-prolog
Используйте следующий скрипт для запуска GDB-сервера. Конечно, st-util должен быть установлен, так как этот скрипт использует его.
#!/bin/sh
CROSS_COMPILE=arm-none-eabi-
GDB=${CROSS_COMPILE}gdb
if [ $# -ne 1 ]; then
echo "Please provide elf-file for debug symbols" >&2
exit 1
fi
elf_file="$1"
echo '---> Starting GDB server...'
if [ -f gdb.pid ]; then
kill -9 $(cat gdb.pid)
rm -f gdb.pid
fi
st-util & echo $! >gdb.pid
echo '---> Starting GDB...'
$GDB -ex "target extended localhost:4242" $elf_file
kill -9 $(cat gdb.pid)
rm -f gdb.pid
Сохранить как gdb.sh
и запустите его так (как только вы включите питание своей платы):
$ ./gdb.sh your-firmware.elf
Вот увидишь (gdb)
незамедлительный. Теперь вы можете использовать обычные команды GDB для отладки. В моем случае GDB показывает мне (при запуске):
GDB connected.
reset_handler () at ../../cm3/vector.c:68
68 for (src = &_data_loadaddr, dest = &_data;
Так что я обычно делаю:
(gdb) break main
(gdb) continue
(gdb) list
А затем используйте обычные команды отладки, такие как step
, next
, print var
, bt
и т. д. Все работает как положено.
Также следует отметить, что я использую libopencm3 в своей прошивке, так что это также может оказать некоторое влияние на успешность работы. Я бы посоветовал вам собрать и прошить простой пример из libopencm3-examples (например, этот) и попробовать отладить его с помощью GDB. Если это работает, и ваш код не работает с GDB, тогда вы можете легко найти разницу и найти проблему.
Рекомендации
[1] Детали отладки