Udostępnij za pośrednictwem


Zdalne debugowanie kodu języka Python w systemie Linux w programie Visual Studio

W tym artykule dowiesz się, jak skonfigurować instalację programu Visual Studio w celu obsługi debugowania kodu języka Python na zdalnych komputerach z systemem Linux. Ten przewodnik jest oparty na programie Visual Studio 2019 w wersji 16.6.

Program Visual Studio może uruchamiać i debugować aplikacje języka Python lokalnie i zdalnie na komputerze z systemem Windows. Program Visual Studio obsługuje również zdalne debugowanie w innym systemie operacyjnym, urządzeniu lub implementacji języka Python innym niż CPython przy użyciu biblioteki debugpy .

Program Visual Studio 2019 w wersji 16.4 lub starszej używa biblioteki ptvsd. W programie Visual Studio 2019 w wersji 16.5 lub nowszej biblioteka debugpy zastępuje ptvsd. Podczas korzystania z debugpy, debugowany kod Pythona hostuje serwer debugowania, do którego może dołączać program Visual Studio. Ten hosting wymaga niewielkiej modyfikacji kodu w celu zaimportowania i włączenia serwera. Może być również konieczne dostosowanie konfiguracji sieci lub zapory na komputerze zdalnym w celu zezwolenia na połączenia TCP.

Warunki wstępne

  • Program Visual Studio zainstalowany z obsługą obciążeń języka Python. Aby uzyskać więcej informacji, zobacz Instalowanie obsługi języka Python w programie Visual Studio.

  • Komputer zdalny z językiem Python w systemie operacyjnym, na przykład macOS lub Linux.

  • Port 5678 (przychodzący) jest otwarty w zaporze ogniowej komputera zdalnego, co jest domyślnym ustawieniem do debugowania zdalnego.

Konfigurowanie komputera z systemem Linux

Możesz łatwo utworzyć maszynę wirtualną z systemem Linux na platformie Azure i uzyskać do niej dostęp przy użyciu pulpitu zdalnego z systemu Windows. System Ubuntu dla maszyny wirtualnej jest wygodny, ponieważ język Python jest instalowany domyślnie. Jeśli masz inną konfigurację, zobacz Instalowanie interpreterów języka Python dla innych lokalizacji pobierania języka Python.

Konfigurowanie zapory

Aby obsługiwać zdalne debugowanie, port przychodzący 5678 musi być otwarty w zaporze komputera zdalnego.

Aby uzyskać szczegółowe informacje na temat tworzenia reguły zapory dla maszyny wirtualnej platformy Azure, zobacz następujące artykuły:

Przygotowywanie skryptu do debugowania

Wykonaj następujące kroki, aby przygotować skrypt do debugowania kodu w języku Python w systemie Linux.

  1. Na komputerze zdalnym utwórz plik w języku Python o nazwie guessing-game.py przy użyciu następującego kodu:

    import random
    
    guesses_made = 0
    name = input('Hello! What is your name?\n')
    number = random.randint(1, 20)
    print('Well, {0}, I am thinking of a number between 1 and 20.'.format(name))
    
    while guesses_made < 6:
        guess = int(input('Take a guess: '))
        guesses_made += 1
        if guess < number:
            print('Your guess is too low.')
        if guess > number:
            print('Your guess is too high.')
        if guess == number:
            break
    if guess == number:
        print('Good job, {0}! You guessed my number in {1} guesses!'.format(name, guesses_made))
    else:
        print('Nope. The number I was thinking of was {0}'.format(number))
    
  2. Zainstaluj pakiet debugpy w środowisku przy użyciu polecenia pip3 install debugpy.

    Notatka

    Dobrym pomysłem jest zarejestrowanie wersji debugpy zainstalowanej w przypadku, gdy będzie potrzebny do rozwiązywania problemów. Lista debugpy również zawiera dostępne wersje.

  3. Włącz debugowanie zdalne, dodając następujący kod w górnej części pliku guessing-game.py przed innym kodem. (Chociaż nie jest to ścisłe wymaganie, nie można debugować żadnych wątków w tle utworzonych przed wywołaniem funkcji listen).

    import debugpy
    debugpy.listen(('0.0.0.0', 5678))
    
  4. Zapisz plik i uruchom program:

    python3 guessing-game.py
    

    Wywołanie funkcji listen działa w tle i czeka na połączenia przychodzące podczas interakcji z programem. W razie potrzeby można wywołać funkcję wait_for_client po wywołaniu funkcji listen, aby zablokować program do momentu dołączenia debugera.

Napiwek

Oprócz funkcji listen i wait_for_client debugpy udostępnia również funkcję pomocnika breakpoint. Ta funkcja służy jako programowy punkt przerwania, jeśli debuger jest dołączony. Inna funkcja, is_client_connected1, zwraca True, jeśli debuger jest dołączony. Nie musisz sprawdzać tego wyniku przed wywołaniem innych funkcji debugpy.

Dołączanie zdalnie z narzędzi języka Python

W poniższych krokach pokazano, jak ustawić punkt przerwania, aby zatrzymać proces zdalny.

  1. Utwórz kopię pliku zdalnego na komputerze lokalnym i otwórz go w programie Visual Studio. Nie ma znaczenia, gdzie znajduje się plik, ale jego nazwa powinna być zgodna z nazwą skryptu na komputerze zdalnym.

  2. (Opcjonalnie) Aby mieć funkcję IntelliSense dla debugpy na komputerze lokalnym, zainstaluj pakiet debugpy w środowisku języka Python.

  3. Wybierz pozycję Debuguj>Dołącz do procesu.

  4. W oknie dialogowym Dołącz do procesu ustaw typ połączenia na Python remote (debugpy).

  5. W polu celu połączenia wprowadź polecenie tcp://<ip_address>:5678.

    • tcp:// określa typ połączenia jako protokół TCP (Transmission Control Protocol).
    • <ip_address> jest adresem IP komputera zdalnego, który może być jawnym adresem lub nazwą taką jak myvm.cloudapp.net.
    • :5678 to numer portu debugowania zdalnego.
  6. Wybierz pozycję Wprowadź, aby wypełnić listę dostępnych procesów debugowania na tym komputerze:

    Zrzut ekranu przedstawiający sposób wprowadzenia celu połączenia, aby wyświetlić listę dostępnych procesów debugowania.

    Jeśli zdarzy ci się uruchomić inny program na komputerze zdalnym po wypełnieniu tej listy, wybierz przycisk Odśwież.

  7. Wybierz proces do debugowania i wybierz Dołączlub kliknij dwukrotnie proces.

  8. Program Visual Studio przełącza się w tryb debugowania, podczas gdy skrypt nadal działa na komputerze zdalnym, zapewniając wszystkie typowe debugowanie możliwości.

    Możesz ustawić punkt przerwania w wierszu if guess < number:, a następnie przełączyć się na komputer zdalny i wprowadzić kolejne odgadnięcie. Program Visual Studio na komputerze lokalnym zatrzymuje się w punkcie przerwania, wyświetla zmienne lokalne itd.:

    Zrzut ekranu pokazujący, jak program Visual Studio wstrzymuje debugowanie po osiągnięciu punktu przerwania.

  9. Po zatrzymaniu debugowania program Visual Studio odłącza się od programu. Program nadal działa na komputerze zdalnym. debugpy kontynuuje również nasłuchiwanie podczas dołączania debugerów, dzięki czemu można ponownie dołączyć do procesu w dowolnym momencie.

Rozwiązywanie problemów z połączeniem

Zapoznaj się z poniższymi punktami, aby rozwiązać problemy z połączeniem.

  • Upewnij się, że wybrano zdalny Python (debugpy) dla Typ połączenia.

  • Upewnij się, że tajny klucz w docelowym połączeniu dokładnie pasuje do tajnego klucza w kodzie zdalnym.

  • Upewnij się, że adres IP w celu połączenia jest zgodny z adresem komputera zdalnego.

  • Sprawdź, czy port zdalnego debugowania na komputerze zdalnym jest otwarty, a obiekt docelowy połączenia zawiera sufiks portu, taki jak :5678.

    Aby użyć innego portu, określ numer portu w wywołaniu funkcji listen, jak w debugpy.listen((host, port)). W takim przypadku należy otworzyć określony port w zaporze.

  • Upewnij się, że wersja debugpy zainstalowana na komputerze zdalnym (zwrócona przez polecenie pip3 list) jest zgodna z wersją narzędzi Visual Studio Python Tools (PTVS).

    W poniższej tabeli wymieniono prawidłowe pary wersji. W razie potrzeby zaktualizuj wersję debugpy na komputerze zdalnym.

    Visual Studio Narzędzia języka Python debugpy
    2019 16.6 1.0.0b5 1.0.0b5
    2019 16.5 1.0.0b1 1.0.0b1

Notatka

Program Visual Studio 2019 w wersji 16.0-16.4 wykorzystał pliki ptvsd, a nie debugpy. Proces w tym przewodniku dla tych wersji jest podobny, ale nazwy funkcji są różne. Program Visual Studio 2019 w wersji 16.5 używa debugpy, ale nazwy funkcji były takie same jak w pliku ptvsd. Zamiast listennależy użyć enable_attach. Zamiast wait_for_clientnależy użyć wait_for_attach. Zamiast breakpointnależy użyć break_into_debugger.

Użyj ptvsd 3.x do debugowania starszych wersji

Starszy debuger ptvsd 3.x jest domyślny w programie Visual Studio 2017 w wersji 15.7 lub starszej.

W zależności od konfiguracji programu Visual Studio może być konieczne użycie pliku ptvsd 3.x do zdalnego debugowania:

  • Program Visual Studio 2017 w wersji 15.7 lub starszej z językiem Python 2.6, od 3.1 do 3.4 lub IronPython
  • Program Visual Studio 2019 w wersji 16.5 lub nowszej z językiem Python 2.6, od 3.1 do 3.4 lub IronPython
  • Wczesne wersje 4.x

Jeśli konfiguracja implementuje starszy scenariusz wersji, program Visual Studio wyświetla błąd, Debuger nie obsługuje tego środowiska języka Python.

Konfigurowanie zdalnego debugowania

Aby przygotować się do zdalnego debugowania z ptvsd 3.x, wykonaj następujące kroki:

  1. Skonfiguruj swój sekret, który służy do ograniczania dostępu do skryptu działającego.

    W ptvsd 3.x funkcja enable_attach wymaga przekazania "tajnego" jako pierwszego argumentu.

    • Po dołączeniu zdalnego debugera wprowadź sekret za pomocą polecenia enable_attach(secret="<secret>").

    Mimo że można zezwolić wszystkim na nawiązywanie połączenia przy użyciu polecenia enable_attach(secret=None), ta opcja nie jest zalecana.

  2. Utwórz docelowy adres URL połączenia w formularzu tcp://<secret>@<ip_address>:5678.

    • tcp:// określa typ połączenia jako TCP.
    • <secret> to ciąg przekazywany z funkcją enable_attach w kodzie języka Python.
    • <ip_address> jest adresem IP komputera zdalnego, który może być jawnym adresem lub nazwą taką jak myvm.cloudapp.net.
    • :5678 to numer portu debugowania zdalnego.

Bezpieczne połączenie przy użyciu protokołu TCPS

Domyślnie połączenie z zdalnym serwerem debugowania ptvsd 3.x jest zabezpieczone wyłącznie przez hasło, a wszystkie dane są przesyłane w postaci zwykłego tekstu. W przypadku bezpieczniejszego połączenia ptvsd 3.x obsługuje protokół SSL przy użyciu bezpiecznej formy protokołu TCP lub TCPS.

Wykonaj następujące kroki, aby skonfigurować plik ptvsd 3.x do pracy z protokołem TCPS:

  1. Na komputerze zdalnym użyj polecenia openssl, aby wygenerować oddzielne pliki dla klucza i certyfikatu z podpisem własnym:

    openssl req -new -x509 -days 365 -nodes -out cert.cer -keyout cert.key
    
    • W wierszu polecenia openssl wprowadź nazwę hosta lub adres IP używany do łączenia dla Nazwa Wspólna.

    Aby uzyskać więcej informacji, zobacz certyfikaty z podpisem własnym w dokumentacji modułu ssl języka Python. Pamiętaj, że polecenie opisane w dokumentacji języka Python generuje tylko jeden połączony plik.

  2. W kodzie zmodyfikuj wywołanie funkcji enable_attach w celu uwzględnienia argumentów certfile i keyfile przy użyciu nazw plików jako wartości. Te argumenty mają takie samo znaczenie jak w przypadku standardowej ssl.wrap_socket funkcji języka Python.

    ptvsd.enable_attach(secret='my_secret', certfile='cert.cer', keyfile='cert.key')
    

    Możesz również wprowadzić tę samą zmianę w pliku kodu na komputerze lokalnym. Ponieważ ten kod nie jest w rzeczywistości uruchamiany, nie jest to ściśle konieczne.

  3. Uruchom ponownie program w języku Python na komputerze zdalnym, aby był gotowy do debugowania.

  4. zabezpieczyć kanał, dodając certyfikat do zaufanego głównego urzędu certyfikacji na komputerze z systemem Windows za pomocą programu Visual Studio:

    1. Skopiuj plik certyfikatu z komputera zdalnego do komputera lokalnego.

    2. Otwórz Panel sterowania i przejdź do Narzędzia systemu Windows>Zarządzanie certyfikatami komputerów.

    3. W oknie dialogowym certlm [Certyfikaty — komputer lokalny] rozwiń węzeł Zaufanych głównych urzędów certyfikacji, kliknij prawym przyciskiem myszy Certyfikatyi wybierz pozycję Wszystkie zadania>Importuj.

    4. Przejdź do pliku .cer skopiowanego z komputera zdalnego i wybierz go.

    5. Przejdź do okna dialogowego z monitami, aby ukończyć proces importowania.

  5. Powtórz proces dołączania w programie Visual Studio, jak opisano wcześniej w dołączaniu zdalnym za pomocą narzędzi Python Tools.

    W tym wystąpieniu zdefiniuj tcps:// jako protokół celu połączenia (lub kwalifikator).

    Zrzut ekranu przedstawiający sposób określania protokołu TCPS jako transportu zdalnego debugowania przy użyciu protokołu SSL.

Rozwiązywanie problemów z połączeniem

Podczas próby połączenia program Visual Studio może napotkać problemy. Zapoznaj się z poniższymi scenariuszami i w razie potrzeby podejmij odpowiednie działania.

  • Program Visual Studio ostrzega przed potencjalnymi problemami z certyfikatami podczas nawiązywania połączenia za pośrednictwem protokołu SSL.

    akcja: możesz zignorować komunikat i kontynuować.

    Ostrożność

    Należy pamiętać, że chociaż kanał jest nadal szyfrowany przed podsłuchiwaniem, może być otwarty na ataki typu man-in-the-middle.

  • Program Visual Studio wyświetla ostrzeżenie, że zdalny certyfikat nie jest zaufany.

    Problem: certyfikat nie został poprawnie dodany do Zaufanych Głównych Urzędów Certyfikacji.

    Akcja: sprawdź ponownie kroki, aby dodać certyfikat do zaufanego głównego urzędu certyfikacji na komputerze z systemem Windowsi spróbuj ponownie nawiązać połączenie.

    Zrzut ekranu przedstawiający ostrzeżenie informujące, że zdalny certyfikat SSL nie jest zaufany.

  • Program Visual Studio wyświetla ostrzeżenie nazwa zdalnego certyfikatu nie pasuje do nazwy hosta.

    Problem: dla certyfikatu nie określono właściwej nazwy hosta lub adresu IP dla Common Name.

    Akcja: Ponownie sprawdź kroki w Zabezpiecz połączenie z użyciem TCPS. Pamiętaj, aby użyć poprawnej nazwy pospolitej podczas tworzenia certyfikatu i spróbuj ponownie nawiązać połączenie.

    Zrzut ekranu przedstawiający ostrzeżenie informujące, że zdalny certyfikat SSL nie jest zgodny z nazwą hosta.