Удаленная отладка PyCharm - подключается, но не может запускать отладку

Основы:

  • У меня есть проект 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...
    
  • На удаленном сервере я поместил соответствующий вызов в pycharm-debug.egg в __init__.py (но я тоже попытался поместить его в другие места в коде).

  • Я запускаю удаленный сервер, как этот python manage.py runserver <remote domain name>:8000 а на локальном IDE/отладчике pycharm я вижу:

    "Connected to pydev debugger (build 133.1347)"
    
  • После этого вещи просто сидят там... Я не получаю никакой обратной связи о том, где выполняется, и нет возможности в IDE pycharm "запускать/продолжать/запускать" что угодно.

  • На удаленном сервере, если я <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://<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)
    
  • Локальная среда 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)
    

Другие примечания:

  • Я пробовал это как с виртуальным сервером, так и без него на удаленном сервере.
  • Я запускаю локальную среду разработки pycharm за обычным маршрутизатором кабельного модема Comcast с переадресацией портов для подключения порта 4000 (и протестировал это с помощью сервера узлов, подключенного к порту 4000, который отлично работал, когда я сделал wget против него с моего удаленного сервера).

Я в недоумении о том, как "поднять" что угодно, чтобы заставить все работать и позволить мне начать отладку.

Спасибо, что пытались помочь.

Ответы

Ответ 1

Для будущих гуглеров... Я смог получить удалённую отладку, но не с помощью этого метода. Я просто ответил на подобный вопрос об этом на форумах pycharm, поэтому подумал, что обновляю этот вопрос с помощью метода, который работал для меня.

  1. Перейдите в "PyCharm/Preferences/Project Interpreter".
    • Вы увидите вариант выбора интерпретатора python в верхней части диалогового окна. Рядом находится значок шестеренки. Если вы нажмете на значок шестеренки, вы увидите вариант "Добавить удаленный доступ"... вы дадите ему учетные данные ssh (или путь к ssh-ключам) и путь туда, где ваш интерпретатор python установлен на удаленном сервере (т.е., /usr/local/bin/python).
    • Кроме того, для меня "путь помощников pycharm" был (/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> в удаленный /Users/JohnQ/<xyz>/<appdir>=/home/<username>/<xyz>/<appdir> (т. /Users/JohnQ/<xyz>/<appdir>=/home/<username>/<xyz>/<appdir>).

    • Поскольку мне нужны другие сторонние серверы (например, FB и т.д.), Чтобы иметь возможность ударить по этому серверу с помощью HTTPS, я использовал "stunnel" на удаленном сервере - его было довольно легко настроить).

  3. В дополнение к этому, удобная задача - установить подтверждение развертывания, чтобы вы могли просто щелкнуть правой кнопкой мыши, чтобы загрузить более новые версии вашего файла (в разделе "Инструменты/Развертывание/Конфигурации...").

    • Создайте новый, и при подключении используйте только ssh-кредиты или путь к вашим ключам.
    • На вкладке сопоставлений пути такие же, как и для сопоставлений пути для настройки удаленного сервера.
    • "Веб-путь на сервере" был для меня " / ". После его создания вы можете просто щелкнуть правой кнопкой мыши по любому файлу/директории и выбрать "Загрузить в...". Обратите внимание, что для начальной загрузки я просто scp'd tar.gz до моего сервера, чтобы сэкономить время, и я только загружаю через конфигурацию развертывания изменения, которые я делаю во время отладки.

Я с удовольствием использовал это для удаленной отладки для ~ 4 мс, поэтому он отлично работает.

Ответ 2

У меня были те же симптомы и "исправлены", отключив все точки останова исключения Python в окне "Просмотр точек останова".

Ответ 3

Для меня это suspend=False параметр suspend=False.

Документы говорят, что @param suspend: whether a breakpoint should be emulated as soon as this function is called. ,

Если вы позволите ему туда, он соединяется, но не рассматривает точку останова. Затем вы должны в основном использовать другой pydevd.settrace('ip.addr') → уведомление о suspend

Ответ 4

Мне пришлось отключить автоперегрузчик, чтобы исправить это:

./manage.py runserver --noreload