Запретить sigint закрывать OpenOCD при использовании OpenOCD с 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

Я почти уверен, что это должно быть излишним, но OpenOCD все равно выходит, как только я набираю символ прерывания в GDB. Если я запускаю те же команды непосредственно из моей оболочки (не как часть сценария), все работает, как ожидалось. Это работает, даже если я просто запускаю openocd -f openocd-jlink.cfg &, а затем GDB, не требуется отдельной оболочки, nohup или захвата SIGINT.

Я надеюсь, что кто-то может иметь представление о том, что я могу сделать в моем скрипте, чтобы предотвратить попадание SIGINT в GDB в OpenOCD. Может быть, есть способ полностью демонизировать из оболочки? Я прочитал здесь много ответов о более общих проблемах с SIGINT в сценариях, поэтому у меня есть ощущение, что это может быть чем-то специфическим для OpenOCD и GDB.


person Samuel Dewan    schedule 19.01.2020    source источник


Ответы (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)
person Samuel Dewan    schedule 22.01.2020