Хотя приведенные ответы действительны, иногда у вас нет прав на изменение сценария для выполнения gdb или на изменение программы для добавления дополнительных выходных данных для подключения через pid.
К счастью, есть еще один способ использовать силу bash.
Используйте ps, grep и awk, чтобы выбрать pid для вас после его выполнения. Вы можете сделать это, обернув другой скрипт своим собственным или просто выполнив команду самостоятельно.
Эта команда может выглядеть примерно так:
процесс.ш
#!/usr/bin/env bash
#setup for this example
#this will execute vim (with cmdline options) as a child to bash
#we will attempt to attach to this process
vim ~/.vimrc
Чтобы подключить gdb, нам просто нужно выполнить следующее:
gdb --pid $(ps -ef | grep -ve grep | grep vim | awk '{print $2}')
- Здесь я использую
ps -ef
, чтобы перечислить процессы и их аргументы. Иногда у вас будет несколько запущенных экземпляров программы, и вам нужно будет выполнить дальнейший поиск до того, который вы хотите.
grep -ve grep
здесь, потому что опция f
для ps будет включать следующий grep
в свой список. Если вам не нужны аргументы команды для дополнительной фильтрации, не включайте параметр -f
для ps и игнорируйте эту часть.
grep vim
— это место, где мы находим желаемый процесс. Если вам нужна дополнительная фильтрация, вы можете просто сделать что-то вроде grep -E "vim.*vimrc"
и отфильтровать именно тот процесс, к которому вы пытаетесь подключиться.
awk '{print $2}'
просто выводит только pid процесса на стандартный вывод. Используйте $1
, если вы используете ps -e
вместо ps -ef
Моя обычная установка - запустить такой скрипт, который запускает мой процесс в 1 панели tmux и набирает что-то похожее на приведенное выше в нижней панели. Таким образом, если мне нужно настроить фильтрацию (по какой-либо причине), я могу сделать это довольно быстро.
Однако обычно это будет то же самое для конкретного экземпляра, и я хочу просто автоматически подключиться после его запуска. Вместо этого я сделаю следующее:
runGdb.py
#!/usr/bin/env bash
./process.sh &
PID=$(ps -ef | grep -ve grep | grep -E "vim.*vimrc" | awk '{print $2}')
#or
#PID=$(ps -e | grep vim | awk '{print $1}')
gdb --pid $PID
Это предполагает, что исходный процесс можно безопасно запустить в фоновом режиме.
25.06.2020