Debugging GDB便利变量不在.gdbinit中展开
我用一个.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文件提供了以下内容: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
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谢谢你。