Запретить закрытие OpenOCD при использовании OpenOCD с GDB - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь написать скрипт для запуска 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

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

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

1 Ответ

0 голосов
/ 22 января 2020

Мне удалось решить эту проблему с помощью 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)
...