PyCharm远程调试原理与配置指南
本文详细解析PyCharm远程调试的工作原理,阐述本地IDE作为服务器监听、远端程序通过pydevd模块连接并同步状态的机制。针对Python 2.7与PyCharm 2017.1.4环境,提供从提取debug-eggs、配置Remote Debug Server到编写客户端连接脚本的完整操作步骤,帮助开发者在服务器端独立运行程序时实现高效的断点调试。
PyCharm远程调试原理与配置指南
前言
在Python开发工作中,PyCharm作为主流集成开发环境(IDE),其强大的功能备受推崇。Debug调试是开发流程中不可或缺的一环,许多开发者日常依赖PyCharm的Remote Debug功能,操作便捷且高效。然而,初期使用时往往只知配置步骤而不知其底层原理。为了在需要时能独立搭建调试环境,有必要深入理解其工作机制。本文将通过通俗易懂的方式,解析远程调试的核心过程与配置方法。
应用环境
1.应用环境
大多数主流IDE都内置了Local Debugger功能,通常只需简单配置并添加断点,以Debug模式运行即可进行本地调试。然而,当项目已部署至服务器,或在本地IDE之外独立启动程序时,本地调试便不再适用。若此时能结合日志与断点来定位问题,将极大提升排查效率。那么,如何配置本地安装的PyCharm以实现对远程程序的调试?
远程调试原理
2.远程调试原理
当程序部署在远端服务器,而需要在本地获取其运行状态并进行断点调试时,必须建立本地与远端的通信连接。在PyCharm的远程调试架构中,本地的PyCharm实际上充当了服务器(Server)的角色。
首先,需在PyCharm的Run/Debug Configurations中进行配置,指定本地主机的一些关键属性,例如PyCharm所在主机的IP地址和监听端口号。
接着,启动PyCharm的远程调试模式。此时,PyCharm进入监听状态,等待独立于IDE之外运行的远端程序发起连接。
随后,在远端程序启动初期,需依据PyCharm Debug Configurations中的配置信息,主动连接至本地的PyCharm。
最后,当连接建立成功后,若远端客户端代码执行到本地PyCharm中预设的断点处,程序将在该断点暂停执行。此时,本地PyCharm能够展示远端程序的当前运行状态、调用栈等信息,支持进一步的跟踪与逐步调试。
需确保本地PyCharm中调试的源代码工程与远端运行的程序源代码完全一致。同时,PyCharm中Remote Debug Configure的配置必须保证网络可达,允许远程连接。
由于远程客户端使用PyCharm提供的pydevd模块连接本地PyCharm Remote Debug,双方的通信链路均遵循PyCharm自定义的协议。因此,开发者无需关注断点设置与命中过程中的底层实现细节,只需确保Debug Configure配置有效即可。在需要的位置设置断点暂停程序,分析当前状态以定位问题。
PyCharm具体配置
3.PyCharm具体配置
以下是本文演示的操作环境,其原理与步骤具有通用性,用户可根据实际环境进行相应配置。
当前环境:
- Windows 7
- Python 2.7.12
- PyCharm Professional 2017.1.4(注:Community版本似乎不支持Remote Debug功能)
在本地完成PyCharm安装后,进入安装目录找到debug-eggs文件夹,其中包含两个文件:
- pycharm-debug.egg
- pycharm-debug-py3k.egg
这两个文件分别对应本地Python解释器为Python 2和Python 3的情况。
解压pycharm-debug.egg文件,得到的文件夹pycharm-debug中包含了远程调试相关的模块。
远程客户端正是通过该文件夹中pydevd文件的settrace方法,连接到指定的Debug Server。
客户端配置:
为简化操作,此处将客户端代码也放置在本地(若部署在远端,只需将下文中的localhost替换为PyCharm所在主机的IP地址即可)。
在工程中引入刚才解压得到的远程调试模块:
./pycharm-debug
此外,还需封装一个用于连接Remote Debug Server的文件:
./PycharmRemoteDebug.py
import sys
sys.path.append('./Pycharm_debug')
import pydevd
if __name__ != '__main__':
pydevd.settrace('localhost', port=23456, stdoutToServer=True, stderrToServer=True, suspend=False)
当前待调试的主程序文件为:./Main.py
# -*- coding:utf-8 -*-
import PycharmRemoteDebug
class Singleton(object):
_INSTANCE = {}
def __init__(self, cls):
self.cls = cls
def __call__(self, *args, **kwargs):
instance = self._INSTANCE.get(self.cls, None)
if not instance:
instance = self.cls(*args, **kwargs)
self._INSTANCE[self.cls] = instance
return instance
def __getattr__(self, key):
return getattr(self.cls, key, None)
@Singleton
class MyClass(object):
def __init__(self):
self.init_attr = "init_attr"
def __getattr__(self, key):
return self.__dict__.get(key, 1212)
if __name__ == "__main__":
mcls1 = MyClass()
mcls2 = MyClass()
print mcls1 is mcls2
注意,调试模块pycharm-debug和连接文件PycharmRemoteDebug.py可放置于任意路径,只需在代码中正确调整模块引用的路径即可。
当前工程目录结构如下:

PyCharm Remote Debug 配置步骤:
打开Run/Debug Configurations窗口。

新建配置,选择Add New Configuration --> Python Remote Debug。

配置名称可自定义,端口号也可随意修改,只要确保端口可用且未被占用即可。
上述截图中的绿色标记部分提示了客户端连接Debug Server的步骤与方法,请注意第三步中使用的命令正是客户端配置文件中PycharmRemoteDebug.py的连接命令。
使用步骤
4.使用步骤
选择刚才新建的Debug模式Remote_Debug,点击绿色的甲壳虫Debug按钮:

Debug Console显示如下信息,表明本地Debug Server已开启并处于监听状态:
Starting debug server at port 23456
Use the following code to connect to the debugger:
import pydevd
pydevd.settrace('localhost', port=23456, stdoutToServer=True, stderrToServer=True, suspend=False)
Waiting for process connection...
随后,在PyCharm中设置所需的断点。
最后,启动客户端程序(运行Main.py,注意不是在IDE中运行,而是直接双击该文件或通过命令行执行)。
PyCharm中命中断点后的状态:

通过Watch窗口查看程序当前状态及调用栈等信息:

注意事项
5.注意事项
- 若将程序部署到远端,需将Remote Debug配置中的localhost修改为安装PyCharm主机的IP地址,同时将PycharmRemoteDebug.py中的localhost也改为相同的IP地址;
- 可利用PyCharm的Deployment功能映射远程和本地代码;
- 断点命中时,客户端程序处于暂停状态;
- 若未开启Remote Debug Server,运行客户端程序将会卡住;
- 不需要使用Remote Debug时,务必不要在程序启动时import PycharmRemoteDebug模块;
- 添加remote debug配置文件后,注意区分启动本地和远程两种不同的调试模式;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













