4、将Waiting for connection...上面的两句代码copy到对应断点调试代码中:
import
pydevd
pydevd.settrace('192.168.1.133', port=51234, stdoutToServer=True, stderrToServer=True)
|
接下来以nova的get_all实例为例调试:
vim
/usr/lib/python2.6/site-packages/nova/compute/api.py
|
添加上述内容后api代码如下:
5、重启nova服务nova-api、nova-compute,执行:nova list命令,或者dashboard点击获取instance的页签:
远程debug连接到pycharm,进入了调试模式。
6、此处发现pycharm并没有进入到get_all 断点调试的代码处,而是进入了thread.py的线程文件,这是因为nova底层代码
使用的eventlet多线程(协程)导致,解决此问题参考如下:
grep -rn 'eventlet.monkey_patch' /usr/lib/python2.6/site-packages/nova
vim /usr/lib/python2.6/site-packages/nova/cmd/__init__.py
|
将
import eventlet
from nova import debugger
if debugger.enabled():
# turn off thread patching to enable the remote debugger
eventlet.monkey_patch(os=False, thread=False)
else:
eventlet.monkey_patch(os=False)
|
替换为:
import eventlet
from nova import debugger
if debugger.enabled():
# turn off thread patching to enable the remote debugger
eventlet.monkey_patch(os=False, thread=False)
else:
eventlet.monkey_patch(os=False, thread=False)
|
|
注:由于上述步骤中,将多线程关闭了,所以之后如果涉及到多线程协作流程(例如一次性创建多个虚拟机),将可能出现错误。
安装之前步骤,重启服务nova-api、nova-compute,nova list 即可以看到正常的调试代码:
补充:pycharm可以将本机代码和远程代码进行映射(Edit Path Mapping),就不用每次去远程下载远程:
补充、如果还是不能正常调试,请将pycharm安装文件内容替换:
将:
SUPPORT_GEVENT = os.getenv('GEVENT_SUPPORT', 'False') == 'True'
|
替换为:
|