一、用 PyCharm 进行远程调试debugger
官网:Remote Debugging with PyCharm 用 PyCharm 进行远程调试 https://www.jetbrains.com/help/pycharm/remote-debugging-with-product.html
This is a Professional feature: download PyCharm Professional to try. 这是一个PyCharm 专业版的功能: 下载 PyCharm Professional 试试。
使用 PyCharm,您可以使用位于另一台计算机上的解释器调试应用程序,例如,在 web 服务器或专用测试机器上。
提供了两种远程调试的方法:
-
Through a remote interpreter. 使用此方法可以利用远程计算机上可用的扩展调试功能。 要求: 从本地机器到远程服务器的 SSH 访问。 -
Using the Python remote debug server configuration. 使用 Python 远程[调试服务器配置](Remote debugging with the Python remote debug server configuration)。 使用此方法将调试过程集成到远程服务器上的一系列正在运行的进程中。如果您不能显式地运行应用程序进行调试,或者需要进行某些准备工作,那么这可能会有所帮助。 要求: 通过 SSH 从本地机器访问远程服务器,使用任何预定义的端口从远程服务器访问本地机器。
方法1:我们配置了远程解释器,将脚本部署到远程主机,调试了脚本。 方法2:我们创建一个调试配置(调试服务器),启动调试服务器。在远程计算机上执行 Python 脚本,在本地机器上调试脚本。
您的代码实际上在远程主机上执行,但在本地机器上调试。
1. 方法1:我们配置了远程解释器
该方案简单高效! 但是,注意它的要求: 要求: 通过 SSH 从本地机器访问远程服务器,使用任何预定义的端口从远程服务器访问本地机器。
注意,同方法2,必须远端可以主动连接到本地。
1.1 pycharm可以远程解释器运行,但是不能debug
单独在远程执行 python -u /root/.pycharm_helpers/pydev/pydevd.py --multiproc --client 0.0.0. 0 --port 37990 报错:
Could not connect to 0.0.0.0: 37990
Traceback (most recent call last):
File "/root/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_comm.py", line 456, in start_client
s.connect((host, port))
ConnectionRefusedError: [Errno 111] Connection refused
Traceback (most recent call last):
File "/root/.pycharm_helpers/pydev/pydevd.py", line 2173, in <module>
main()
File "/root/.pycharm_helpers/pydev/pydevd.py", line 2055, in main
dispatcher.connect(host, port)
File "/root/.pycharm_helpers/pydev/pydevd.py", line 1826, in connect
self.client = start_client(self.host, self.port)
File "/root/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_comm.py", line 456, in start_client
s.connect((host, port))
ConnectionRefusedError: [Errno 111] Connection refused
问题原因分析: 要求: 通过 SSH 从本地机器访问远程服务器,使用任何预定义的端口从远程服务器访问本地机器。
注意,同方法2,必须远端可以主动连接到本地。
2. 方法2 使用 Python 远程调试服务器配置
从主菜单中选择 Run | Edit Configuration… 。运行/调试配置对话框打开。您必须单击工具栏,然后从可用配置列表中选择 pythondebug Server。
从主菜单中选择 Run | Edit Configuration… 。运行/调试配置对话框打开。您必须单击工具栏,然后从可用配置列表中选择 pythondebug Server。
输入此运行/调试配置的名称——设为 MyRemoteServer。指定运行 IDE 的机器的端口号(这里是12345)和 IDE 主机名(这里是172.20.208.95)。远程调试服务器将使用这些参数来访问它。
根据IDE界面的提醒,安装对应的pydevd-charm。执行 pydevd_pycharm.settrace
将本地机器上的路径映射到远程机器上的路径: 使用步骤:
-
IDE 启动后,会显示自己再监听状态。 然后在Pycharm中设置断点。 -
然后运行远端的py程序,使用命令行执行(并非在IDE中,是在远端命令执行)
修改源代码文件如下:
import math
import pydevd_pycharm
pydevd_pycharm.settrace('172.20.208.95', port=12345, stdoutToServer=True,
stderrToServer=True)
class Solver:
def demo(self, a, b, c):
d = b ** 2 - 4 * a * c
if d > 0:
disc = math.sqrt(d)
root1 = (-b + disc) / (2 * a)
root2 = (-b - disc) / (2 * a)
return root1, root2
elif d == 0:
return -b / (2 * a)
else:
return "This equation has no roots"
if __name__ == '__main__':
solver = Solver()
while True:
a = int(input("a: "))
b = int(input("b: "))
c = int(input("c: "))
result = solver.demo(a, b, c)
print(result)
如上,可以看到该方法对代码有侵入!
注意事项: 如果将程序部署到远端,那么需要Remote Debug配置中的localhost修改为安装Pycharm主机的IP地址,同时将PycharmRemoteDebug.py中的localhost改为同样的IP地址; 使用Pycharm的Deployment功能映射远程和本地代码; 断点命中时,客户端程序处于暂定状态; 如果没有开启Remote Debug Server,运行客户端会卡住; 不需要使用Remote Debug时一定不要在程序启动的时候import PycharmRemoteDebug模块;
总结: 因此,此方案,必须保证远端环境可以主动连接到你IDE本地环境!
2.2 远程调试原理
如果程序部署在远端,要在本地获取程序运行状态并进行断点调试,必然需要连接到程序并进行通讯。利用Pycharm进行远程调试过程中,Pycharm充当服务器的角色。
首先,对Pycharm Run/Debug Configures进行配置,指定Pycharm安装端的一些属性,比如Pycharm所在主机的IP地址和端口号等。
然后,启动Pycharm的远程调试。这时Pycharm处于监听状态,等待独立于IDE之外运行的程序的连接。
其次,在远端程序刚启动时,需要根据Pycharm Debug Configures中的配置信息,连接到Pycharm。
最后,连接成功之后,当远程客户端运行到本地Pycharm中设置的断点处时,便会在断点处暂停程序的执行,而在本地Pycharm命中断点处能够看到远端程序当前运行的状态和调用栈等信息并进行下一步跟踪和逐步调试。
本地Pycharm中调试的源代码工程应和远端运行的程序源代码保持一致。Pycharm中Remote Debug Configure的配置要保证能够被远程连接。
由于远程客户端使用Pycharm提供的pydevd模块连接到本地的Pycharm remote Debug,两者通讯链接均遵循Pycharm自定义的协议。因此我们不必关心Pycharm设置断点和远程客户端命中断点过程中两端具体的实现和处理过程,只要保证我们的Debug Configure有效即可。然后在需要的地方通过断点暂定程序,分析当前程序状态找出问题所在。
|