Tutorial: aprenda a depurar código C++ usando o Visual Studio
Este artigo apresenta os recursos do depurador do Visual Studio passo a passo. Caso deseje obter uma exibição de nível superior das funcionalidades do depurador, confira Introdução ao depurador. Quando você depura seu aplicativo, isso normalmente significa executar o aplicativo com o depurador anexado. Quando você faz isso, o depurador fornece várias maneiras de mostrar o que o código está fazendo enquanto é executado. Você pode percorrer o código e examinar os valores armazenados em variáveis, definir inspeções em variáveis para ver quando os valores mudam, examinar o caminho de execução do código, ver se um branch de código está em execução e assim por diante. Se esta for sua primeira tentativa de depurar um código, leia Como depurar para iniciantes absolutos antes continuar neste artigo.
Embora o aplicativo de demonstração esteja em C++, a maioria dos recursos são aplicáveis a C#, Visual Basic, F#, Python, JavaScript e outras linguagens compatíveis com o Visual Studio (o F# não é compatível com editar e continuar. O F# e o JavaScript não são compatíveis com a janela Autos). As capturas de tela estão em C++.
Neste tutorial, você irá:
- Iniciar o depurador e atingir os pontos de interrupção.
- Aprender os comandos para percorrer o código no depurador
- Inspecionar variáveis em dicas de dados e janelas do depurador
- Examinar a pilha de chamadas
Pré-requisitos
É necessário ter o Visual Studio instalado e a carga de trabalho Desenvolvimento para desktop com C++.
Se você ainda não tiver instalado o Visual Studio, acesse a página Downloads do Visual Studio para instalá-lo gratuitamente.
Se você ainda não tiver instalado o Visual Studio 2022, acesse a página Downloads do Visual Studio 2022 para instalá-lo gratuitamente.
Caso precise instalar a carga de trabalho, mas já tiver o Visual Studio, acesse Ferramentas>Obter Ferramentas e Funcionalidades..., que abre o Instalador do Visual Studio. O Instalador do Visual Studio é iniciado. Escolha a carga de trabalho Desenvolvimento para desktop com C++ e, em seguida, selecione Modificar.
Criar um projeto
Primeiro, você criará um projeto de aplicativo de console C++. O tipo de projeto inclui todos os arquivos de modelo que você precisará, mesmo sem adicionar nada!
Abra o Visual Studio.
Se a janela inicial não estiver aberta, escolha Arquivo>Janela Inicial.
Na tela Iniciar, selecione Criar um novo projeto.
Na janela Criar um novo projeto, insira ou digite console na caixa de pesquisa. Em seguida, escolha C++ na lista Linguagem de programação e, em seguida, escolha Windows na lista Plataforma.
Depois de aplicar os filtros de linguagem de programação e plataforma, escolha o modelo Aplicativo de Console e, em seguida, escolha Avançar.
Observação
Se não vir o modelo Aplicativo de Console, instale-o por meio da janela Criar um novo projeto. Na mensagem Não encontrou o que precisa?, escolha o link Instalar mais ferramentas e recursos. Em seguida, no Instalador do Visual Studio, escolha a carga de trabalho Desenvolvimento da área de trabalho com C++.
Na janela Configurar seu novo projeto, digite ou insira iniciar-depuração na caixa Nome do projeto. Em seguida, escolha Criar.
O Visual Studio abre seu novo projeto.
Criar o aplicativo
Em get-started-debugging.cpp, substitua todo o código padrão pelo seguinte código:
#include <string> #include <vector> #include <iostream> void SendMessage(const std::wstring& name, int msg) { std::wcout << L"Hello, " << name << L"! Count to " << msg << std::endl; } int main() { std::vector<wchar_t> letters = { L'f', L'r', L'e', L'd', L' ', L's', L'm', L'i', L't', L'h' }; std::wstring name = L""; std::vector<int> a(10); std::wstring key = L""; for (int i = 0; i < letters.size(); i++) { name += letters[i]; a[i] = i + 1; SendMessage(name, a[i]); } std::wcin >> key; return 0; }
Inicie o depurador.
Pressione F5 (Depurar >Iniciar depuração) ou o botão Iniciar depuração na barra de ferramentas Depurar.
F5 inicia o aplicativo com o depurador anexado ao processo do aplicativo, mas nós ainda não fizemos nada de especial para examinar o código. Portanto, o aplicativo apenas é carregado e a saída do console é exibida.
Hello, f! Count to 1 Hello, fr! Count to 2 Hello, fre! Count to 3 Hello, fred! Count to 4 Hello, fred ! Count to 5 Hello, fred s! Count to 6 Hello, fred sm! Count to 7 Hello, fred smi! Count to 8 Hello, fred smit! Count to 9 Hello, fred smith! Count to 10
Neste tutorial, vamos analisar melhor esse aplicativo usando o depurador e analisar os recursos do depurador.
Pare o depurador pressionando o botão de parada vermelho (Shift + F5).
Na janela do console, pressione uma tecla e pressione Enter para fechar a janela do console.
Definir um ponto de interrupção e iniciar o depurador
No loop
for
da funçãomain
, defina um ponto de interrupção clicando na margem esquerda da seguinte linha de código:name += letters[i];
Aparece um círculo vermelho no qual você definiu o ponto de interrupção.
Pontos de interrupção são um dos recursos mais básicos e essenciais de uma depuração confiável. Um ponto de interrupção indica quando o Visual Studio deve suspender o código em execução para que você possa examinar os valores das variáveis ou o comportamento de memória ou se uma ramificação de código está sendo executada ou não.
Pressione F5 ou o botão Iniciar depuração. O aplicativo é iniciado e o depurador executa a linha de código em que você definiu o ponto de interrupção.
A seta amarela representa a instrução na qual o depurador ficou em pausa, que também suspende a execução do aplicativo no mesmo ponto (essa instrução ainda não foi executada).
Se o aplicativo ainda não estiver em execução, F5 iniciará o depurador e o interromperá no primeiro ponto de interrupção. Caso contrário, F5 continuará executando o aplicativo até o próximo ponto de interrupção.
Os pontos de interrupção são um recurso útil quando você sabe qual linha ou seção de código deseja examinar em detalhes. Para obter informações sobre os diferentes tipos de pontos de interrupção que você pode definir, como pontos de interrupção condicionais, confira Como usar pontos de interrupção.
Navegar pelo código no depurador usando comandos de etapa
Geralmente, usamos atalhos de teclado aqui porque essa é uma boa maneira de executar o aplicativo rapidamente no depurador (os comandos equivalentes, como os comandos de menu, são mostrados entre parênteses).
Enquanto estiver em pausa no
for
loop no métodomain
, pressione duas vezes F11 (ou escolha Depurar > Intervir) para avançar na chamada de métodoSendMessage
.Depois de pressionar F11 duas vezes, você deve estar nessa linha de código:
SendMessage(name, a[i]);
Pressione F11 mais uma vez para intervir no método
SendMessage
.O ponteiro amarelo avança para o método
SendMessage
.F11 é o comando Intervir, que avança a execução do aplicativo uma instrução por vez. F11 é uma boa maneira de examinar o fluxo de execução com o máximo de detalhes. (Para mover-se mais rapidamente por meio do código, mostramos também algumas outras opções.) Por padrão, o depurador ignora o código que não é de usuário (se você quiser mais detalhes, consulte Apenas Meu Código).
Digamos que você terminou de examinar o método
SendMessage
e queira sair do método, mas continuar no depurador. Você pode fazer isso usando o comando Depuração Circular.Pressione Shift + F11 (ou Depurar > Sair).
Este comando retoma a execução do aplicativo (e avança o depurador) até que o método ou a função atual retorne.
Você deve estar de volta no loop
for
do métodomain
, pausado na chamada de métodoSendMessage
.Pressione F11 várias vezes até voltar à chamada de método
SendMessage
novamente.Enquanto estiver em pausa na chamada de método, pressione F10 (ou escolha Depurar > Entrar método) uma vez.
Observe neste momento que o depurador não intervém no método
SendMessage
. F10 avança o depurador sem intervir em funções ou métodos no código do aplicativo (o código ainda é executado). Pressionando F10 na chamada do métodoSendMessage
(em vez de F11), ignoramos o código de implementação deSendMessage
(que, no momento, talvez não seja de nosso interesse). Para obter mais informações sobre diferentes maneiras de percorrer seu código, confira Navegar pelo código no depurador.
Navegar usando Executar até o Clique
Pressione F5 para avançar para o ponto de interrupção.
No editor de códigos, role para baixo e passe o mouse sobre a função
std::wcout
no métodoSendMessage
até que o botão verde Executar até o Clique apareça à esquerda. A dica de ferramenta para o botão mostra "Realizar a execução até aqui".Observação
O botão Executar até o Clique é novo no Visual Studio 2017. (Se o botão de seta verde não for exibido, use F11 neste exemplo para avançar o depurador até o lugar certo.)
Escolha o botão Executar para clicar.
O depurador avança para a função
std::wcout
.O uso desse botão é semelhante à configuração de um ponto de interrupção temporário. Executar até o Clique é útil para abranger rapidamente uma região visível do código do aplicativo (você pode clicar em qualquer arquivo aberto).
Reinicie o aplicativo rapidamente
Clique no botão Reiniciar na Barra de Ferramentas de Depuração (Ctrl + Shift + F5).
Ao pressionar Reiniciar, você economiza tempo em comparação com a opção de parar o aplicativo e reiniciar o depurador. O depurador é pausado no primeiro ponto de interrupção que é atingido pela execução do código.
O depurador vai parar novamente no ponto de interrupção que você definiu anteriormente dentro do loop for
.
Inspecionar variáveis com dicas de dados
Os recursos que permitem que você inspecione variáveis são uns dos mais úteis do depurador e há diferentes maneiras de fazer isso. Muitas vezes, ao tentar depurar um problema, você tenta descobrir se as variáveis estão armazenando os valores que elas deveriam conter em um momento específico.
Com a instrução
name += letters[i]
pausada, passe o mouse sobre a variávelletters
e você verá o valor padrão.size={10}
Expanda a variável
letters
para ver suas propriedades, que incluem todos os elementos que a variável contém.Agora, passe o mouse sobre a variável
name
e você verá o valor atual dela: uma cadeia de caracteres vazia.Pressione F5 (ou Depurar>Continuar) algumas vezes para iterar várias vezes no loop
for
, pausando novamente no ponto de interrupção e passando o mouse sobre a variávelname
a cada vez para verificar o seu valor.O valor da variável é alterado a cada iteração do loop
for
, mostrando valores def
, depoisfr
,fre
e assim por diante.Muitas vezes, durante a depuração, você deseja uma maneira rápida de verificar valores de propriedade em variáveis, para ver se eles estão armazenando os valores que você espera que armazenem. As dicas de dados são uma boa maneira de fazer isso.
Inspecionar variáveis com as janelas Autos e Locais
Examine a janela Autos na parte inferior do editor de códigos.
Se ela estiver fechada, abra-a enquanto está em pausa no depurador, escolhendo Depurar>Janelas>Autos.
Na janela Autos, veja as variáveis e seus valores atuais. A janela Autos mostra todas as variáveis usadas na linha atual ou a linha anterior (verifique a documentação para saber o comportamento específico a uma linguagem).
Em seguida, examine a janela Locais, em uma guia ao lado da janela Autos.
Expanda a variável
letters
para mostrar os elementos que ela contém.A janela Locais mostra as variáveis que estão no escopo atual, ou seja, o contexto de execução atual.
Definir uma inspeção
Na janela principal do editor de código, clique com o botão direito do mouse na variável
name
e escolha Adicionar Inspeção.A janela Inspeção é aberta na parte inferior do editor de códigos. Você pode usar uma janela Inspeção para especificar uma variável (ou uma expressão) que deseja acompanhar.
Agora há uma inspeção definida na variável
name
e você pode ver o valor sendo alterado enquanto percorre o depurador. Ao contrário das outras janelas de variáveis, a janela Inspeção sempre mostra as variáveis que você está inspecionando (eles ficam esmaecidas quando estão fora do escopo).
Examinar a pilha de chamadas
Durante a pausa no loop
for
, clique na janela Pilha de Chamadas que fica aberta por padrão no painel inferior direito.Se ela estiver fechada, abra-a enquanto está em pausa no depurador, escolhendo Depurar>Janelas>Pilha de Chamadas.
Clique em F11 algumas vezes até que o depurador seja pausado no método
SendMessage
. Examine a janela Pilha de Chamadas.A janela Pilha de Chamadas mostra a ordem em que os métodos e as funções são chamados. A linha superior mostra a função atual (o método
SendMessage
neste aplicativo). A segunda linha mostra queSendMessage
foi chamado por meio do métodomain
e assim por diante.Observação
A janela Pilha de Chamadas é semelhante à perspectiva de Depuração em alguns IDEs, como o Eclipse.
A pilha de chamadas é uma boa maneira de examinar e entender o fluxo de execução de um aplicativo.
Você pode clicar duas vezes em uma linha de código para examinar esse código-fonte. Isso também altera o escopo atual que está sendo inspecionado pelo depurador. Essa ação não avança o depurador.
Você também pode usar os menus acessados ao clicar com o botão direito do mouse na janela Pilha de Chamadas para fazer outras coisas. Por exemplo, você pode inserir pontos de interrupção em funções especificadas, avançar o depurador usando Executar até o Cursor e examinar o código-fonte. Para obter mais informações, confira Como examinar a pilha de chamadas.
Alterar o fluxo de execução
Pressione F11 duas vezes para executar a função
std::wcout
.Com o depurador em pausa na chamada de método
SendMessage
, use o mouse para pegar a seta amarela (o ponteiro de execução) à esquerda e movê-la uma linha para cima, até ostd::wcout
.Pressione F11.
O depurador executa novamente a função
std::wcout
(você vê isso na saída da janela do console).Alterando o fluxo de execução, você pode fazer coisas como testar caminhos de execução de código diferentes ou executar novamente o código sem reiniciar o depurador.
Aviso
Geralmente, você precisa ter cuidado com esse recurso. Um aviso é exibido na dica de ferramenta. Outros avisos também podem ser exibidos. Ao mover o ponteiro não é possível reverter o aplicativo para um estado anterior.
Pressione F5 para continuar a execução do aplicativo.
Parabéns por concluir este tutorial.
Próximas etapas
Neste tutorial, você aprendeu como iniciar o depurador, percorrer o código e inspecionar variáveis. Talvez você queira obter uma visão geral dos recursos do depurador, com links para mais informações.