Можно ли поручить GDB асинхронно получать значение переменной от цели?

#gdb

#gdb

Вопрос:

Я добился printf() функциональности, установив точку останова, присвоив ей код «распечатать значение переменной, а затем продолжить»:

 break main.c:18
commands
print myVar
cont
end
  

До сих пор это работало нормально. Однако, AFAIU, для этого требуется много сообщений с целью (микроконтроллер в моем случае):

  1. Микроконтроллер отправляет сигнал при достижении точки останова
  2. GDB немедленно запрашивает значение myVar
  3. MCU отправляет myVar значение
  4. 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 на своем ПК, чтобы проверить и принять ваш ответ.