我认为这个问题不是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.7.7开始仍然可用。而不是dev_appserver.py,只需启动old_dev_appserver.py即可。在Eclipse PyDev中,转到Debug Configuration ...,并将'Main Module'替换为$(GOOGLE_APP_ENGINE)/old_dev_appserver.py,并启动,好像新服务器从未发生过一样。这个解决方案显然具有运行旧服务器的缺点,并且不知道该设置将保持多长时间。
第二个解决方案涉及的更多一点,我还没有完全破解它。它基于PyDev的远程调试功能,并能够告诉GAE在运行时进程开始时运行脚本。所以这是怎么做的:
所以,在完成所有这些之后,我在运行时进程上运行的runtime_startup.py中获得了一个断点。如果我上堆栈,我将进入runtime.py源代码 - 所以我认为我正朝着正确的方向前进。然而,我在处理程序中设置的断点不会中断 - 所以这条路线仍然被阻挡。任何帮助将不胜感激。
# gae_runtime_startup.py
import pydevd;
pydevd.settrace()
一些相关链接:
答案 0 :(得分:2)
这确实是在1.8.3中修复的回归:https://code.google.com/p/googleappengine/wiki/SdkReleaseNotes。