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 debugowania.

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 debugowania zastępuje plik ptvsd. W przypadku korzystania z debugowania kod języka Python debugowany hostuje serwer debugowania, do którego można dołączyć 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.

Wymagania 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 Mac OSX lub Linux.

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

Konfigurowanie komputera z systemem Linux

Maszynę wirtualną z systemem Linux można łatwo utworzyć 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

Port przychodzący 5678 musi być otwarty w zaporze komputera zdalnego w celu obsługi zdalnego debugowania.

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. debugpy Zainstaluj pakiet w środowisku przy użyciu pip3 install debugpy polecenia .

    Uwaga

    Dobrym pomysłem jest zarejestrowanie wersji debugpy zainstalowanej w przypadku, gdy będzie potrzebny do rozwiązywania problemów. Lista debugowania zawiera również 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 zduplikowanych przed wywołaniem listen funkcji).

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

    python3 guessing-game.py
    

    Wywołanie listen funkcji jest uruchamiane w tle i czeka na połączenia przychodzące podczas interakcji z programem. W razie potrzeby można wywołać wait_for_client funkcję po wywołaniu listen funkcji w celu zablokowania programu do momentu dołączenia debugera.

Napiwek

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

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łączanie do procesu.

  4. W oknie dialogowym Dołączanie do procesu ustaw typ Połączenie ion na zdalny (debugpy) języka Python.

  5. W polu cel Połączenie ion wprowadź polecenie tcp://<ip_address>:5678.

    • tcp:// określa typ połączenia jako Protokół TCP (Transmission Control Protocol).
    • <ip_address> to adres 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 klawisz Enter, aby wypełnić listę dostępnych procesów debugowania na tym komputerze:

    Screenshot that shows how to enter the connection target to see a list of available debugpy processes.

    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 pozycję Dołącz lub kliknij dwukrotnie proces.

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

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

    Screenshot that shows how Visual Studio pauses debugging when a breakpoint is hit.

  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 pozycję Zdalne (debugpy) języka Python dla typu Połączenie ion.

  • Upewnij się, że wpis tajny w obiekcie docelowym Połączenie ion dokładnie pasuje do wpisu tajnego w kodzie zdalnym.

  • Upewnij się, że adres IP w Połączenie ion Target 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 listen funkcji, jak w pliku 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 pip3 list polecenie) 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

Uwaga

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. listenZamiast polecenia należy użyć polecenia enable_attach. wait_for_clientZamiast polecenia należy użyć polecenia wait_for_attach. breakpointZamiast polecenia należy użyć polecenia break_into_debugger.

Używanie pliku ptvsd 3.x do debugowania w starszej 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 wpis tajny, który służy do ograniczania dostępu do uruchomionego skryptu.

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

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

    Mimo że można zezwolić wszystkim na nawiązywanie połączenia przy użyciu enable_attach(secret=None) polecenia , 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> to adres 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 tylko przez wpis tajny, a wszystkie dane są przekazywane 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 openssl polecenia , 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
    
    • Po wyświetleniu monitu openssl wprowadź nazwę hosta lub adres IP używany do nawiązania połączenia dla nazwy pospolitej.

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

  2. W kodzie zmodyfikuj wywołanie enable_attach funkcji w celu uwzględnienia certfile argumentów 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. Zabezpiecz 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 pozycji Narzędzia systemu>Windows Zarządzaj certyfikatami komputerów.

    3. W oknie dialogowym certlm [Certyfikaty — komputer lokalny] rozwiń węzeł Zaufane główne urzędy certyfikacji, kliknij prawym przyciskiem myszy pozycję Certyfikaty i wybierz pozycję Wszystkie zadania>importu.

    4. Przejdź do i wybierz plik .cer skopiowany z komputera zdalnego.

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

  5. Powtórz proces dołączania w programie Visual Studio, zgodnie z opisem we wcześniejszej sekcji Dołączanie zdalnie z narzędzi języka Python.

    W tym przypadku zdefiniuj tcps:// jako protokół obiektu docelowego Połączenie ion (lub kwalifikatora).

    Screenshot that shows how to specify TCPS as the remote debugging transport with 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ć.

    Uwaga

    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 certyfikat zdalny nie jest zaufanym ostrzeżeniem.

    Problem: Certyfikat nie został poprawnie dodany do zaufanego głównego urzędu certyfikacji.

    Akcja: Sprawdź ponownie kroki dodawania certyfikatu do zaufanego głównego urzędu certyfikacji na komputerze z systemem Windows i spróbuj ponownie nawiązać połączenie.

    Screenshot of the warning that says the remote SSL certificate isn't trusted.

  • Program Visual Studio wyświetla nazwę certyfikatu zdalnego niezgodne z ostrzeżeniem o nazwie hosta.

    Problem: Prawidłowa nazwa hosta lub adres IP nie jest określona dla nazwy pospolitej certyfikatu.

    Akcja: Sprawdź ponownie kroki opisane w temacie Zabezpieczanie połączenia za pomocą protokołu TCPS. Pamiętaj, aby użyć poprawnej nazwy pospolitej podczas tworzenia certyfikatu i spróbuj ponownie nawiązać połączenie.

    Screenshot of the warning that says the remote SSL certificate doesn't match the hostname.