PyCharm远程调试-连接成功但无法开始调试

11

基础知识:

  • 我有一个 Django 项目,它在本地和远程服务器上都可以正常运行。
  • 我使用“远程调试”配置文件在本地启动 PyCharm,一切看起来很好。

Starting debug server at port 4000
Use the following code to connect to the debugger:
import pydevd
pydevd.settrace('<my local machines public ip addr>', port=4000, suspend=False)
Waiting for connection...
  • 在远程服务器上,我在__init__.py中放置了对pycharm-debug.egg的适当调用(但我也尝试将其放置在代码的其他位置)。

  • 我这样启动远程服务器:python manage.py runserver <远程域名>:8000,在本地的PyCharm IDE/调试器中看到:

  • "Connected to pydev debugger (build 133.1347)"
    
  • 之后,事情就只是停在那里了... 我没有得到任何有关执行进度的反馈,在 PyCharm IDE 中也无法 "开始/继续/运行" 任何东西。

  • 在远程服务器上如果我按下<ctrl-c>,我会看到:

  • File "/<path here>/pycharm-debug.egg/pydevd.py", line 1256, in settrace
    File "/<path here>/pycharm-debug.egg/pydevd.py", line 1305, in _locked_settrace
    

    我猜测所有连接都已正确连接,但我没有看到任何启动一切运行的方法。我已经设置了 "suspend=False",所以我本应该期望它会开始运行。当我尝试访问远程服务器上的页面时,我得到了 "not connected" 的提示,因此网页服务器显然还没有运行(如果 curl http://<remote server domain>:8000,我会得到curl:(7) Failed connect to <remote server domain>:8000; Connection refused)。在没有远程调试的情况下,在我的本地开发机器或远程服务器上运行都很好。

    我做错了什么?:) 谢谢!

    细节:

    • 在承载要调试的代码/进程的远程服务器上的主要 __init__.py 中,我有:

    import os
    import sys
    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    sys.path.append(BASE_DIR + '/pycharm-debug.egg')
    import pydevd
    pydevd.settrace('<my local machines public ip addr>', port=4000, suspend=False)
    
  • 本地的PyCharm IDE 显示如下:

    Starting debug server at port 4000
    Use the following code to connect to the debugger:
    import pydevd
    pydevd.settrace('localhost', port=4000, suspend=False)  (tried with <public ip addr> for this, too.
    Waiting for connection...
    ---- and then, after I start the remote server process: ----
    Connected to pydev debugger (build 133.1347)
    
  • 其他说明:

    • 我已经在远程服务器上尝试过使用和不使用virtualenv,均无法运行。
    • 我正在普通的 Comcast 电缆调制解调器路由器后面运行本地的 PyCharm IDE,并打开了端口转发以将端口4000转发到我的本地机器(并在我从远程服务器对其进行wget时测试成功地将一个节点服务器附加到端口4000)。

    我不知道如何“推动”任何东西来使它们运行,并让我开始调试。

    感谢您的帮助。


    有时候,PyCharm 只需要重新启动...真的。 - vlad-ardelean
    嘿,是的...我也试过几次。 :) - John Q
    你也删除了suspend=False吗?这明确表示不设置断点(请检查我的答案)。 - vlad-ardelean
    我无法通过在远程服务器上显式使用pydevd来解决这个问题。相反,我改变了方向,使用SSH隧道进行远程调试,最终成功解决了问题(非常令人宽慰)。 - John Q
    你可能会在python_remote_debug配置方面遇到问题。 - Celik
    4个回答

    6
    对于未来的谷歌用户...我能够使远程调试工作,但不是通过这种方法。我在pycharm论坛上回答了一个类似的问题,所以我想用那个对我有效的方法更新这个问题。
    1.转到“PyCharm/Preferences/Project Interpreter”。
    - 你会看到一个选项,在对话框的顶部选择哪个python解释器。在其旁边是一个齿轮图标。如果你点击齿轮图标,你会看到一个选项“添加远程”......你给它ssh凭证(或ssh密钥的路径)和远程服务器上安装Python解释器的路径(即/usr/local/bin/python)。 - 另外,对我而言,“pycharm helpers path”是(/home/<username>/.pycharm_helpers — 我记不清是否自动创建了这个文件夹)。
    2.转到“Run / Edit Configurations...”并添加一个“Django Server”(对话框左上角的加号)。
    - 将你的新远程python解释器选择为要使用的解释器(它应该出现在下拉列表中)。 - 在“env vars”部分中,我需要指定我的主应用程序设置文件(即DJANGO_SETTINGS_MODULE = <app>/settings.py)。对于我的目的,我还需要设置HTTPS=1。 - 将工作目录设置为远程服务器上Django项目所在的位置(即/home/<username>/<xyz>/<appdir>)。 - 将本地目录与远程目录的路径映射设置(即/Users/JohnQ/<xyz>/<appdir>=/home/<username>/<xyz>/<appdir>)。 - 因为我需要其他第三方服务器(如FB等)能够使用HTTPS访问此服务器,所以我在我的远程服务器上使用了“stunnel”——这很容易设置。
    3.除此之外,还有一个便利的事情要做,那就是设置部署确认,这样你就可以右键单击上传文件的新版本(在“工具/部署/配置...”下)。
    - 创建一个新的,在连接下只使用ssh凭证或路径到你的密钥。 - 在映射选项卡中,路径与你为远程服务器设置的路径映射相同。 - “服务器上的Web路径”对我来说只是“/”。创建后,你应该能够右键单击任何文件/目录并选择“上传到...”。请注意,对于初始上传,我只是将tar.gz通过scp上传到我的服务器上以节省时间,而且我只通过部署配置上传调试期间进行的更改。

    我已经使用这个远程调试工具大约4个月了,一切正常。


    不错的编辑!这样会更易懂。 :) - John Q
    注意:在第二部分中,当您创建一个新的Django服务器时,您忘记提到主机。您需要添加远程服务器IP才能使其正常工作。 - aldoblack

    3

    我曾经也有过同样的症状,并通过在“查看断点”窗口中关闭所有Python 异常断点来“修复”它。


    听起来可能会有帮助。我已经完全切换到通过 ssh 进行远程调试,所以等我有机会再试一下,我会测试一下这个。如果它有效的话,我会回来选择这个作为答案(可能需要一段时间)。 - John Q

    2

    对于我来说,去掉 suspend=False 参数就可以了。

    文档中说道:@param suspend: 是否在此函数被调用时立即模拟断点。

    如果你让它存在那里,它会连接,但不考虑断点。那么你基本上应该使用另一个 pydevd.settrace('ip.addr') -> 注意没有 suspend


    不幸的是,对我来说这不起作用。 - John Q

    0

    我不得不禁用自动重新加载器来解决这个问题:

    ./manage.py runserver --noreload
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接