PyCharm远程调试原理与配置指南

Hazel
Hazel
发布时间:2026-10-13 | 6人浏览过
原创

本文详细解析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配置文件后,注意区分启动本地和远程两种不同的调试模式;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表