工作中使用Pycharm作为python开发的IDE,作为专业的python集成开发环境,其功能之强大令人折服。开发过程中Debug是必不可少的。平时经常使用Pycharm的remote debug功能,非常好用。但是刚开始的时候并不了解该过程的原理,只是按部就班的配置。于是抽空了解了一下相关知识,期待能够了解其原理,今后能够在需要的时候自己独立的配置调试环境。本文将以浅显易懂的方式讲解一下相关过程。

1.应用环境

常见的IDE基本都具有Local Debugger功能。一般只需要简单的配置,直接加断点并使用Debug方式运行即可使用断点调试。这是对于本地调试开发而言。如果项目已经完成并上线部署到服务端,或者是本地需要在IDE之外单独配置并启动程序,那么显然不能使用本地调试。如果能够配合日志并使用断点定位分析问题,将会事半功倍。那么如何使用本地安装的Pycharm远程调试程序?

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有效即可。然后在需要的地方通过断点暂定程序,分析当前程序状态找出问题所在。

3.Pycharm具体配置

下面是当前的操作环境,原理和步骤都是想通的,可根据实际情况进行配置配即可。

当前环境:

  • Win7
  • Python 2.7.12
  • PyCharm Professional 2017.1.4 (community版本 好像没有remote debug 功能)

本地完成Pycharm的安装,在安装目录找到debug-eggs文件夹,里面有两个文件:

  • pycharm-debug.egg
  • pycharm-debug-py3k.egg

分别对应本地python解释器为python2和python3的情况。

解压pycharm-debug.egg文件,得到的文件夹pycharm-debug中包含的是remote 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 Configures

新建配置 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.注意事项

  1. 如果将程序部署到远端,那么需要Remote Debug配置中的localhost修改为安装Pycharm主机的IP地址,同时将PycharmRemoteDebug.py中的localhost改为同样的IP地址;
  2. 使用Pycharm的Deployment功能映射远程和本地代码;
  3. 断点命中时,客户端程序处于暂定状态;
  4. 如果没有开启Remote Debug Server,运行客户端会卡住;
  5. 不需要使用Remote Debug时一定不要在程序启动的时候import PycharmRemoteDebug模块;
  6. 添加remote debug 配置文件后,注意区分启动本地和远程两种不同的调试模式;

Pycharm远程调试原理及配置的更多相关文章

  1. pycharm搭建开发配置,远程调试,数据库配置,git配置等

    1 开发环境搭建 1.1 简介 使用虚拟机作为代码运行环境,本地使用pycharm进行代码编辑,使用远程调试功能进行debug. 1.1 安装centos虚拟机环境: 1.操作系统: 2.网络配置: ...

  2. pycharm远程调试配置

    目录: 安装pycharm 配置pycharm远程调试 使用测试 一.安装pycharm(略) 二.配置pycharm远程调试 1.菜单--->Tools--->Deployment--- ...

  3. [pycharm]远程调试服务器项目

    Pycharm远程调试服务器项目 准备工作 创建一个临时项目,用pycharm打开项目 mkdir xxx 准备一台远程服务器,尝试连接服务器 ssh worker@ip 同步项目到pycharm 配 ...

  4. Ansible 开发调试 之【pycharm远程调试】

    介绍 PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示.自动完成.单元测试.版本 ...

  5. 使用Python控制1602液晶屏实时显示时间(附PyCharm远程调试)

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 本文介绍一下UP板的GPIO资源使用,以及一个使用Python演示一个简单的demo. 本文使用Markdown写成,为获得更好的 ...

  6. pycharm远程调试docker容器内程序

    文章链接: https://blog.csdn.net/hanchaobiao/article/details/84069299 参考链接: https://blog.csdn.net/github_ ...

  7. 利用pycharm远程调试openstack代码

    1.安装pycharm专业版 本文安装pycharm 2016.2.3专业版.网上教程较多,这里不做详细介绍,只要到pycharm官网上下载应用程序进行安装即可. 2.pycharm配置 (1)首先按 ...

  8. Pycharm远程调试

    1.在pycharm的安装目录中找到pycharm-debug.egg,将其拷贝到目标主机的/usr/lib/python2.7/dist-packages目录下: 执行: sudo easy_ins ...

  9. 使用pycharm远程调试python代码

    使用 pycharm 进行 python 代码远程调试 pycharm 的远程调试是从远程机器连接到本地机器,需要在远程机器的py文件中指定本地机器的IP和端口. 远程机器上,通过easy_insta ...

随机推荐

  1. Summer Project

    Summer Project Summer是一个用于学习交流,基于Netty4.x的简单mvc库. 使用 快速开始 public class Application { public static v ...

  2. zuoye

    a=input('请输入一个数字:') b=input('请再输入一个数字') sum2=int(a)+int(b) print('两个数字的和是:{}'.format(sum2)) a=input( ...

  3. [LeetCode] Rectangle Overlap 矩形重叠

    A rectangle is represented as a list [x1, y1, x2, y2], where (x1, y1) are the coordinates of its bot ...

  4. mysql 字符编码

    安装的是mysql5.6 社区版 安装之后编码设置为utf8 mysql的ini文件中 [mysql] default-character-set=utf8 [mysqld] default-char ...

  5. NET Core微服务之路:基于Ocelot的API网关Relay实现--RPC篇

    前言 我们都知道,API网关是工作在应用层上网关程序,为何要这样设计呢,而不是将网关程序直接工作在传输层.或者网络层等等更底层的环境呢?让我们先来简单的了解一下TCP/IP的五层模型.     (图片 ...

  6. JS关于Date函数的格式化输出

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...

  7. dattime和timestamp的异同

    相同点: 1)都可以用来表示YYYY-MM-DD HH:MM:SS[.FRACTION]的时间; 不同点: 1)两者的存储方式不一样 a)timestamp他把客户端插入的时间从当前时区转化为UTC( ...

  8. 【DFS】n皇后问题

    回溯: 递归调用代表开启一个分支,如果希望这个分支返回后某些数据恢复到分支开启前的状态以便重新开始,就要使用到回溯技巧,全排列的交换法,数独,部分和,用到了回溯.下一个状态在开始之前需要利用到之前的状 ...

  9. 打个响指Selenium自动化开启

    最近斗哥在朋友的影响下,接触了自动化测试工具中的一个项目:appium自动化测试脚本. appium类库封装了标准Selenium客户端类库,为用户提供所有常见的JSON格式selenium命令以及额 ...

  10. JAVA四类八种基本数据类型

    boolean类型 Boolean在内存中占用一个字节. 当java编译器把java源代码编译为字节码时,会用int或byte来表示boolean.在java虚拟机中,用整数零来表示false,用任意 ...