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.

    • 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 ainda não tiver se conectado ao destino remoto, você verá uma instrução para usar o Gerenciador de Conexões do Linux para se conectar a ele.

    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. Os possíveis erros de compilação serão exibidos na janela Lista de Erros.

    Se não houver nenhum erro, 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.

    Esse console exibirá qualquer saída do console do computador de destino, bem como usará a entrada e a enviará ao 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). Seria possível usar o comando handle para isso, adicionando o seguinte à entrada Comandos Adicionais do Depurador, como mostrado acima:

    handle SIGILL nostop noprint

  • Você pode especificar 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. Este é 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 uma localização 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 um novo computador de depuração remoto, clique com botão direito no projeto no Gerenciador de Soluções e vá para Propriedades da Configuração>Depuração>Computador de Depuração Remoto.

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 depurar o processo serã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 pré-visualização das Propriedades de Arquivo logo 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 seu computador de compilação remoto. Essas propriedades não precisam mais corresponder, e o valor de "remoteMachineName" em launch.vs.json determinará qual computador remoto será usado para implantaçã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++)