有時候Python應用的代碼在本地開發環境運行十分正常,可是放到線上之後卻出現了莫名其妙的異常,通過再三排查之後仍是找不到問題緣由,因而就在想,要是能夠在服務器環境中進行單步跟蹤調試就行了。html
然而,在服務器系統上安裝一個IDE確定是不現實的;經過SSH遠程到服務器端,採用pdb
進行調試雖然可行,可是操做仍是較爲繁瑣,並且也不夠直觀。python
那麼,是否能夠將開發環境中的IDE與服務器環境相連,實現利用開發環境的IDE調試服務器環境中運行的程序呢? 答案是確定的,這就是遠程調試(Remote Debug)。bash
遠程調試的功能在Eclipse、IntelliJ IDEA等大型IDE中均有支持,實現原理都基本相同,這裏採用PyCharm進行說明。服務器
在遠程調試的模式下,PyCharm(IDE)扮演服務端(Server)的角色,而運行在遠程計算機上的應用程序扮演客戶端(Client)的角色。正因如此,進行遠程調試時,須要先在本地開發環境中設定端口並啓動IDE,IDE會對設定的端口開始監聽,等待客戶端的鏈接請求;那遠程計算機中的應用程序又是怎樣與IDE創建通信鏈接的呢?app
針對遠程調試功能,PyCharm提供了pydevd
模塊,該模塊以pycharm-debug.egg
的形式存在於PyCharm的安裝路徑中。遠程計算機安裝該庫文件後,而後就能夠調用pydevd.settrace
方法,該方法會指定IDE所在機器的IP地址和監聽的端口號,用於與IDE創建鏈接;創建鏈接後,即可在IDE中對遠程在遠程計算機中的程序進行單步調試。python2.7
pydevd
模塊首先,在本地開發環境的PyCharm安裝路徑中找到pycharm-debug.egg
文件(若遠程計算機運行的是Python3,則須要pycharm-debug-py3k.egg
);socket
而後,將pycharm-debug.egg
文件拷貝至遠程計算機,在遠程計算機中將pycharm-debug.egg
添加至引用路徑,能夠採用多種方式:post
easy_install pycharm-debug.egg
命令進行安裝(pip命令沒法安裝,只能使用easy_install)pycharm-debug.egg
添加至PYTHONPATH
或sys.path
: import sys; sys.path.append('/home/leo/app-dependancies/pycharm-debug.egg')
pycharm-debug.egg
,將其中的pydev
文件夾拷貝至遠程應用程序目錄下最後,在遠程計算機的Python命令行中輸入import pydevd
,若沒有報錯則說明pydevd
模塊安裝成功。url
在PyCharm中配置說明以下:spa
Local host name
和Port
,其中Local host name
指的是本機開發環境的IP地址,而Port
則隨便填寫一個10000以上的便可;須要注意的是,因爲遠程計算機須要鏈接至本地開發環境,所以本地IP地址應該保證遠程能夠訪問獲得將以下代碼插入至遠程計算機的應用程序中。
import pydevd pydevd.settrace('100.84.48.156', port=31235, stdoutToServer=True, stderrToServer=True)
其中,IP地址和端口號要與PyCharm中的監聽配置保持一致。
Debug Server
【Run】->【Debug…】,選擇剛建立的遠程調試配置項,在Debug Console
中會顯示以下信息:
Starting debug server at port 31235
Waiting for process connection... Use the following code to connect to the debugger: import pydevd pydevd.settrace('100.84.48.156', port=31235, stdoutToServer=True, stderrToServer=True)
這說明Debug Server
已經啓動並處於監聽狀態。
在遠程計算機中啓動應用程序,當執行到pydevd.settrace
語句時,便會與本地開發環境中的PyCharm創建通信鏈接,接下來即可以在本地IDE中進行單步調試了。
須要注意的是,本地開發環境必須保證IP地址和端口號可從遠程計算機訪問獲得,不然會沒法創建鏈接。
$ telnet 100.84.48.156 31235 Trying 100.84.48.156... telnet: Unable to connect to remote host: Connection refused $ python devicedectector.py Could not connect to 100.84.48.156: 31236 Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/pycharm-debug.egg/pydevd_comm.py", line 478, in StartClient s.connect((host, port)) File "/usr/lib/python2.7/socket.py", line 224, in meth return getattr(self._sock,name)(*args) error: [Errno 111] Connection refused