Куда идет STDOUT с GDB, OopenOCD и полухостингом?
Пытаюсь разобраться в полухостоне на ARM (STM32042). Я вижуprintf
вывод, если я бегу openocd
прямо из командной строки и подключиться к ней из gdb
по TCP. Но если я запустилopenocd
изнутри gdb
, вывод идет в какой-то большой /dev/null в небе.
Если я запустил openocd
я с
$ openocd -f interface/stlink-v2-1.cfg -f target/stm32f0x.cfg
и подключиться к нему из gdb
вот так
(gdb) target remote localhost:3333
понятно printf
вывод в opeocd
Терминал. Но если я запустилopenocd
изнутри gdb
как подсказывает эта ссылка,
(gdb) target remote | openocd -f interface/stlink-v2-1.cfg -f target/stm32f0x.cfg -c "gdb_port pipe"
Я вижу все openocd
сообщения отладки (например, xPSR: 0xc1000000 pc: 0x08001648 msp: 0x20001800, semihosting
), но не мой printf
с.
1 ответ
Получилось немного сложнее, чем я хотел. Судя по всему, невозможно запустить GDB и OpenOCD в конвейере; им нужна двунаправленная связь через сокет. Поскольку для этого требуется два отдельных вызова команд и поскольку конфигурация для GDB является более чем однострочным, я поместил это в небольшой собственный репозиторий:
https://github.com/arikrupnik/semihosting-ut
В репо есть код, который направляет stdout на консоль, но он делает больше. Я широко использовал его для модульных тестов на ARM для http://www.dish.tc/ и нашел его очень полезным. Я с радостью отвечу на вопросы по этому поводу.