#gdb
#gdb
Вопрос:
Я добился printf()
функциональности, установив точку останова, присвоив ей код «распечатать значение переменной, а затем продолжить»:
break main.c:18
commands
print myVar
cont
end
До сих пор это работало нормально. Однако, AFAIU, для этого требуется много сообщений с целью (микроконтроллер в моем случае):
- Микроконтроллер отправляет сигнал при достижении точки останова
- GDB немедленно запрашивает значение
myVar
- MCU отправляет
myVar
значение - GDB инструктирует MCU продолжить
Эти шаги вызывают значительное дрожание, поэтому приложение на MCU ведет себя очень странно.
Есть ли какой-либо шанс сказать GDB выполнить вышеуказанные шаги за один раз, например: «Сообщите мне myVar
значение, а затем продолжайте, не дожидаясь дальнейших инструкций».?
Комментарии:
1. Вы также можете проверить команду dprintf в качестве альтернативы командам break .
2.
dprintf
Функция @ssbssa похожа на то, чего я добился вручную путем объединенияbreak commands printf cont end
. Это вызывает упомянутое дрожание, и нет способа определить величину разницы в дрожании (это выглядит так же).
Ответ №1:
AFAIU, для этого требуется много сообщений с целью
На самом деле между GDB и целью обменивается гораздо больше пакетов (удаленный протокол GDB очень разговорчивый). Вы можете увидеть их с set debug remote on
помощью .
То, что вы ищете, — это трассировка:
> For each tracepoint, you can specify, in advance, some arbitrary set
> of data that you want the target to collect in the trace buffer when
> it hits that tracepoint. The collected data can include registers,
> local variables, or global data. Later, you can use GDB commands to
> examine the values these data had at the time the tracepoint was hit.
Обновить:
Когда я выдаю
tstart
, GDB выдаетerror: Target does not support this command.
По-видимому, вы используете что-то другое, кроме gdbserver
MCU (вы не сказали нам, что находится на удаленном конце GDB), и ваш удаленный конец не поддерживает трассировку.
Это может gdbserver
быть слишком старым примером, или может быть, что заглушка удаленной отладки не реализует эту часть протокола.
Если это первое, вы можете обновить gdbserver
его до более новой версии. Если это последнее, вы мало что можете сделать (кроме самостоятельной реализации поддержки трассировки).
Комментарии:
1. Я не нашел полного примера, но вот что я сделал, используя этот документ :
trace
,actions
,collect myVar
,end
. Когда я выдаюtstart
, GDB выдает ошибку:Target does not support this command.
2. Я использую github.com/stlink-org/stlink и меня не удивит, что его реализация сервера gdb (st-util) не имеет поддержки трассировки. Я проверю OpenOCD на наличие этой поддержки. Если ничего не работает, я протестирую простое приложение C на своем ПК, чтобы проверить и принять ваш ответ.