Куда идет 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/ и нашел его очень полезным. Я с радостью отвечу на вопросы по этому поводу.

Другие вопросы по тегам