Debugging GDB便利变量不在.gdbinit中展开

Debugging GDB便利变量不在.gdbinit中展开,debugging,gdb,arm-none-eabi-gcc,Debugging,Gdb,Arm None Eabi Gcc,我用一个.gdbinit文件运行gdb,它有一些不会扩展的方便变量 1.我的设置 我编写了以下.gdbinit文件,通过blackmagic probe将可执行文件闪存到微控制器,请参见: blackmagic探测器将自身连接到一个COM端口,该端口在一台计算机上与另一台计算机上可能不同。因此,我不想在.gdbinit文件中硬编码它。GDB便利变量看起来是最优雅的解决方案: 因此,我在.gdbinit文件中使用便利变量$com,并在调用GDB时在命令行上定义它: arm none eabi gd

我用一个.gdbinit文件运行gdb,它有一些不会扩展的方便变量

1.我的设置 我编写了以下.gdbinit文件,通过blackmagic probe将可执行文件闪存到微控制器,请参见:

blackmagic探测器将自身连接到一个COM端口,该端口在一台计算机上与另一台计算机上可能不同。因此,我不想在.gdbinit文件中硬编码它。GDB便利变量看起来是最优雅的解决方案:

因此,我在.gdbinit文件中使用便利变量$com,并在调用GDB时在命令行上定义它:

arm none eabi gdb-x.gdbinit-ex set$com=\COM9\ 2.错误 GDB启动但抛出错误消息:

.gdbinit:6:源命令文件中出现错误: $com:没有这样的文件或目录。 GDB似乎无法识别$com便利变量。因此,我检查GDB是否实际存储了变量:

显示方便 $com=COM9 $trace_file=void $trace_func=void $trace_line=-1 $tracepoint=-1 $trace_frame=-1 $\u=1 ... 这证明GDB正确地将其存储为COM9。因此,问题在于未能将其扩大

3.更多的试验 当我观察到在执行.gdbinit时扩展$com失败时,我认为直接在GDB中发出命令可能有效:

gdb设置$com=COM9 显示方便 $com=COM9 $trace_file=void $trace_func=void ... gdb目标扩展远程$com $com:没有这样的文件或目录。 但错误依然存在

4.问题 你知道一种让GDB中的便利变量工作的方法吗?或者你知道实现同样目标的另一种机制吗

5.解决方案 谢谢@Mark Plotnick的回答!正如您所建议的,我为我的.gdbinit文件提供了以下内容:

define flash-remote
  target extended-remote $arg0
  monitor version
  monitor swdp_scan
  attach 1
  file mcu_application.elf
  load
  start
  detach
  quit
end
然而,在调用GDB时,我不得不删除参数COM9周围的引号。因此,不是:

arm none eabi gdb-x.gdbinit-ex flash remote\COM9\ 我这样调用GDB:

arm none eabi gdb-x.gdbinit-ex闪存远程通信COM9 现在它工作了!你救了我一天

GDB清楚地记录了在任何-ex命令之前对.gdbinit求值的情况

您可以编写一个简单的shell包装器,创建一个临时的/tmp/.gdbinit.$unique_后缀并进行适当的替换,调用gdb-x/tmp/.gdbinit…,并在gdb退出后删除临时文件。

gdb清楚地记录了在任何-ex命令之前对.gdbinit求值的情况


您可以编写一个简单的shell包装器,创建一个临时的/tmp/.gdbinit。$unique_后缀,并使用适当的替换,调用gdb-x/tmp/.gdbinit…,并在gdb退出后删除临时文件。

在Windows上选择COM端口的格式为///COM9,因此您在gdb中的测试应该使用:

$com = COM9
target extended-remote //.$com

我没有测试过这个,但是我希望它能工作。

在Windows上选择COM端口的格式是///COM9,因此您在GDB中的测试应该使用:

$com = COM9
target extended-remote //.$com

我还没有测试过这个,但是我希望它能工作。

便利变量只在某些上下文中扩展,主要是表达式,例如print、x、eval、set和if的参数

您可以使用eval执行您想要的操作:

eval "target extended-remote %s", $com
但是——这是一个很大的问题——直到最近,当计算表达式时,gdb会将字符串值存储在目标的地址空间中,这需要一个运行的进程。因此,在较旧的GDB上,您可能会收到错误消息,该表达式的计算要求目标程序处于活动状态

Gdb确实有一个更通用的宏工具:

一种可能是将其放入.gdbinit中:

define flash-remote
  target extended-remote $arg0
  monitor version
  monitor swdp_scan
  attach 1
  file mcu_application.elf
  load
  start
  detach
  quit
end
然后像这样调用gdb:

arm-none-eabi-gdb -ex "flash-remote \"COM9\""

便利性变量仅在某些上下文中展开(主要是表达式),例如print、x、eval、set和if的参数

您可以使用eval执行您想要的操作:

eval "target extended-remote %s", $com
但是——这是一个很大的问题——直到最近,当计算表达式时,gdb会将字符串值存储在目标的地址空间中,这需要一个运行的进程。因此,在较旧的GDB上,您可能会收到错误消息,该表达式的计算要求目标程序处于活动状态

Gdb确实有一个更通用的宏工具:

一种可能是将其放入.gdbinit中:

define flash-remote
  target extended-remote $arg0
  monitor version
  monitor swdp_scan
  attach 1
  file mcu_application.elf
  load
  start
  detach
  quit
end
然后像这样调用gdb:

arm-none-eabi-gdb -ex "flash-remote \"COM9\""

您好@EmployeedRussian,谢谢您的回复。不幸的是,这不起作用。即使我根本不使用.gdbinit文件,只是在gdb中手动键入命令,$com变量也不会展开,请参见我问题的第3段。您好@EmployedRussian,谢谢您的帮助。你的建议肯定行得通。然而,我正在寻找的解决方案应该非常适合我们新的微控制器IDE,我正在启动Embeetle,为微控制器构建一个新的IDE。因此,对于想要自己编辑.gdbinit文件的用户来说,解决方案必须是显而易见的。我们致力于开发一个不会在幕后隐藏任何内容,但只使用行业标准配置文件的IDE,请参见.Hi@Emp
loyedRussian,谢谢你的回复。不幸的是,这不起作用。即使我根本不使用.gdbinit文件,只是在gdb中手动键入命令,$com变量也不会展开,请参见我问题的第3段。您好@EmployedRussian,谢谢您的帮助。你的建议肯定行得通。然而,我正在寻找的解决方案应该非常适合我们新的微控制器IDE,我正在启动Embeetle,为微控制器构建一个新的IDE。因此,对于想要自己编辑.gdbinit文件的用户来说,解决方案必须是显而易见的。我们致力于开发一个不会在幕后隐藏任何内容,但只使用行业标准配置文件的IDE,请参见.Hi@Sid,感谢您的帮助。不幸的是,它不起作用。嗨@Sid,谢谢你的帮助。不幸的是,它不起作用。谢谢你@Mark Plotnick。它工作得很好!我将悬赏这个问题,并奖励给你,以表达我对你的帮助的感谢。你救了我一天,实际上也救了我整个星期。嗨,马克·普洛尼克。我刚刚将赏金+100奖励给你以表示我的感激:——@K.Mulier谢谢你。谢谢你@Mark Plotnick。它工作得很好!我将悬赏这个问题,并奖励给你,以表达我对你的帮助的感谢。你救了我一天,实际上也救了我整个星期。嗨,马克·普洛尼克。我刚刚将赏金+100奖励给你,以表示我的感谢:-@K.Mulier谢谢你。