代码之家  ›  专栏  ›  技术社区  ›  K.Mulier

GDB便利变量不会在中展开。格德比尼特

  •  1
  • K.Mulier  · 技术社区  · 5 年前

    我跑 gdb 用一个 .gdbinit 文件,其中包含一些不会扩展的方便变量。

    1.我的设置

    我写了以下内容 格德比尼特先生 通过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端口,这在一台计算机上与另一台计算机上可能不同。因此,我不想在 格德比尼特先生 文件GDB便利变量看起来是最优雅的解决方案:

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

    所以我使用便利变量 $com 格德比尼特先生 文件,我在调用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 执行时 格德比尼特先生 ,我想直接在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的回答!正如你所建议的,我把我的 格德比尼特先生 提交以下内容:

    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"
    

    现在成功了!你救了我一天!

    0 回复  |  直到 5 年前
        1
  •  4
  •   Mark Plotnick    5 年前

    便利变量只在特定的上下文中展开,主要是表达式,例如 print , x , eval , set if .

    你可以用 评估 做你想做的事:

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

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

    Gdb确实有一个更通用的宏功能: user-defined commands .

    一种可能是把这个放进去。格德比尼特:

    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\""
    
        2
  •  1
  •   Employed Russian    5 年前

    GDB manual 清楚地记录了 .gdbinit 在任何 -ex 命令。

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

        3
  •  1
  •   Sid    5 年前

    因此,在您的测试中,应使用“/”格式的Windows COMB进行测试:

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

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