Partilhar via


Implante, execute e depure seu projeto Linux MSBuild

O suporte ao Linux está disponível no Visual Studio 2017 e posterior. Para ver a documentação dessas versões, defina a lista suspensa Versão localizada acima do sumário como Visual Studio 2017 ou Visual Studio 2019.

Depois de criar um projeto Linux C++ baseado em MSBuild no Visual Studio e se conectar ao projeto usando o Linux Connection Manager, você pode executar e depurar o projeto. Você compila, executa e depura o código no destino remoto.

Visual Studio 2019 versão 16.1 e posterior: você pode direcionar diferentes sistemas Linux para depuração e compilação. Por exemplo, pode-se compilar cruzadamente em x64 e implantar num dispositivo ARM quando se direciona cenários de IoT. Para obter mais informações, consulte Especificar máquinas diferentes para criar e depurar mais adiante neste artigo.

Há várias maneiras de interagir e depurar o seu projeto Linux.

  • Depure usando recursos tradicionais do Visual Studio, como pontos de interrupção, janelas de observação e pairar sobre uma variável. Usando esses métodos, você pode depurar como faria normalmente para outros tipos de projeto.

  • Visualize a saída do computador de destino na janela do Console do Linux. Você também pode usar o console para enviar entrada para o computador de destino.

Depurar seu projeto Linux

  1. Selecione o modo de depuração na página de propriedades Debugging.

    GDB é usado para depurar aplicativos em execução no Linux. Ao depurar em um sistema remoto (não WSL), o GDB pode ser executado em dois modos diferentes, que podem ser selecionados na opção Modo de Depuração na página de propriedades do Debugging do projeto:

    Captura de ecrã da caixa de diálogo das Páginas de Propriedades do Aplicativo de Consola Linux do Visual Studio com as Propriedades de Configuração > Depuração selecionadas e Modo de Depuração destacado com G D B selecionado e destacado na lista de opções.

    GDB é usado para depurar aplicativos em execução no Linux. O GDB pode ser executado em dois modos diferentes, que podem ser selecionados na opção Modo de Depuração na página de propriedades de Depuração do projeto:

    Captura de ecrã da caixa de diálogo Páginas de Propriedades da Aplicação de Consola Linux do Visual Studio 2017 com Propriedades de Configuração > Depuração selecionadas e Modo de Depuração destacado com G D B selecionado e destacado na lista suspensa.

    • No modo gdbserver, o GDB é executado localmente, que se liga ao gdbserver no sistema remoto. Para usar isso, você deve fornecer um caminho local do Windows para GDB em de Caminho do Depurador em Visual Studio 2022 versão 17.6 e posterior, ou em de Caminho GDB em Visual Studio 2019 versão 16.11 e anteriores. Para obter mais informações sobre onde fornecer o caminho para GDB para projetos CMake, consulte Opções adicionais permitidas com a configuração gdbserver (16.7 ou posterior).

    • No modo de gdb, o depurador do Visual Studio controla o GDB no sistema remoto. Esta é uma opção melhor se a versão local do GDB não for compatível com a versão instalada no computador de destino. Este é o único modo que a janela do console Linux suporta.

      Observação

      Se não conseguires atingir os pontos de interrupção no modo de depuração do gdbserver, experimenta o modo de depuração do gdb. O GDB deve primeiro ser instalado no destino remoto.

  2. Selecione o destino remoto usando a barra de ferramentas padrão Debug no Visual Studio.

    Quando o destino remoto está disponível, você o vê listado por nome ou endereço IP:

    Captura de tela mostrando um endereço IP de destino remoto.

    Se você ainda não se conectou ao destino remoto, verá instruções para usar do Linux Connection Manager para se conectar ao destino remoto:

    Captura de tela mostrando a arquitetura remota, que é x64.

  3. Defina um ponto de interrupção clicando na calha esquerda de algum código que você sabe que será executado. Um ponto vermelho aparece na linha de código onde você define o ponto de interrupção.

  4. Pressione F5 (ou Debug > Start Debugging) para iniciar a depuração.

    Quando se inicia a depuração, a aplicação é compilada no alvo remoto antes de ser iniciada. Quaisquer erros de compilação aparecem na janela Lista de Erros.

    Se não houver erros, o aplicativo é iniciado e o depurador pausa no ponto de interrupção:

    Captura de ecrã a mostrar que a aplicação atingiu um ponto de interrupção.

    Agora, você pode interagir com o aplicativo em seu estado atual, exibir variáveis e percorrer o código pressionando teclas de comando, como F10 ou F11.

  5. Se quiseres usar o Console do Linux para interagir com a tua aplicação, seleciona Depurar > Console Linux.

    Captura de tela mostrando o item de menu Console do Linux.

    Este console exibe a saída do console do computador de destino e recebe a entrada e a envia para o computador de destino.

    Captura de tela mostrando a janela do console Linux.

Configurar outras opções de depuração (projetos MSBuild)

  • Os argumentos de linha de comando podem ser passados para o executável usando o item Argumentos do Programa na página de propriedades Depuração do projeto.

  • Você pode exportar a variável de ambiente DISPLAY usando o Comando Pré-Lançamento nas páginas de propriedades de Depuração do projeto. Por exemplo: export DISPLAY=:0.0

    Captura de tela mostrando a propriedade Argumentos do Programa na caixa de diálogo Páginas de Propriedades.

  • Opções específicas do depurador podem ser passadas para GDB usando a entrada Comandos de Depurador Adicionais. Por exemplo, podes querer ignorar os sinais de SIGILL (instrução ilegal). Você pode usar o comando handle para conseguir isso, adicionando o seguinte à entrada Comandos do Depurador Adicionais mostrada acima: handle SIGILL nostop noprint.

  • Especifique o caminho para o GDB usado pelo Visual Studio usando o item Caminho do GDB na página de propriedades de Depuração do projeto. Esta propriedade está disponível no Visual Studio 2019 versão 16.9 e posterior.

Depurar com Anexar ao Processo

A página de propriedades do de depuração para projetos do Visual Studio e as configurações de Launch.vs.json para projetos CMake têm configurações que permitem anexar a um processo em execução. Se você precisar de mais controle além do que é fornecido nessas configurações, poderá colocar um arquivo chamado Microsoft.MIEngine.Options.xml na raiz da sua solução ou espaço de trabalho. Aqui está um exemplo simples:

<?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>

O AttachOptionsForConnection tem a maioria dos atributos de que pode precisar. O exemplo acima mostra como especificar um local para pesquisar mais bibliotecas .so. O elemento filho ServerOptions permite, em vez disso, anexar ao processo remoto com gdbserver. Para fazer isso, você precisa especificar um cliente gdb local (aquele fornecido no Visual Studio 2017 é mostrado acima) e uma cópia local do binário com símbolos. O elemento SetupCommands permite que você passe comandos diretamente para o gdb. Você pode encontrar todas as opções disponíveis no esquema LaunchOptions.xsd no GitHub.

Especificar máquinas diferentes para compilar e depurar em projetos Linux baseados no MSBuild

Você pode separar sua máquina de compilação remota de sua máquina de depuração remota para projetos Linux baseados em MSBuild e projetos CMake destinados a uma máquina Linux remota. Por exemplo, agora pode-se compilar cruzadamente em x64 e implantar em um dispositivo ARM ao visar cenários de IoT.

Por padrão, a máquina de depuração remota é a mesma que a máquina de compilação remota (Configuration Properties>General>Remote Build Machine). Para especificar uma nova máquina de depuração remota, clique com o botão direito do mouse no projeto em Gerenciador de Soluções e vá para Propriedades de Configuração>Depuração>Máquina de Depuração Remota:

Captura de tela mostrando a propriedade da máquina de depuração remota do Linux na caixa de diálogo Páginas de propriedades que mostra o nome de usuário, o tipo de autenticação e a porta.

O menu suspenso da máquina de depuração remota é populado por todas as conexões remotas estabelecidas.

Para adicionar uma nova ligação remota, navegue até Ferramentas>Opções>Multi-Plataforma>Gestor de Ligações ou procure "Gestor de Ligações" no Início Rápido. Você também pode especificar um novo diretório de implantação remota nas Páginas de Propriedades do projeto (Configuration Properties>General>Remote Deploy Directory).

Por padrão, apenas os arquivos necessários para o processo de depuração são implantados na máquina de depuração remota. Você pode usar Explorador de Soluções para configurar quais arquivos de origem são implantados na máquina de depuração remota. Quando você clica em um arquivo de origem, você vê uma visualização de suas propriedades de arquivo diretamente abaixo do Gerenciador de Soluções:

Captura de tela mostrando as propriedades do arquivo main.cpp com o conteúdo da propriedade = Falso realçado.

A propriedade Content especifica se o arquivo será implantado na máquina de depuração remota. Você pode desabilitar totalmente a implantação navegando até Páginas de Propriedades> do Configuration Manager e desmarcando Implantar para a configuração desejada.

Em alguns casos, você pode precisar de mais controle sobre a implantação do seu projeto. Por exemplo, alguns arquivos que você deseja implantar podem estar fora da sua solução ou você deseja personalizar seu diretório de implantação remota por arquivo ou diretório. Nesses casos, anexe o(s) seguinte(s) bloco(s) de código ao seu arquivo .vcxproj e substitua "example.cpp" pelos nomes de arquivo reais:


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

Projetos CMake

Para projetos CMake destinados a uma máquina Linux remota, você pode especificar uma nova máquina de depuração remota no launch.vs.json. Por padrão, o valor de "remoteMachineName" é sincronizado com a propriedade "remoteMachineName" em CMakeSettings.json, que corresponde à sua máquina de compilação remota. Essas propriedades não precisam mais corresponder, e o valor de "remoteMachineName" em launch.vs.json determina qual máquina remota é usada para implantar e depurar.

A máquina de depuração remota CMake especificada no arquivo launch_schema.json. O nome da máquina remota é ${debugInfo . remoteMachineName}

O IntelliSense sugere uma lista de todas as conexões remotas estabelecidas. Você pode adicionar uma nova conexão remota navegando até Ferramentas>Opções>Plataforma Cruzada>Gestor de Ligações ou procurando por "Gestor de Ligações" no Início Rápido.

Se quiser ter controle total sobre sua implantação, você pode acrescentar o(s) seguinte(s) bloco(s) de código ao arquivo launch.vs.json. Lembre-se de substituir os valores de espaço reservado por valores reais:

"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"
   }
]

Próximos passos

Ver também

Propriedades de depuração C++ (Linux C++)