Jak uruchomić zdalne debugowanie za pomocą PyCharm?

Próbuję uzyskać debugowanie pomiędzy PyCharm (na Hostie windows) a wirtualnym hostem Debiana z moją aplikacją django. Instrukcje mówią, aby zainstalować jajko, dodać import, a następnie wywołać polecenie. Zakładam, że te rzeczy muszą być zrobione na hoście Debiana?

Ok, więc w jakim pliku powinienem umieścić te dwie linie?

from pydev import pydevd
pydevd.settrace('not.local', port=21000, stdoutToServer=True, stderrToServer=True)

Próbowałem umieścić go w settings.py ale mam takie rzeczy...

File "/django/conf/__init__.py", line 87, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
File "/django/utils/importlib.py", line 35, in import_module
    __import__(name)
File "/settings.py", line 10, in <module>
    pydevd.settrace('dan.local', port=21000, stdoutToServer=True, stderrToServer=True)
File "/pycharm-debug.egg/pydev/pydevd.py", line 1079, in settrace
    debugger.connect(host, port)
File "/pycharm-debug.egg/pydev/pydevd.py", line 241, in connect
    s = StartClient(host, port)
File "/pycharm-debug.egg/pydev/pydevd_comm.py", line 362, in StartClient
    sys.exit(1)
SystemExit: 1

Podczas gdy pycharm siedział tam " czekając na połączenie "

Author: RichVel, 2011-08-09

3 answers

PyCharm (lub Twoje ide z wyboru) działa jako "serwer", a Twoja aplikacja jest "klientem"; więc najpierw uruchom serwer - powiedz IDE, aby 'debug' - a następnie uruchom klienta - który jest kodem z settrace Instrukcja w nim. Gdy twój kod Pythona trafi w settrace, łączy się z serwerem pycharm i zaczyna podawać mu dane debugowania.

Aby tak się stało:

1. skopiuj bibliotekę pydev do zdalnej maszyny

Więc musiałem skopiować plik z C:\Program Files\JetBrains\PyCharm 1.5.3\pycharm-debug.egg do mojej maszyny z Linuksem. I put it at /home/john/api-dependancies/pycharm-debug.egg

2. Umieścić jajko w PYTHONPATH

Mam nadzieję, że docenisz, że nie będziesz w stanie użyć jajka, dopóki python go nie znajdzie. Myślę, że większość ludzi używa easy_install, ale w moim przypadku dodałem go wyraźnie, umieszczając to:

   import sys
   sys.path.append('/home/john/app-dependancies/pycharm-debug.egg')
Jest to konieczne tylko dlatego, że wciąż nie udało mi się zainstalować jajka. To moje obejście.

3. konfiguracja serwera debugowania config

W PyCharm można skonfigurować serwer debugowania poprzez:

  • Run-> Edytuj konfiguracje : otwiera okno dialogowe "Uruchom/Debuguj konfiguracje"
  • Defaults - > "Python Remote Debug": jest szablonem do użycia
  • wypełnij nazwę lokalnego hosta i portu, a prawdopodobnie będziesz chciał "użyć mapowania ścieżek", ale więcej na ten temat poniżej...
  • "OK"

    Nazwa lokalnego hosta : oznacza nazwę Serwer - w moim przypadku jest to maszyna hostująca windows - a właściwie adres IP komputera hostującego windows, ponieważ nazwa hosta nie jest znana mojej maszynie zdalnej. Tak więc wirtualna (zdalna) maszyna musi być w stanie dotrzeć do hosta. ping i netstat są do tego dobre.

    Port: Może być dowolnym wolnym portem, który lubisz. eg: 21000 jest mało prawdopodobne, aby być w użyciu.

    Na razie nie martw się mapowaniem ścieżki.

4. Start the debug server

  • Run-> Debug : uruchom serwer debugowania-wybierz konfigurację, którą właśnie utworzyłeś.

Pojawi się zakładka debug console i powinieneś otrzymać

 Starting debug server at port 21000

W konsoli, co oznacza, że serwer debugowania ide czeka, aż Twój kod otworzy połączenie z nim.

5. Wstaw kod

To działa wewnątrz testu jednostkowego:

from django.test import TestCase
class APITestCase(TestCase):
    def test_remote_debug(self):
        import sys
        sys.path.append('/home/john/dependancies/pycharm-debug.egg')
        from pydev import pydevd
        pydevd.settrace('192.168.33.1', port=21000, suspend=False)

        print "foo"

A w aplikacji internetowej django to trochę wybredny co do tego gdzie go umieściłeś - wydaje się działać dopiero po wszystkim innym:

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
    from django.core.management import execute_from_command_line
    execute_from_command_line(sys.argv)

    sys.path.append('/vagrant/pycharm-debug.egg')
    import pydevd
    pydevd.settrace('192.168.33.1', port=21000, suspend=False)

Ponownie, że adres IP to pole, na którym uruchamiasz Pycharm; powinieneś być w stanie pingować ten adres ip z pola uruchamiającego Twój kod/stronę internetową. Port jest twoim wyborem, po prostu upewnij się, że powiedziałeś pycharm, aby nasłuchiwał na tym samym porcie. I znalazłem suspend=False mniej problematyczne niż domyślne, nie tylko natychmiast zatrzymuje się, więc nie jesteś pewien, czy to działa, ale także próbuje streamować na stdin / out, co może również przysporzyć ci smutku.

6. Otwórz firewall

Zapora systemu Windows 7 domyślnie blokuje połączenie przychodzące. Używając netstat na zdalnym hoście będziesz mógł zobaczyć, że SYN_SENT nigdy nie zostanie ustanowiony, przynajmniej dopóki nie dodasz wyjątku Do Zapory systemu windows dla aplikacji "pycharm".

OS / X i Ubuntu nie mają firewalli do dziurkowania (domyślnie ktoś mógł zastosować później).

7. Ustaw punkt przerwania i uruchom kod

Po tym wszystkim, kiedy wszystko pójdzie zgodnie z planem, możesz ustawić punkt przerwania-gdzieś po uruchomieniu settrace - i konsola pycharm pokaże

Connected to pydev debugger (build 107.386)

I w zakładce 'Debugger' stos zmiennych zacznie działać i możesz przejść przez kod.

8. Mappings

Mapowanie informuje pycharm, gdzie może znaleźć kod źródłowy. Więc kiedy debugger mówi "uruchamiam linię 393 plików /foo/bar/nang.py Pycharm może przetłumaczyć tę odległą ścieżkę absolutną na absolutną ścieżkę lokalną... i pokaże Ci kod źródłowy.

/Users/john/code/app/    /opt/bestprice/app/
/Users/john/code/master/lib    /opt/bestprice/lib/python2.7/site-packages
Zrobione.
 97
Author: John Mee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-14 04:11:38

To tylko notatka , ale zawiera pewne informacje, które mogą zaoszczędzić wiele godzin.

  1. Teraz pip install pydevd pracował dla mnie zarówno na ubuntu i centos 6
  2. Jeśli chcesz naprawdę debugować zdalny serwer, który stoi za firewallami i takimi tam, możesz użyć następującej sztuczki:

Ssh-r 8081: localhost: 8081 [email protected]

Pozwala to na zdalne połączenie kodu z Twoim komputerem nasłuchującym na localhost:8081

  1. If remote debugger nie chce się uruchamiać, mówiąc, że nie może znaleźć portu gniazda, sprawdź reguły zapory. Zauważ, że reguła z "127.0.0.1" nie jest taka sama jak"localhost".
 7
Author: Sergey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-16 15:28:43

Wydaje się, że z jakiegoś powodu debugger nie mógł połączyć się z hostem windows za pomocą PyCharm. Nie masz innych wiadomości w stderr? Jeśli nie, spróbuj uruchomić go jeszcze raz, ale za pomocą sterrToServer = false. To może pokazać prawdziwy powód, dla którego się nie łączy.

 1
Author: Dmitry Trofimov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-10 17:17:48