【问题标题】:PyCharm remote debugging - connects but can't start debuggingPyCharm 远程调试 - 连接但无法开始调试
【发布时间】:2014-07-14 02:57:40
【问题描述】:

基础知识:

  • 我有一个运行良好的 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 &lt;remote domain name&gt;:8000 启动远程服务器并在本地 pycharm IDE/调试器上看到:

    "Connected to pydev debugger (build 133.1347)"
    
  • 在此之后,事情就在那里......我没有得到任何关于执行位置的反馈,并且 pycharm IDE 中无法“启动/继续/运行”任何东西。

    李>
  • 如果我在远程服务器上&lt;ctrl-c&gt; 它,我看到了:

    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”,所以我预计它会启动。当我尝试针对远程服务器调出一个页面时,我得到“未连接”,因此 Web 服务器显然还没有运行(如果curl http://&lt;remote server domain&gt;:8000 我得到curl: (7) Failed connect to &lt;remote server domain&gt;:8000; Connection refused)。如果没有远程调试,这可以在我的本地开发机器或远程服务器上正常运行。

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

详情:

  • 在运行代码/进程的远程服务器上,我想在 main __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 的端口转发(并使用连接到端口 4000 的节点服务器对此进行了测试,当我从我的远程服务器)。

我不知道如何“碰撞”任何东西以使事情运行并让我开始调试。

感谢您的帮助。

【问题讨论】:

  • 有时,pycharm 只需要重启...真的。
  • 嘿,是的……也试过几次。 :)
  • 您是否也删除了suspend=False?明确表示不要设置断点(检查我的答案)
  • 我无法在远程服务器上明确使用 pydevd 解决这个问题。相反,我改变了方向并通过 SSH 隧道使用远程调试,结果工作正常(相当宽慰)。
  • 您的 python_remote_debug 配置可能有问题。

标签: python django remote-debugging


【解决方案1】:

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

./manage.py runserver --noreload

【讨论】:

    【解决方案2】:

    对于未来的谷歌人......我能够进行远程调试,但不是通过这种方法。我刚刚在 pycharm 论坛上回答了一个类似的问题,所以我想用对我有用的方法来更新这个问题。

    1. 转到“PyCharm/首选项/项目解释器”。
      • 您将在对话框顶部看到一个选项,用于选择哪个 Python 解释器。旁边是一个齿轮图标。如果你点击齿轮图标,你会看到一个“添加远程”选项......你给它 ssh 凭据(或 ssh 密钥的路径)和你的 python 解释器安装在远程服务器上的路径(即,/usr/local/bin/python)。
      • 此外,我的“pycharm 助手路径”是(/home/&lt;username&gt;/.pycharm_helpers — 我不记得这是不是自动创建的)。
    2. 转到“运行/编辑配置...”并添加一个“Django 服务器”(加号在对话框的左上方)。

      • 选择您的新远程 python 解释器作为要使用的解释器(它应该显示在选项的下拉列表中)。
      • 在“环境变量”部分,我需要指定我的主应用设置文件(即DJANGO_SETTINGS_MODULE = &lt;app&gt;/settings.py)。为了我的目的,我还需要设置HTTPS=1
      • 将工作目录设置为 django 项目在远程服务器上的任何位置(即/home/&lt;username&gt;/&lt;xyz&gt;/&lt;appdir&gt;)。
      • 设置从本地目录到远程目录的路径映射(即/Users/JohnQ/&lt;xyz&gt;/&lt;appdir&gt;=/home/&lt;username&gt;/&lt;xyz&gt;/&lt;appdir&gt;)。

      • 因为我需要其他 3rd 方服务器(如 FB 等)才能使用 HTTPS 访问此服务器,所以我在远程服务器上使用了“stunnel”——它很容易设置)。

    3. 除此之外,还有一件方便的事情是设置部署确认,以便您只需右键单击即可上传文件的较新版本(在“工具/部署/配置...”下)。

      • 创建一个新的并在连接下使用 ssh 凭据或密钥路径。
      • 在映射选项卡中,路径与您为远程服务器设置的路径映射所做的相同。
      • “服务器上的 Web 路径”对我来说只是“/”。创建后,您应该能够右键单击任何文件/目录并选择“上传到...”。请注意,对于初始上传,我只是将 tar.gz scp'd 到我的服务器以节省时间,并且我只通过部署配置上传我在调试期间所做的更改。

    大约 4 个月以来,我一直很高兴地使用它进行远程调试,所以它工作正常。

    【讨论】:

    • 不错的编辑!这将更容易理解。 :)
    • 注意:在第二部分,当你创建一个新的 Django 服务器时,你忘了提到 Host 。您需要为其添加远程服务器 IP 才能使其正常工作。
    【解决方案3】:

    我有同样的症状,并通过关闭 View Breakpoints 窗口中的所有 Python Exception 断点来“修复”它。

    【讨论】:

    • 这听起来可能会奏效。我已经完全切换到通过 ssh 进行远程调试,所以当我有机会再试一次时,我会测试一下。如果它有效,我会回来选择这个作为答案(不过可能需要一段时间)。
    【解决方案4】:

    对我来说,删除 suspend=False 参数就可以了。

    文档说@param suspend: whether a breakpoint should be emulated as soon as this function is called.

    如果你让它在那里,它正在连接,但不考虑断点。然后你应该基本上使用另一个pydevd.settrace('ip.addr') ->notice no suspend

    【讨论】:

    • 很遗憾,这对我没有用。
    猜你喜欢
    • 2015-11-28
    • 2017-07-19
    • 2014-02-02
    • 2017-04-15
    • 2018-08-19
    • 2013-04-12
    • 1970-01-01
    • 2018-07-01
    • 2023-03-06
    相关资源
    最近更新 更多