1

gdb使用一个.gdbinit文件运行,该文件有一些不会扩展的便利变量。

1. 我的设置

我编写了以下.gdbinit文件以通过 blackmagic 探针将可执行文件闪存到微控制器(请参阅https://github.com/blacksphere/blackmagic/wiki):

# .gdbinit file:
# ------------------------------------------- #
#              GDB commands                   #
#              FOR STM32F767ZI                #
# ------------------------------------------- #
target extended-remote $com
monitor version
monitor swdp_scan
attach 1
file mcu_application.elf
load
start
detach
quit

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

https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_59.html

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

arm-none-eabi-gdb -x .gdbinit -ex "set $com = \"COM9\""

2.错误

GDB 启动但抛出错误消息:

.gdbinit:6: Error in sourced command file:
$com: No such file or directory.

看起来 GDB 无法识别$com便利变量。所以我检查 GDB 是否实际存储了变量:

(gdb) show convenience
$com = "COM9"
$trace_file = void
$trace_func = void
$trace_line = -1
$tracepoint = -1
$trace_frame = -1
$_inferior = 1
...

这证明 GDB 正确地将其存储为"COM9". 因此,问题在于未能扩展它。

3. 更多试验

$com当我观察到执行时扩展失败时.gdbinit,我认为直接在 GDB 中发出命令可能会起作用:

(gdb) set $com = "COM9"

(gdb) show convenience
$com = "COM9"
$trace_file = void
$trace_func = void
...

(gdb) target extended-remote $com
$com: No such file or directory.

但错误仍然存​​在。

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

COM9但是,在调用 GDB 时,我必须删除参数周围的引号。所以而不是:

arm-none-eabi-gdb -x .gdbinit -ex "flash-remote \"COM9\""

我以这种方式调用 GDB:

arm-none-eabi-gdb -x .gdbinit -ex "flash-remote COM9"

现在它起作用了!你救了我的一天!

4

3 回答 3

3

便利变量仅在某些上下文(主要是表达式)中扩展,例如print, x, eval,setif.

你可以eval用来做你想做的事:

eval "target extended-remote %s", $com

但是 - 这是一个很大的问题 - 直到最近,当评估表达式时,gdb 会将字符串值存储在目标的地址空间中,这需要一个正在运行的进程。因此,在较旧的 gdbs 上,您可能会收到错误消息评估此表达式需要目标程序处于活动状态

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\""
于 2020-07-06T19:15:53.273 回答
1

GDB手册清楚地记录了在任何命令.gdbinit之前评估的内容。-ex

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

于 2020-07-05T16:10:37.220 回答
1

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

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

我没有对此进行测试,但是我希望它可以工作。

于 2020-07-05T20:35:33.333 回答