是否可以指示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中,它需要与目标(在我的例子中是微控制器)进行多次通信:
myVar
myVar
值myVar
值,然后在不等待任何进一步说明的情况下继续。”
AFAIU需要与目标进行多次通信
实际上,GDB和目标之间交换的数据包要多得多(GDB远程协议非常健谈)。您可以通过将调试远程设置为开启状态查看它们
您需要的是:
更新:
当我发出tstart
时,GDB发出错误:目标不支持此命令。
显然,您在MCU上使用的不是gdbserver
(您没有告诉我们GDB的远程端有什么),并且您的远程端不支持跟踪
这可能是gdbserver
太旧的一个实例,也可能是远程调试存根没有实现协议的这一部分
如果是前者,您可以将gdbserver
更新为新版本。如果是后者,您就无能为力(除了自己实现跟踪支持)。您可能还想查看该命令,作为break+命令的替代方法。@ssbssadprintf
函数似乎是我通过组合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.