Я бы хотел присоединить отладчик Python к запущенному процессу. После этого комментария я попытался pdb-clone
, но запутался. Вот скрипт, к которому я прилагаю:
import os
import time
from pdb_clone import pdbhandler
pdbhandler.register()
def loop(my_pid):
print("Entering loop")
while True:
x = 'frog'
time.sleep(0.5)
print("Out of Loop")
if __name__ == '__main__':
my_pid = os.getpid()
print("pid = ", my_pid)
loop(my_pid)
Если я запускаю python3 target_code_1.py
в одном терминале и вижу PID = 95439
, то во втором терминале попробуйте
sudo pdb-attach --kill --pid 95439
Я получаю сообщение об ошибке (которое я включаю ниже).
Однако предположим, что я одновременно запускаю python3 target_code_1.py
в третьем терминале. Теперь я могу запустить sudo pdb-attach --kill --pid 95439
без ошибок, но когда я печатаю my_pid
, значение равно 95440. С другой стороны, если я запускаю sudo pdb-attach --kill --pid 95440
и печатаю my_pid
, значение равно 95439. (Другими словами, похоже, что pdb-attach
поменялся местами, к какому потоку он присоединяется. Что происходит?
Для записи первоначальное сообщение об ошибке выглядит следующим образом:
sudo pdb-attach --kill --pid 95440
Traceback (most recent call last):
File "/usr/local/bin/pdb-attach", line 4, in <module>
attach.main()
File "/usr/local/lib/python3.7/site-packages/pdb_clone/attach.py", line 646, in main
attach(address)
File "/usr/local/lib/python3.7/site-packages/pdb_clone/attach.py", line 596, in attach
for count in asock.connect_retry(address, verbose):
File "/usr/local/lib/python3.7/site-packages/pdb_clone/attach.py", line 115, in connect_retry
self.connect(address)
File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncore.py", line 342, in connect
raise OSError(err, errorcode[err])
OSError: [Errno 22] EINVAL
FWIW, я работаю на macOS Mojave 10.14.2, Python 3.7.0, Clang 9.1.0.
(Если я решу эту проблему неправильно, например, если есть более подходящий модуль Python, который можно подключить к живому процессу, я был бы рад использовать его вместо этого.)