是否可以指示GDB从目标异步获取变量值?

是否可以指示GDB从目标异步获取变量值?,gdb,Gdb,我通过将“打印变量值,然后继续”代码分配给断点,实现了printf()功能: break main.c:18 commands print myVar cont end 到目前为止,这一切都很顺利。然而,在AFAIU中,它需要与目标(在我的例子中是微控制器)进行多次通信: 微控制器在遇到断点时发送信号 GDB立即询问myVar MCU发送myVar值 GDB指示MCU继续 这些步骤会导致明显的抖动,因此MCU上的应用程序的行为非常奇怪 是否有机会告诉GDB一次性完成上述步骤,比如:“告诉我my

我通过将“打印变量值,然后继续”代码分配给断点,实现了
printf()
功能:

break main.c:18
commands
print myVar
cont
end
到目前为止,这一切都很顺利。然而,在AFAIU中,它需要与目标(在我的例子中是微控制器)进行多次通信:

  • 微控制器在遇到断点时发送信号
  • GDB立即询问
    myVar
  • MCU发送
    myVar
  • GDB指示MCU继续
  • 这些步骤会导致明显的抖动,因此MCU上的应用程序的行为非常奇怪

    是否有机会告诉GDB一次性完成上述步骤,比如:“告诉我
    myVar
    值,然后在不等待任何进一步说明的情况下继续。”

    AFAIU需要与目标进行多次通信

    实际上,GDB和目标之间交换的数据包要多得多(GDB远程协议非常健谈)。您可以通过
    将调试远程设置为开启状态查看它们

    您需要的是:

    更新:

    当我发出
    tstart
    时,GDB发出
    错误:目标不支持此命令。

    显然,您在MCU上使用的不是
    gdbserver
    (您没有告诉我们GDB的远程端有什么),并且您的远程端不支持跟踪

    这可能是
    gdbserver
    太旧的一个实例,也可能是远程调试存根没有实现协议的这一部分


    如果是前者,您可以将
    gdbserver
    更新为新版本。如果是后者,您就无能为力(除了自己实现跟踪支持)。

    您可能还想查看该命令,作为break+命令的替代方法。@ssbssa
    dprintf
    函数似乎是我通过组合
    break+命令+printf+cont+end
    手动实现的。它会导致所提到的抖动,并且无法判断抖动差异的大小(看起来是一样的)。我没有找到完整的示例,但下面是我所做的:
    trace
    actions
    collect myVar
    end
    。当我发出
    tstart
    时,GDB给出错误:
    目标不支持此命令。
    我正在使用,它的GDB服务器实现(st-util)没有跟踪支持也不会让我感到惊讶。我将检查OpenOCD以获得支持。如果没有成功,我将在我的电脑上测试一个简单的C应用程序,以验证并接受你的答案。
    > 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.