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
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:
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:
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.
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.
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.
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.
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.
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.
Se você quiser usar o Console do Linux para interagir com o aplicativo, selecione Depurar > 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.
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
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.
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.
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 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
- Para depurar dispositivos ARM no Linux, consulte esta postagem no blog: Debugging an embedded ARM device in Visual Studio (Depurando um dispositivo ARM inserido no Visual Studio).