openstack调试方法总结

时间:2023-02-08 18:35:52

一、Openstack 如何修改代码并且观察效果

写这篇文章是为了给Openstack 新手提供一些基本的帮助,例如哪里修改,怎么修改,修改了之后如何重启等等。

1      文件的位置

现在网上的安装方法基本都是通过配置安装源安装,那么安装后的Openstack工程的程序文件在哪呢?以nova为例:

/usr/share/pyshared/nova

这个目录下的结构是不是十分熟悉,对,基本跟在eclipse下浏览工程的结构一模一样,这就是安装openstack后源代码路径。再看下面的目录:

/usr/lib/python2.7/dist-package/nova

这里就是nova工程经过编译后的文件,其中的py文件是上面那个目录中对应文件的链接而已。

2      动手修改python文件

当我们知道了源文件和编译文件位置之后,那我们就很容易的修改程序以满足我们自己的要求。以修改nova操作权限判断流程为例。nova创建虚拟机时,会调用nova/compute/api.py中API类的_check_create_policies方法根据policy.json文件内容进行操作权限的判断,而该方法最终会调用nova/policy.py中的enforce方法:

 

如果我们想知道程序运行到此时,context中到底有什么内容,那么我们可以修改文件如下,注意对比上面代码新增的4行:

LOG =logging.getLogger(__name__);

LOG.debug(‘*’*20)

LOG.debug(credentials)

LOG.debug(‘*’*20)

Raise exception.PolicyNotAuthorized(action=action)

需要注意是:要在文件的开头处将logging引入,同时,定义:

LOG = logging.getLogger(__name__)

我们打印两行*号以便快速定位日志,同时将context内容打印出来,并显式的抛出一个异常让本次处理停止。

3      编译文件

文件修改完,必须经过编译并把源文件和编译后的文件覆盖现有工程中相应的文件。python中提供了很方便的模块对源文件进行编译,我们可以把如下内容保存到一个脚本中并执行:

(echo 'import py_compile'; echo'py_compile.compile(r"/root/pydir/policy.py",r"/root/pydir/policy.pyc")') | python 

简单解释:/root/pydir/policy.py为源文件,/root/pydir/policy.pyc是你想要将编译后的文件放在哪。

4      实验

分别将policy.py文件和policy.pyc文件替换/usr/share/pyshared/nova/policy.py和/usr/lib/python2.7/dist-packages/nova/policy.pyc(强烈建议在替换前先备份原来的文件!)

重启nova各个进程:

cd /etc/init.d/; for i in $( ls nova-* ); do sudoservice $i restart; done

随便调用任意一个nova命令,如nova list,将会得到以下输出:

说明我们的修改生效。打开日志,可以看到context中的具体内容。

路径为/var/log/nova-*.log.

( http://blog.csdn.net/quqi99 )

1, 对于要远程调试的WSGI web应用中,添加如下代码,其中172.16.1.122是指远程安装eclipse机器的ip地址。
import pydevd
pydevd.settrace('172.16.1.122', 1234, stdoutToServer=False, stderrToServer=False)
若用了monkey_patch的话,记得将thread设置成Flase, eventlet.monkey_patch(os=False, thread=False)

举例, 假如我们要调试nova-compute,可照下列方式启动服务,它将自动做如上设置
nova-compute --remote_debug-host 172.16.1.122 --remote_debug-port 1234

2, eclipse端,首先设置环境变量
import sys
sys.path.append('/bak/java/eclipse/plugins/org.python.pydev_3.1.0.201312121632/pysrc/')
或者:
export PYTHONPATH=/bak/java/eclipse/plugins/org.python.pydev_3.1.0.201312121632/pysrc/:$PYTHONPATH
或者在eclipse工程点右键的属性的PyDev-PYTHONPATH里添加一个External Libraries,方法多得很,都行。

3,eclipse端,其次要保证eclipse端也有同样的代码,如果在不同目录,可以使用修改/bak/java/eclipse/plugins/org.python.pydev_3.1.0.201312121632/pysrc/pydevd_file_utils.py文件:
PATHS_FROM_ECLIPSE_TO_PYTHON = [(r'/bak/openstack', r'/server_side/openstack')]

4, 将远端nova-compute服务启动后(pydevd.settrace之后),在本地的eclipse中进入"Debug"视图后会看到一个“PyDev: start the pydev server"按钮然后点击它,这时候eclipse就和远端连接上了。
   剩下该设置断点设置断点,平时该怎么做就怎么做了。

参考:
http://pydev.org/manual_adv_remote_debugger.html


Pdb调试Havana过程

1.      修改代码

在需要调试的地方加入:

import pdb; pdb.set_trace()(以在nova/compute/api.py:get_all()中加入pdb为例)

2.      重启服务

在相应的screen中用ctrl+c终止当前进程,然后按向上的方向键,就会出现启动服务的命令,按enter服务就起来了。

3.      开始调试:

openstack调试方法总结

显示有两个screen

screen –x stack

进入如下界面:
openstack调试方法总结

最下一行表示,每一个进程都有一个screen。带*号的表示当前的screen,可以同时按下ctrl+a+8和ctrl+a+2分别前进和后退,来切换不同的screen.

4.      在0$中输入nova list;切换到4$ n-api:

openstack调试方法总结

5.      开始使用pdb进行调试

openstack调试方法总结


6. 物理机重启后,可使用rejoin-stack.sh启动openstack服务

7. ctrl+a+shift+", 可以选择screen , 主要就不需要通过ctrl + a  or ctrl + p 来回切换了:)。


参考资料

1.使用pdb调试openstack (How to debug openstackusing pdb )

http://blog.csdn.net/hackerain/article/details/8373597

2. linux screen 命令详解

http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html



因为前几天Komodo突然一下在使用中没法代码自动补全,没法进行代码自动提示了,自己折腾了(大概十个小时,卸载重装了很多次)很久也没法让它对python代码进行自动提示,很无语,于是彻底放弃,改用Eclipse+pyDev平台。虽然浪费了时间,但是已经对Eclipse有些熟练了,还是有所收获哦。

  Python的安装比较简单,因此python的安装就不说了,Eclipse的基础环境,JRE也略过。

一、安装Eclipse。

  首先到Eclipse官网下载下载最新版的Eclipse程序,种类很多,注意选择自己需要的版本:

openstack调试方法总结

 

  这里选择第二个:Eclipse Classic 4.2.2。

  下载后解压的即可,如果JRE环境配置正确点击“eclipse.exe”,IDE直接就可以运行了,运行后会让其选择“workspace”(工作空间),随便选择一个便可。

  在菜单栏“Window”=>“General”=>“Appearance”=>“Basic”中可以设置各中字体的大小,针对中文注释字体偏小的情况是因为没有选择等宽字体的原因,因此,将“TextFont”的字体修改一下便可以了。“Dialog Font”是设置界面(包括该界面)的字体情况。

  在菜单栏“Window”=>“General”=>“Editor”=>“TextEditors”=>“Spelling”中设置默认的编码方式,这里设置为UTF-8。在栏“Window”=>“General”=>“Workspace”中也设置编码为UTF-8。

二、Eclipse安装PyDev插件

  在菜单栏“Help中,选择“InstallNew Software…”,点击“Add…”。“Name”填写“PyDev”,“Location”填写:“http://pydev.org/updates”后,点击“OK”。然后进行如下选择后“next”即可。

openstack调试方法总结

 

  安装的过程比较简单,只需要默认选择或者接受、信任安装即可。安装的时间视网络情况而定,而插件地址考虑被墙的情况,最好在代理情况下进行安装。然后会提示进行重新启动,重新启动后便可。

三、配置PyDev插件

  在菜单栏“Window”=>“PyDev”=>“Interpreter –Python”中,右侧点击“New”,做如下配置。

openstack调试方法总结

 

  之后全选后点“OK”,点“Apply”后会较长卡顿,是IDE进行更新配置。

四、进行Eclipse代码美化配置

  在http://eclipsecolorthemes.org/网站上有很多现成的Eclipse主题,可以挑选并且修改后拿回来安装。其装过程在其官网上有详细描述。这里使用其插件进行安装。如安装“PyDev”一样,点击Help后“Installnew software”,点击“Add…”。名字写“ColorTheme”,“Location”填写:http://eclipse-color-theme.github.com/update,之后进行默认安装即可,之后是IDE重启。

  在Presences中,依次展开“General”,“Appearance”,“ColorTheme”,然后便可以选择自己喜欢的代码配色了。效果如下

openstack调试方法总结

 

五、进行Eclipse主题美化配置

  下载https://github.com/downloads/rogerdudler/eclipse-ui-themes/com.github.eclipsecolortheme.themes_1.0.0.201207121019.zip包,然后将里面的jar包解压到dropins文件夹,重启IDE即可。然后,在Presences中,依次展开“General”,点击“Appearance”,然后便可以选择自己喜欢的主题了,相较于默认主题,多了“DarkJuno”。选择之,然后效果如下:

openstack调试方法总结

  窗口布局可以自己拖动,当拖动好了之后,可以点击“Windows”=>“SavePerspective As”进行保存。然后命名为自己喜欢的,这里命名为“workstyle”,进行保存。在窗口右上角进行切换窗口布局模式。

六、用Eclipse进行代码动态调试

  在“Debug”,“DebugConfigurations”里面设置运行的参数。如下图:  openstack调试方法总结

 

  在代码段前双击可以设置断点,然后点击debug后便可正常调试程序了。方便之处在于可以监视各种变量内容,以及随时对变量内容进行重新赋值,其界面内容比较华丽。




( http://blog.csdn.net/quqi99 )

1, 对于要远程调试的WSGI web应用中,添加如下代码,其中172.16.1.122是指远程安装eclipse机器的ip地址。
import pydevd
pydevd.settrace('172.16.1.122', 1234, stdoutToServer=False, stderrToServer=False)
若用了monkey_patch的话,记得将thread设置成Flase, eventlet.monkey_patch(os=False, thread=False)

举例, 假如我们要调试nova-compute,可照下列方式启动服务,它将自动做如上设置
nova-compute --remote_debug-host 172.16.1.122 --remote_debug-port 1234

2, eclipse端,首先设置环境变量
import sys
sys.path.append('/bak/java/eclipse/plugins/org.python.pydev_3.1.0.201312121632/pysrc/')
或者:
export PYTHONPATH=/bak/java/eclipse/plugins/org.python.pydev_3.1.0.201312121632/pysrc/:$PYTHONPATH
或者在eclipse工程点右键的属性的PyDev-PYTHONPATH里添加一个External Libraries,方法多得很,都行。

3,eclipse端,其次要保证eclipse端也有同样的代码,如果在不同目录,可以使用修改/bak/java/eclipse/plugins/org.python.pydev_3.1.0.201312121632/pysrc/pydevd_file_utils.py文件:
PATHS_FROM_ECLIPSE_TO_PYTHON = [(r'/bak/openstack', r'/server_side/openstack')]

4, 将远端nova-compute服务启动后(pydevd.settrace之后),在本地的eclipse中进入"Debug"视图后会看到一个“PyDev: start the pydev server"按钮然后点击它,这时候eclipse就和远端连接上了。
   剩下该设置断点设置断点,平时该怎么做就怎么做了。

参考:
http://pydev.org/manual_adv_remote_debugger.html


一 入门IDE
作为python的初学者,在语法和类库学习阶段,我们可以使用以下简单使用的IDE:
1) Python SDK 自带的IDEL(Python GUI)
2) Komodo-Edit
3) NotePad++

 

二 终极IDE 之 Eclipse+PyDev
1 特点
1)开源免费
2)代码完成和调试
3)重构refactor,项目浏览explorer和类库browser
4)目前最新版支持python2.1~3.0,仍不支持最新的3.1

 

2 下载

1)Java JDK(Eclipse运行需要)
2)Python2.5或2.6(目前比较常用且非常稳定,主页:http://python.org/
3)Eclipse (通常下载Eclipse Classic内嵌了Java开发支持,当然也可以下载其他的版本,主页:http://www.eclipse.org/
4)PyDev (主页:http://pydev.org/index.html

 

3 安装

对PyDev和Eclipse分别解压,PyDev解压后一般包含Plugins和Feature文件夹,将PyDev解压后的文件夹拷贝到Eclipse解压后的目录下即可,最后对Eclipse创建快捷方式到桌面,到此我们已经完成了Eclipse+PyDev的安装。安装完成后可以在Eclipse菜单Help->About Eclipse SDK->Installation Detail看到PyDev组件的安装。

openstack调试方法总结

 

4 配置

在Eclipse菜单Windows->Preferences->PyDev->Interpreter python配置你要只用的python解析器。

openstack调试方法总结

 

5 创建project,package和module

在Eclipse菜单File->New->New Project中创建工程如下:

openstack调试方法总结openstack调试方法总结

然后在project explorer中的刚新创建的project的src上右键新建Package,然后在还可以在Package上右键新建module。[怎么找到projectexplorer见后面]如下图:

openstack调试方法总结

6 调试

 打开某个文件,然后Eclipse菜单Run->Debug,如下IDE截图:

openstack调试方法总结

注意:
可以在左下脚的一个按钮来控制所有的view控件的显示,而且可以拖放来控制各个view的布局;
通常的我们需要打开Project explorer,Debug,varabies,outline,console,errorlog,breakpoint等views;
可以在任何的view上方的title区域双击来关闭其他所有的views,例如当要编辑文件时需要关闭其他所有的views,只需要双击file所在的view的上方的title区域;
当想结束调试时,可以在debug view中找到对应的节点右键选择terminate,然后再选择remove all termiated 来删除debug view下不用的堆栈信息;



Remote Debugger

In PyDev you can debug a remote program (a file that is not launched from within Eclipse).

The steps to debug an external program are:

  • Start the remote debugger server
  • Go to the debug perspective
  • Start the external program with the file 'pydevd.py' in its pythonpath
  • Call pydevd.settrace()

Let's see a simple 'step-by-step' example on how this works:

1. Start the remote debugger server: To start the remote debugger server, you have to click the green button pointed by '1' in the image below. After doing that, it will show a message in the console (indicated by '2') to confirm that the server is listening for incoming connections.

Note: Those buttons should be present at the debug perspective and they can be enabled in other perspectives through Window > Customize perspective > Command groups availability > PyDev debug.

openstack调试方法总结

Image: Remote Debugger Server

2. Go to the debug perspective: This is needed because it has no actual 'signal' that it reached a breakpoint when doing remote debugging. So, if you already have it open, just cycle to it withCtrl+F8. Otherwise, go to the menu: window > Open Perspective > Other > Debug.

Note that there should appear a process named 'Debug Server' in the debug view (see '1' in the image below).

openstack调试方法总结

Image: Debug perspective

3. Make sure pydevd.py is in your pythonpath: This file is included in the org.python.pydev plugin. So, you'll have to add it to the pythonpath. It's exact location will depend upon the eclipse location and the plugin version, being something like:

eclipse/plugins/org.python.pydev_x.x.x/pysrc/pydevd.py

(so, the container folder must be in your pythonpath). If you choose to execute it from another machine, you need to copy all the files within that folder to the target machine in order to be able to debug it (if the target machine does not have the same paths as the client machine, the file pydevd_file_utils.py must be edited to properly translate the paths from one machine to the other - see comments on that file).

4. Call pydevd.settrace(): Now that the pydevd.py module is already on your pythonpath, you can use the template provided: 'pydevd' to make the call: import pydevd;pydevd.settrace(). When that call is reached, it will automatically suspend the execution and show the debugger.

openstack调试方法总结

Image: pydevd.settrace called

Django remote debugging with auto-reload

By default, PyDev will add a --noreload flag when creating a Django run configuration, so that it works with the default debugger, but it's also possible to debug an application with auto-reload provided that some steps are followed to enable PyDev support in that case.

To do that, edit the launch that PyDev created (run > run configurations > PyDev Django) and remove the noreload flag and edit your manage.py so that the lines:

#Add pydevd to the PYTHONPATH (may be skipped if that path is already added in the PyDev configurations)
import sys;sys.path.append(r'path_to\pydev\plugins\org.python.pydev\pysrc')

import pydevd
pydevd.patch_django_autoreload(patch_remote_debugger=True, patch_show_console=True)

are added BEFORE the if _name_ == "_main_".

With that change, the breakpoints should be gotten whenever a run is done (note that from now on, launches should only be done in'regular' mode from now on and the debug server must be already started in the Eclipse side).

To disable the debugging, those lines must be removed from manage.py.

An interesting thing to note is that when you kill the 'parent django' process from Eclipse, the subprocesses it created won't be terminated at the same time, but they should be terminated when a code-change is done (in which case the parent process would create a new 'reload process', if it was still alive).

Note that the patch_show_console=True will make a separate window be shown for each process (and not be shown in Eclipse itself) – it has a benefit that you'll be able to stop the process with Ctrl+C in that window and the downside that you won't have the output in the Eclipse console.

Important Notes

NOTE 1: the settrace() function can have an optional parameter to specify the host where the remote debugger is listening. E.g.:pydevd.settrace('10.0.0.1')

NOTE 2: the settrace() function can have optional parameters to specify that all the messages printed to stdout or stderr should be passed to the server to show. E.g.:pydevd.settrace(stdoutToServer=True, stderrToServer=True)

NOTE 3: You can have the running program in one machine and PyDev on another machine, but if the paths are not exactly the same, some adjustments have to be done in the target machine:

Aside from passing the files in eclipse/plugins/org.python.pydev_x.x.x/pysrc to your target machine, the filepydevd_file_utils.py must be edited to make the path translations from the client machine to the server machine and vice-versa. See the comments on that file for detailed instructions on setting the path translations.


pydevd路径:

/usr/share/eclipse/dropins/pydev/eclipse/plugins/org.python.pydev_2.7.1.2012100913