Wdrażanie, uruchamianie i debugowanie projektu narzędzia w systemie Linux

Obsługa systemu Linux jest dostępna w programie Visual Studio 2017 lub nowszym. Aby zapoznać się z dokumentacją dla tych wersji, ustaw listę rozwijaną Wersja znajdującą się powyżej spisu treści na Visual Studio 2017 lub Visual Studio 2019.

Po utworzeniu projektu języka C++ opartego na programie MSBuild w programie Visual Studio i nawiązaniu połączenia z projektem przy użyciu Menedżer połączeń systemu Linux możesz uruchomić i debugować projekt. Kompilujesz, wykonujesz i debugujesz kod w zdalnym obiekcie docelowym.

Program Visual Studio 2019 w wersji 16.1 lub nowszej: możesz kierować różne systemy Linux do debugowania i kompilowania. Na przykład można kompilować krzyżowo na platformie x64 i wdrażać na urządzeniu ARM podczas określania wartości docelowych scenariuszy IoT. Aby uzyskać więcej informacji, zobacz Określanie różnych maszyn do kompilowania i debugowania w dalszej części tego artykułu.

Istnieje kilka sposobów interakcji i debugowania projektu systemu Linux.

  • Debugowanie przy użyciu tradycyjnych funkcji programu Visual Studio, takich jak punkty przerwania, okna watch i umieszczanie wskaźnika myszy na zmiennej. Korzystając z tych metod, można debugować tak, jak zwykle w przypadku innych typów projektów.

  • Wyświetl dane wyjściowe z komputera docelowego w oknie Konsola systemu Linux. Można również użyć konsoli do wysyłania danych wejściowych na komputer docelowy.

Debugowanie projektu systemu Linux

  1. Wybierz tryb debugowania na stronie właściwości Debugowanie .

    GDB służy do debugowania aplikacji działających w systemie Linux. Podczas debugowania w systemie zdalnym (nie WSL) GDB można uruchomić w dwóch różnych trybach, które można wybrać z opcji Tryb debugowania na stronie właściwości Debugowanie projektu:

    Zrzut ekranu przedstawiający okno dialogowe Strony właściwości aplikacji konsoli systemu Linux programu Visual Studio z wybraną pozycją Debugowanie właściwości > konfiguracji i wyróżnionym trybem debugowania z wybraną pozycją G D B i wyróżnioną z listy rozwijanej.

    GDB służy do debugowania aplikacji działających w systemie Linux. GDB może działać w dwóch różnych trybach, które można wybrać z opcji Tryb debugowania na stronie właściwości Debugowanie projektu:

    Zrzut ekranu przedstawiający okno dialogowe Strony właściwości aplikacji konsoli systemu Linux programu Visual Studio 2017 z wybraną pozycją Debugowanie właściwości > konfiguracji i tryb debugowania wyróżnionym wybraną pozycją G D B i wyróżnioną z listy rozwijanej.

    • W trybie gdbserver baza danych GDB jest uruchamiana lokalnie, co łączy się z serwerem gdbserver w systemie zdalnym.

    • W trybie gdb debuger programu Visual Studio dysków GDB w systemie zdalnym. Jest to lepsza opcja, jeśli lokalna wersja usługi GDB nie jest zgodna z wersją zainstalowaną na komputerze docelowym. Jest to jedyny tryb obsługiwany przez okno Konsola systemu Linux.

    Uwaga

    Jeśli nie możesz trafić do punktów przerwania w trybie debugowania gdbserver, spróbuj użyć trybu gdb. Najpierw należy zainstalować bazę danych gdb na zdalnym obiekcie docelowym.

  2. Wybierz obiekt docelowy zdalny przy użyciu standardowego paska narzędzi debugowania w programie Visual Studio.

    Gdy zdalny obiekt docelowy jest dostępny, zobaczysz ją na liście według nazwy lub adresu IP.

    Zrzut ekranu przedstawiający zdalny docelowy adres IP.

    Jeśli jeszcze nie nawiązaliśmy połączenia ze zdalnym obiektem docelowym, zobaczysz instrukcję użycia systemu Linux Menedżer połączeń w celu nawiązania połączenia ze zdalnym obiektem docelowym.

    Zrzut ekranu przedstawiający architekturę zdalną, która jest x64.

  3. Ustaw punkt przerwania, klikając lewą rynnę kodu, który zostanie wykonany.

    Czerwona kropka pojawia się w wierszu kodu, w którym ustawiono punkt przerwania.

  4. Naciśnij klawisz F5 (lub Debuguj rozpocznij debugowanie>), aby rozpocząć debugowanie.

    Po rozpoczęciu debugowania aplikacja jest kompilowana na zdalnym obiekcie docelowym przed jego uruchomieniem. Wszelkie błędy kompilacji zostaną wyświetlone w oknie Lista błędów .

    Jeśli nie ma żadnych błędów, aplikacja zostanie uruchomiona, a debuger wstrzyma się w punkcie przerwania.

    Zrzut ekranu pokazujący, że aplikacja osiągnęła punkt przerwania.

    Teraz możesz wchodzić w interakcję z aplikacją w bieżącym stanie, wyświetlać zmienne i przechodzić przez kod, naciskając klawisze poleceń, takie jak F10 lub F11.

  5. Jeśli chcesz używać konsoli systemu Linux do interakcji z aplikacją, wybierz pozycję Debuguj > konsolę systemu Linux.

    Zrzut ekranu przedstawiający element menu Konsola systemu Linux.

    Ta konsola będzie wyświetlać wszystkie dane wyjściowe konsoli z komputera docelowego i pobierać dane wejściowe i wysyłać je do komputera docelowego.

    Zrzut ekranu przedstawiający okno konsoli systemu Linux.

Konfigurowanie innych opcji debugowania (projekty MSBuild)

  • Argumenty wiersza polecenia można przekazać do pliku wykonywalnego przy użyciu elementu Argumenty programu na stronie właściwości Debugowanie projektu.

  • Zmienną DISPLAY środowiskową można wyeksportować przy użyciu polecenia przed uruchomieniem na stronach właściwości Debugowanie projektu. Na przykład: export DISPLAY=:0.0

    Zrzut ekranu przedstawiający właściwość Argumenty programu w oknie dialogowym Strony właściwości.

  • Określone opcje debugera można przekazać do bazy danych GDB przy użyciu wpisu Dodatkowe polecenia debugera . Na przykład możesz zignorować sygnały SIGILL (nielegalne instrukcje). Aby to osiągnąć, możesz użyć polecenia handle , dodając następujący kod do wpisu Dodatkowe polecenia debugera , jak pokazano powyżej:

    handle SIGILL nostop noprint

  • Ścieżkę do bazy danych GDB używanej przez program Visual Studio można określić przy użyciu elementu ścieżka GDB na stronie właściwości Debugowanie projektu. Ta właściwość jest dostępna w programie Visual Studio 2019 w wersji 16.9 lub nowszej.

Debugowanie za pomocą dołączania do procesu

Strona właściwości Debugowanie dla projektów programu Visual Studio oraz ustawienia Launch.vs.json dla projektów CMake mają ustawienia umożliwiające dołączanie do uruchomionego procesu. Jeśli potrzebujesz większej kontroli poza tym, co jest podane w tych ustawieniach, możesz umieścić plik o nazwie Microsoft.MIEngine.Options.xml w katalogu głównym rozwiązania lub obszaru roboczego. Oto prosty przykład:

<?xml version="1.0" encoding="utf-8"?>
<SupplementalLaunchOptions>
    <AttachOptions>
      <AttachOptionsForConnection AdditionalSOLibSearchPath="/home/user/solibs">
        <ServerOptions MIDebuggerPath="C:\Program Files (x86)\Microsoft Visual Studio\Preview\Enterprise\Common7\IDE\VC\Linux\bin\gdb\7.9\x86_64-linux-gnu-gdb.exe"
ExePath="C:\temp\ConsoleApplication17\ConsoleApplication17\bin\x64\Debug\ConsoleApplication17.out"/>
        <SetupCommands>
          <Command IgnoreFailures="true">-enable-pretty-printing</Command>
        </SetupCommands>
      </AttachOptionsForConnection>
    </AttachOptions>
</SupplementalLaunchOptions>

Element AttachOptionsForConnection ma większość potrzebnych atrybutów. W powyższym przykładzie pokazano, jak określić lokalizację wyszukiwania większej liczby bibliotek. Podrzędny element ServerOptions umożliwia dołączanie do procesu zdalnego za pomocą serwera gdbserver. W tym celu należy określić lokalnego klienta bazy danych gdb (pokazano go w programie Visual Studio 2017) oraz lokalną kopię pliku binarnego z symbolami. Element SetupCommands umożliwia przekazywanie poleceń bezpośrednio do bazy danych gdb. Wszystkie opcje dostępne w schemacie LaunchOptions.xsd można znaleźć w witrynie GitHub.

Określanie różnych maszyn do kompilowania i debugowania w projektach systemu Linux opartych na programie MSBuild

Możesz oddzielić maszynę kompilacji zdalnej od maszyny zdalnego debugowania zarówno dla projektów systemu Linux opartych na programie MSBuild, jak i projektów CMake przeznaczonych dla zdalnej maszyny z systemem Linux. Na przykład można teraz kompilować krzyżowo na platformie x64 i wdrażać na urządzeniu ARM podczas określania wartości docelowych scenariuszy IoT.

Domyślnie maszyna zdalnego debugowania jest taka sama jak maszyna kompilacji zdalnej (Właściwości> konfiguracjiOgólne zdalne>kompilowanie maszyny). Aby określić nową zdalną maszynę debugowania, kliknij prawym przyciskiem myszy projekt w Eksplorator rozwiązań i przejdź do pozycji Właściwości> konfiguracjiDebugowaniezdalnej maszyny debugowania>.

Zrzut ekranu przedstawiający właściwość zdalnej maszyny debugowania systemu Linux w oknie dialogowym Strony właściwości, w którym jest wyświetlana nazwa użytkownika, typ uwierzytelniania i port.

Menu rozwijane maszyny debugowania zdalnego jest wypełniane wszystkimi nawiązanymi połączeniami zdalnymi. Aby dodać nowe połączenie zdalne, przejdź do pozycji Narzędzia>Opcje>międzyplatformowe>Menedżer połączeń lub wyszukaj ciąg "Menedżer połączeń" w obszarze Szybkie uruchamianie. Można również określić nowy katalog wdrożenia zdalnego na stronach właściwości projektu (Właściwości> konfiguracjiOgólne>zdalne wdrażanie katalogu).

Domyślnie tylko pliki niezbędne do debugowania procesu zostaną wdrożone na maszynie debugowania zdalnego. Za pomocą Eksplorator rozwiązań można skonfigurować pliki źródłowe, które zostaną wdrożone na maszynie debugowania zdalnego. Po kliknięciu pliku źródłowego zobaczysz podgląd właściwości pliku bezpośrednio poniżej Eksplorator rozwiązań.

Zrzut ekranu przedstawiający właściwości pliku main.cpp z wyróżnioną zawartością właściwości = Fałsz.

Właściwość Content określa, czy plik zostanie wdrożony na maszynie debugowania zdalnego. Wdrożenie można całkowicie wyłączyć, przechodząc do strony> właściwości Configuration Manager i usuwając zaznaczenie pola wyboru Wdróż dla żądanej konfiguracji.

W niektórych przypadkach może być wymagana większa kontrola nad wdrożeniem projektu. Na przykład niektóre pliki, które chcesz wdrożyć, mogą znajdować się poza rozwiązaniem lub chcesz dostosować katalog wdrożenia zdalnego na plik lub katalog. W takich przypadkach dołącz następujące bloki kodu do pliku vcxproj i zastąp ciąg "example.cpp" rzeczywistymi nazwami plików:


<ItemGroup>
   <RemoteDeploy Include="__example.cpp">
<!-- This is the source Linux machine, can be empty if DeploymentType is LocalRemote -->
      <SourceMachine>$(RemoteTarget)</SourceMachine>
      <TargetMachine>$(RemoteDebuggingTarget)</TargetMachine>
      <SourcePath>~/example.cpp</SourcePath>
      <TargetPath>~/example.cpp</TargetPath>
<!-- DeploymentType can be LocalRemote, in which case SourceMachine will be empty and SourcePath is a local file on Windows -->
      <DeploymentType>RemoteRemote</DeploymentType>
<!-- Indicates whether the deployment contains executables -->
      <Executable>true</Executable>
   </RemoteDeploy>
</ItemGroup>

Projekty platformy CMake

W przypadku projektów CMake przeznaczonych dla zdalnej maszyny z systemem Linux można określić nową zdalną maszynę debugowania w pliku launch.vs.json. Domyślnie wartość "remoteMachineName" jest synchronizowana z właściwością "remoteMachineName" w pliku CMakeSettings.json, która odpowiada maszynie kompilacji zdalnej. Te właściwości nie muszą już być zgodne, a wartość "remoteMachineName" w pliku launch.vs.json będzie określać, która maszyna zdalna jest używana do wdrażania i debugowania.

Zdalna maszyna debugowania CMake określona w pliku launch_schema.json. Nazwa zdalnej maszyny to ${debugInfo . remoteMachineName}

Funkcja IntelliSense zaproponuje całą listę wszystkich ustanowionych połączeń zdalnych. Możesz dodać nowe połączenie zdalne, przechodząc do pozycji Narzędzia>Opcje>międzyplatformowe>Menedżer połączeń lub wyszukując frazę "Menedżer połączeń" w obszarze Szybkie uruchamianie.

Jeśli chcesz mieć pełną kontrolę nad wdrożeniem, możesz dołączyć następujące bloki kodu do pliku launch.vs.json. Pamiętaj, aby zastąpić wartości symboli zastępczych rzeczywistymi wartościami:

"disableDeploy": false,
"deployDirectory": "~\foo",
"deploy" : [
   {
      "sourceMachine": "127.0.0.1 (username=example1, port=22, authentication=Password)",
      "targetMachine": "192.0.0.1 (username=example2, port=22, authentication=Password)",
      "sourcePath": "~/example.cpp",
      "targetPath": "~/example.cpp",
      "executable": "false"
   }
]

Następne kroki

Zobacz też

Właściwości debugowania języka C++ (Linux C++)