如何使用Python IDE集成设置可热插拔的远程调试器?例如使用PyCharm。通过hotpluggable我的意思是:可以在飞行中与开发服务器连接和断开连接。
我在云端有dev服务器(django,nginx,uwsgi,postgres,debian),并使用PyCharm作为主IDE(但如果你有任何其他IDE的解决方案,请提供)。
有时,我需要连接和调试脚本而不停止/重新启动开发服务器。使用PyCharm的调试器(pydevd),dev服务器无法在没有工作调试器服务器(Connection refused
)的情况下启动,如果我在开发服务器运行时停止远程调试器,它会崩溃,例如
An existing connection was forcibly closed by the remote host
我找到了pdg / epdg,但他们没有与PyCharm集成。此外,PyCharm有一个很好的功能:"附加到进程",但它只适用于本地进程。
答案 0 :(得分:1)
可能有用的基本方法是为要调试的程序设置一个信号处理程序,以便在调试器中加载。然后向进程发送一个信号进行调试(通过kill
命令),然后可以远程连接。
以下是您通过python trepan debuggers
执行此操作的方法import signal
def signal_handler(num, f):
from trepan.interfaces import server as Mserver
from trepan.api import debug
connection_opts={'IO': 'TCP', 'PORT': 1955}
intf = Mserver.ServerInterface(connection_opts=connection_opts)
dbg_opts = {'interface': intf}
print('Starting TCP server listening on port 1955.')
debug(dbg_opts=dbg_opts)
return
signal.signal(signal.SIGUSR1, signal_handler)
# Go about your business...
import time
import os
print(os.getpid())
for i in range(10000):
time.sleep(0.2)
现在运行:
$ python /tmp/foo.py
8530
从上面的输出中我们帮助列出了我们想要调试的Python进程的pid。
现在在shell中我们发送一个信号告诉进程进入在信号处理程序中设置的调试器。你将不得不调整 进程ID。
$ kill -USR1 8530 # Adjust the pid to what you see above
在我们运行/tmp/foo.py
的shell中,您现在应该看到了
新产出:
$ python /tmp/foo.py
8530
Starting TCP server listening on port 1955. # This is new
回到我们发布kill -USR1
的shell,我们现在将进程暂停在调试器中:
$ trepan2 --client --port 1955
Connected.
(/tmp/foo.py:11 @101): signal_handler
-- 11 return
(trepan2*) list
6 connection_opts={'IO': 'TCP', 'PORT': 1955}
7 intf = Mserver.ServerInterface(connection_opts=connection_opts)
8 dbg_opts = {'interface': intf}
9 print('Starting TCP server listening on port 1955.')
10 debug(dbg_opts=dbg_opts)
11 -> return
12
13 signal.signal(signal.SIGUSR1, signal_handler)
14 # Go about your business...
(trepan2*) backtrace
-> 0 signal_handler(num=10, f=<frame object at 0x7f9036796050>)
called from file '/tmp/foo.py' at line 11
## 1 <module> file '/tmp/foo.py' at line 20