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

11 投票
4 回答
12326 浏览
提问于 2025-04-18 07:30

基础知识:

  • 我有一个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”,所以我本来期待它能启动。当我尝试访问远程服务器的页面时,我得到“未连接”的提示,所以显然网络服务器还没有运行(如果我用curl http://<远程服务器域名>:8000,我得到curl: (7) Failed connect to <远程服务器域名>: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端口开启了端口转发(我测试过一个节点服务器连接到4000端口,当我从远程服务器用wget访问它时,运行得很好)。

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

谢谢你的帮助。

4 个回答

0

我需要关闭自动重载功能来解决这个问题:

./manage.py runserver --noreload
2

对我来说,去掉 suspend=False 这个参数就解决了问题。

文档上说 @param suspend: 是否在这个函数被调用时立即模拟一个断点。

如果你把这个参数留着,程序会连接上,但不会考虑这个断点。你基本上应该使用另一个 pydevd.settrace('ip.addr') -> 注意没有 suspend

3

我也遇到过同样的问题,后来通过在“查看断点”窗口里关闭所有的Python异常断点来“解决”了这个问题。

6

为了帮助未来的搜索者……我成功地实现了远程调试,但不是通过这种方法。我刚在pycharm论坛上回答了一个类似的问题,所以想把我用的有效方法更新到这个问题中。

  1. 首先,去“PyCharm/Preferences/Project Interpreter”。
    • 在对话框的顶部,你会看到一个选项,可以选择使用哪个Python解释器。旁边有一个齿轮图标。如果你点击这个齿轮图标,会看到一个“添加远程”的选项……你需要提供SSH的凭证(或者SSH密钥的路径)和远程服务器上Python解释器的安装路径(比如,/usr/local/bin/python)。
    • 另外,我的“pycharm helpers路径”是(/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. 此外,设置部署确认也是个好主意,这样你可以右键点击上传文件的新版本(在“Tools / Deployment / Configurations...”下)。

    • 创建一个新的配置,在连接部分只需使用SSH凭证或密钥路径。
    • 在映射标签中,路径和你为远程服务器设置的路径映射是一样的。
    • 对我来说,“服务器上的Web路径”就是“/”。创建后,你应该可以右键点击任何文件/目录并选择“上传到...”。注意,对于初次上传,我只是用scp把一个tar.gz文件上传到服务器上以节省时间,之后在调试期间的更改我才通过部署配置上传。

我已经愉快地使用这个方法进行远程调试大约4个月了,所以它运行得很好。

撰写回答