Я запускаю gdb
с файлом .gdbinit
, в котором есть несколько удобных переменных, которые просто не расширяются.
1. Моя установка
Я написал следующий файл .gdbinit
для прошивки исполняемого файла на микроконтроллер через зонд blackmagic (см. https://github.com/blacksphere/blackmagic/wiki):
# .gdbinit file:
# ------------------------------------------- #
# GDB commands #
# FOR STM32F767ZI #
# ------------------------------------------- #
target extended-remote $com
monitor version
monitor swdp_scan
attach 1
file mcu_application.elf
load
start
detach
quit
Зонд Blackmagic подключается к COM-порту, который на одном компьютере может отличаться от другого. Поэтому я не хочу жестко кодировать это в файле .gdbinit
. Вспомогательная переменная GDB выглядела как самое элегантное решение:
https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_59.html
Поэтому я использую вспомогательную переменную $com
в файле .gdbinit
и определяю ее в командной строке при вызове GDB:
arm-none-eabi-gdb -x .gdbinit -ex "set $com = \"COM9\""
2. Ошибка
GDB запускается, но выдает сообщение об ошибке:
.gdbinit:6: Error in sourced command file:
$com: No such file or directory.
Похоже, что GDB не распознает вспомогательную переменную $com
. Поэтому я проверяю, действительно ли GDB сохранил переменную:
(gdb) show convenience
$com = "COM9"
$trace_file = void
$trace_func = void
$trace_line = -1
$tracepoint = -1
$trace_frame = -1
$_inferior = 1
...
Это доказывает, что GDB правильно сохранил его как "COM9"
. Таким образом, проблема заключается в неспособности его расширить.
3. Еще несколько испытаний
Когда я заметил, что не удалось расширить $com
при выполнении .gdbinit
, я подумал, что может сработать запуск команд непосредственно в GDB:
(gdb) set $com = "COM9"
(gdb) show convenience
$com = "COM9"
$trace_file = void
$trace_func = void
...
(gdb) target extended-remote $com
$com: No such file or directory.
Но ошибка сохраняется.
4. Вопросы
Знаете ли вы, как заставить работать удобные переменные в GDB? Или вы знаете другой механизм для достижения той же цели?
5. Решение
Спасибо @Mark Plotnick за ваш ответ! Как вы и предложили, я дал своему файлу .gdbinit
следующее содержимое:
define flash-remote
target extended-remote $arg0
monitor version
monitor swdp_scan
attach 1
file mcu_application.elf
load
start
detach
quit
end
Однако мне пришлось убрать кавычки вокруг аргумента COM9
при вызове GDB. Итак, вместо:
arm-none-eabi-gdb -x .gdbinit -ex "flash-remote \"COM9\""
Я вызываю GDB следующим образом:
arm-none-eabi-gdb -x .gdbinit -ex "flash-remote COM9"
Теперь это работает! Вы спасли мой день!