无法在Google App Engine中调试dev_appserver

时间:2013-04-22 14:36:48

标签: google-app-engine pydev

我认为这个问题不是PyDev独有的,而是任何python调试器。

使用Eclipse和pydev,我无法在dev_appserver(Google应用引擎开发服务器)进程中打破我的WSGI处理程序。我不是百分百肯定,但我认为这是GAE 1.7.6或1.7.7的回归,因为我几乎可以肯定我能够在升级到1.7.7之前调试我的代码

似乎GAE创建了一个不受PyDev控制的新进程('_python_runtime.py')。我找不到PyDev中有“调试子进程”功能的任何证据,所以现在我有点迷失了。

查看GAE代码(1.7.7),看来子进程是在tools / devappserver2 / http_runtime.py中创建的,它调用了safe_subprocess.py/start_process

到处闲逛我没有看到任何明显的方法: 1.从同一进程告诉GAE服务器到用户处理程序。 2.告诉GAE将新项目的命令行从python _python_runtime.py更改为python pydev.py ... --file _python_runtime.py(即便如此,不确定PyDev是否能够将其取出)。

有什么建议吗?这真的是回归吗?

编辑(部分答案):
这是部分答案。在SDK 1.7.6中,Google App Engine有一个全新的服务器。服务器现在是一个多进程。主进程生成子进程(称为运行时)以运行WSGI处理程序。这些子流程未被调试。

这种变化在社区中引起了很多反响,但显然GAE社区主要存在于Google网上论坛而不是SO中(直到昨天才知道这一点)。以下是讨论的链接:

https://groups.google.com/forum/?fromgroups=#!topic/google-appengine/ep5BWYKpQpU

基本上有两种解决方案:

  1. 简单的做法是使用旧的服务器,从1.7.7开始仍然可用。而不是dev_appserver.py,只需启动old_dev_appserver.py即可。在Eclipse PyDev中,转到Debug Configuration ...,并将'Main Module'替换为$(GOOGLE_APP_ENGINE)/old_dev_appserver.py,并启动,好像新服务器从未发生过一样。这个解决方案显然具有运行旧服务器的缺点,并且不知道该设置将保持多长时间。

  2. 第二个解决方案涉及的更多一点,我还没有完全破解它。它基于PyDev的远程调试功能,并能够告诉GAE在运行时进程开始时运行脚本。所以这是怎么做的:

    1. 创建一个脚本并将其命名为:gae_runtime_startup.py。 Put在某处(下方)。
    2. 在全局PyDev首选项(窗口菜单 - >首选项 - > PyDev - >解释器Python - >字符串替换变量中,添加一个新的PYDEV变量,并将值设置为eclipse的PyDev插件(在我的计算机中)这是c:\ eclipse \ plugins \ org.python.pydev_2.7.1.2012100913)。
    3. 在项目属性中,将$ {PYDEV} / pysrc添加到PYTHONPATH。这样,你就可以进入pydevd
    4. 你需要告诉GAE运行gae_runtime_startup.py。转到Launcher,并将以下选项添加到命令行(Debug Configurations - > Arguments): - python_startup_script =< full path> /gae_runtime_startup.py --max_server_instances = 1
    5. 启动PyDev远程服务器。

    所以,在完成所有这些之后,我在运行时进程上运行的runtime_startup.py中获得了一个断点。如果我上堆栈,我将进入runtime.py源代码 - 所以我认为我正朝着正确的方向前进。然而,我在处理程序中设置的断点不会中断 - 所以这条路线仍然被阻挡。任何帮助将不胜感激。
  3. # gae_runtime_startup.py
    import pydevd; 
    pydevd.settrace()
    

    一些相关链接:

  4. Google小组讨论:https://code.google.com/p/appengine-devappserver2-experiment/issues/detail?id=28
  5. Google解释如何调试的文档(我的第二种方法):https://docs.google.com/a/london.org.il/document/d/1CCSaRiIWCLgbD3OwmuKsRoHHDfBffbROWyVWWL0ZXN4/edit
  6. PyDev的一个文档,解释了如何设置远程调试器。 http://pydev.org/manual_adv_remote_debugger.html
  7. 另见@Tim Hoffman的优秀评论。

1 个答案:

答案 0 :(得分:2)

这确实是在1.8.3中修复的回归:https://code.google.com/p/googleappengine/wiki/SdkReleaseNotes