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 versão localizada acima do sumário como Visual Studio 2017 ou Visual Studio 2019.

Depois de criar um projeto do Linux C++ baseado em MSBuild em Visual Studio e se conectar ao projeto usando o Gerenciador de Conexões do Linux, você poderá executar e depurar o projeto. Você compilará, executará e depurará 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 criação. 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:

    Screenshot of the Visual Studio Linux Console App Property Pages dialog box with Configuration Properties > Debugging selected and Debugging Mode highlighted with G D B selected and highlighted from the dropdown list.

    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:

    Screenshot of the Visual Studio 2017 Linux Console App Property Pages dialog box with Configuration Properties > Debugging selected and Debugging Mode highlighted with G D B selected and highlighted from the dropdown list.

    • 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 é 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. Esse é o único modo compatível com a janela do Console do Linux.

    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.

    Screenshot showing a Remote target.

    Se você ainda não se conectou ao destino remoto, verá uma instrução para usar o Linux Gerenciador de Conexões para se conectar ao destino remoto.

    Screenshot showing the Remote Architecture.

  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.

    Screenshot showing the app has hit a breakpoint.

    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 seu aplicativo, selecione Depurar > Console linux.

    Screenshot showing the Linux Console menu item.

    Este console exibirá qualquer saída de console do computador de destino e usará a entrada e o enviará para o computador de destino.

    Screenshot showing the Linux Console window.

Configurar outras opções de depuração (projetos 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 DISPLAY variável de ambiente usando o Comando de Pré-Inicialização nas páginas de propriedades de Depuração do projeto. Por exemplo: export DISPLAY=:0.0

    Screenshot showing the Program Arguments property in the Property Pages dialog.

  • 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 por 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 versão 16.9 e posterior do Visual Studio 2019.

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 controle adicional 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 bibliotecas .so adicionais. O elemento filho ServerOptions permite anexar ao processo remoto com gdbserver. Para fazer isso, você precisa especificar um cliente gdb local (aquele enviado em 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 criação e depuração em projetos linux baseados em MSBuild

Você pode separar o computador de build remoto do computador de depuração remota para projetos linux baseados em MSBuild e projetos do CMake direcionados 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 build remoto (ConfigurationPropertiesGeneralRemote>>Build Machine). 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.

Screenshot showing the Linux remote debug machine property in the Property Pages dialog.

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é a Plataforma >ToolsOptionsCross>>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 remota nas Páginas de Propriedades do projeto (Diretório de Implantação do ConfigurationPropertiesGeneralRemote>>).

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 visualização de suas Propriedades de Arquivo diretamente abaixo do Gerenciador de Soluções.

Screenshot showing the Linux deployable files specified in the Properties window.

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 Implantação para a configuração desejada.

Em alguns casos, você pode exigir mais controle sobre a implantação do 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, 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.

The CMake remote debug machine specified in the launch.vs.json file.

O IntelliSense sugere uma lista de todas as conexões remotas estabelecidas. Você pode adicionar uma nova conexão remota navegando até a Plataforma >ToolsOptionsCross>>Gerenciador de Conexões ou procurando por "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

Veja também

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