Compartilhar via


Implantar, executar e depurar o projeto do Linux com o 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 de Versão localizada acima do sumário para o Visual Studio 2017 ou Visual Studio 2019.

Depois de criar um projeto do Linux em C++ baseado no MSBuild no Visual Studio e se conectar a ele usando o Gerenciador de Conexões do Linux, você poderá executá-lo e depurá-lo. Você compilará, executará e depurará o código no destino remoto.

Visual Studio 2019 versão 16.1 e posteriores: você pode ter como destino diferentes sistemas Linux para depuração e build. Por exemplo, você pode fazer uma compilação cruzada no x64 e implantar em um dispositivo ARM ao visar cenários de IoT. Para saber mais, confira Especificar computadores diferentes para compilação e depuração, mais adiante neste artigo.

Há várias maneiras de interagir com o projeto do Linux e depurá-lo.

  • Realize a depuração usando os recursos tradicionais do Visual Studio, como pontos de interrupção, janelas Inspeção e focalizar uma variável. Usando esses métodos, você pode depurar como faria normalmente para outros tipos de projeto.

  • Exiba a saída do computador de destino em uma janela do Console do Linux. Você também pode usar o console para enviar entradas para o computador de destino.

Depurar o projeto do Linux

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

    O GDB é usado para depurar aplicativos em execução no Linux. Durante a depuração em um sistema remoto (exceto 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 Depuração do projeto:

    Captura de tela da caixa de diálogo Páginas de Propriedades de Aplicativo de Console do Linux no Visual Studio com Propriedades de Configuração > Depuração selecionada e o Modo de Depuração realçado com G D B selecionado e realçado na lista suspensa.

    O 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 Depuração do projeto:

    Captura de tela da caixa de diálogo Páginas de Propriedades de Aplicativo de Console do Linux no Visual Studio 2017 com Propriedades de Configuração > Depuração selecionada e o Modo de Depuração realçado com G D B selecionado e realçado na lista suspensa.

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

    • No modo gdb, o depurador do Visual Studio conduz o GDB no sistema remoto. Essa é a opção melhor se a versão local do GDB não for compatível com a versão instalada no computador de destino. Esse é o único modo ao qual a janela do Console do Linux dá suporte.

      Observação

      Se não for possível atingir os pontos de interrupção no modo de depuração gdbserver, tente usar o gdb. O gdb precisa primeiro ser instalado no destino remoto.

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

    Quando o destino remoto estiver disponível, você o verá 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 Gerenciador de Conexões do Linux para se conectar ao destino remoto:

    Captura de tela mostrando a Arquitetura Remota, que é x64.

  3. Definir um ponto de interrupção clicando na medianiz esquerda de algum código que você sabe que será executado. Um ponto vermelho aparecerá na linha de código em que você definiu o ponto de interrupção.

  4. Pressione F5 (ou Depurar > Iniciar depuração) para iniciar a depuração.

    Quando você inicia a depuração, o aplicativo é compilado no destino remoto antes de ser iniciado. Todos os erros de compilação aparecem na janela Lista de Erros.

    Se não houver erros, o aplicativo será iniciado e o depurador pausará no ponto de interrupção:

    Captura de tela mostrando que o aplicativo alcançou 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 as teclas de comando como F10 ou F11.

  5. Se você quiser usar o Console do Linux para interagir com o aplicativo, selecione Depurar > Console do 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 entrada e envia-a para o computador de destino.

    Captura de tela mostrando a janela Console do Linux.

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

  • 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 de Pré-Inicialização 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 o GDB usando a entrada Comandos adicionais do depurador. Por exemplo, talvez você deseje ignorar os sinais SIGILL (instrução inválida). Você pode usar o comando handle para fazer isso adicionando o seguinte à entrada Comandos Adicionais do Depurador mostrado 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. Essa propriedade está disponível no Visual Studio 2019 versão 16.9 e posteriores.

Depuração com Anexar ao Processo

A página de propriedades Depuração para projetos do Visual Studio e as configurações de Launch.vs.json para projetos do CMake têm configurações que permitem anexar a um processo em execução. Caso você precise ter mais controle, além do que é fornecido nessas configurações, coloque um arquivo chamado Microsoft.MIEngine.Options.xml na raiz da solução ou do workspace. 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>

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

Especificar computadores diferentes para compilação e depuração em projetos linux baseados em MSBuild

Você pode separar o computador de compilação remoto do seu computador de depuração remoto para projetos do CMake e projetos do Linux baseados no MSBuild destinados a um computador Linux remoto. Por exemplo, você pode fazer uma compilação cruzada no x64 e implantar em um dispositivo ARM ao visar cenários de IoT.

Por padrão, o computador de depuração remoto é o mesmo que o computador de compilação remoto (Propriedades da Configuração>Geral>Computador de Compilação Remoto). Para especificar uma nova máquina de depuração remota, clique com o botão direito do mouse no projeto no 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 do computador de depuração remoto 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 para Computador de Depuração Remoto é preenchido com todas as conexões remotas estabelecidas.

Para adicionar uma nova conexão remota, navegue até Ferramentas>Opções>Plataforma Cruzada>Gerenciador de Conexões ou pesquise "Gerenciador de Conexões" no Início Rápido. Você também pode especificar um novo diretório de implantação remoto nas Páginas de Propriedades do projeto (Propriedades da Configuração>Geral>Diretório de Implantação Remoto).

Por padrão, somente os arquivos necessários para o processo de depuração são implantados no computador de depuração remoto. Você pode usar o Gerenciador de Soluções para configurar os arquivos de origem que serão implantados no computador de depuração remoto. Ao clicar em um arquivo de origem, você verá 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 = False realçado.

A propriedade Content especifica se o arquivo será implantado no computador de depuração remoto. Você pode desabilitar totalmente a implantação navegando até Páginas de Propriedades>Configuration Manager e desmarcando a opção Implantar da configuração desejada.

Em alguns casos, você pode exigir mais controle sobre a implantação do projeto. Por exemplo, alguns arquivos que você quer implantar podem estar fora da solução ou você quer personalizar o diretório de implantação remoto por arquivo ou diretório. Nesses casos, acrescente os seguintes blocos de código ao 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 do CMake

Para projetos do CMake que se destinam a um computador Linux remoto, você pode especificar um novo computador de depuração remoto em launch.vs.json. Por padrão, o valor de "remoteMachineName" é sincronizado com a propriedade "remoteMachineName" em CMakeSettings.json, que corresponde ao computador de build remoto. Essas propriedades não precisam mais estar sincronizadas, e o valor de "remoteMachineName" em launch.vs.json determina qual computador remoto é usado para implementação e depuração.

O computador de depuração remoto do CMake especificado no arquivo launch_schema.json. O Nome do Computador remoto é ${debugInfo . remoteMachineName}

O IntelliSense sugere uma lista de todas as conexões remotas estabelecidas. É possível adicionar uma nova conexão remota navegando até Ferramentas>Opções>Plataforma Cruzada>Gerenciador de Conexões ou pesquisando "Gerenciador de Conexões" no Início Rápido.

Se quiser controle completo sobre a implantação, você poderá acrescentar os seguintes blocos de código ao arquivo launch.vs.json. Lembre-se de substituir os valores do espaço reservado pelos 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óximas etapas

Confira também

Propriedades do depurador C++ (Linux C++)