【问题标题】:Prevent sigint from closing OpenOCD when using OpenOCD with GDB将 OpenOCD 与 GDB 一起使用时,防止 sigint 关闭 OpenOCD
【发布时间】:2020-01-19 03:36:50
【问题描述】:

我正在尝试编写脚本以在后台启动 OpenOCD,然后启动 GDB 实例并将其连接到我的 OpenOCD 服务器。这主要是有效的,除了一旦我输入中断字符来停止目标,我正在调试我的 OpenOCD 服务器退出。 OpenOCD 似乎正在接收 SIGINT。

我尝试通过多种不同的方式将 OpenOCD 与 GDB 分开,此时我的脚本如下所示:

#! /bin/sh

trap '' SIGINT && nohup sh -c "trap '' SIGINT & openocd -f openocd-jlink.cfg < /dev/null" &
OPENOCD_PID=$!

arm-none-eabi-gdb -ex "set architecture armv6-m" -ex "target extended-remote localhost:2331" obj/main.elf

kill $OPENOCD_PID

我很确定这应该是非常过分的,但只要我在 GDB 中键入中断字符,OpenOCD 仍然会退出。如果我直接从我的 shell 运行相同的命令(而不是作为脚本的一部分),一切都会按预期工作。即使我只运行 openocd -f openocd-jlink.cfg &amp; 后跟 GDB,它也可以工作,不需要单独的 shell、nohup 或捕获 SIGINT。

我希望有人知道我可以在我的脚本中做什么来防止 GDB 中的 SIGINT 到达 OpenOCD。也许有一些方法可以完全从 shell 守护进程?我在这里阅读了很多关于脚本中 SIGINT 的更一般问题的答案,所以我觉得这可能是 OpenOCD 和 GDB 特有的问题。

【问题讨论】:

    标签: shell gdb sh sigint openocd


    【解决方案1】:

    我已经设法通过使用setsid 解决了这个问题。该脚本的工作版本是:

    #! /bin/sh
    
    setsid openocd -f openocd-jlink.cfg -l /dev/null &
    
    arm-none-eabi-gdbm" -ex "target extended-remote localhost:2331" obj/main.elf
    
    killall openoc
    

    由于我希望脚本可以在 macOS 和 Linux 上运行,并且 macOS 不附带 setsid,因此我最终使用 Python 启动 OpenOCD,如下所示:

    subprocess.Popen(["openocd", "-f", "openocd-jlink.cfg", "-l", "/dev/null"], preexec_fn = os.setsid)
    

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 1970-01-01
      • 2023-04-05
      • 2011-03-04
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多