在将 OpenOCD 与 GDB 一起使用时防止 sigint 关闭 OpenOCD

Prevent sigint from closing OpenOCD when using OpenOCD with GDB

我正在尝试编写一个脚本来在后台启动 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 & 后跟 GDB,它也能工作,不需要单独的 shell、nohup 或捕获 SIGINT。

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

我已经使用 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)