Share via


Depurar o código otimizado

Observação

As caixas de diálogo e os comandos de menu encontrados podem diferir daqueles descritos na Ajuda, dependendo das configurações ativas ou edição. Para alterar suas configurações, selecione Importar e Exportar Configurações no menu Ferramentas . Para obter mais informações, confira Redefinir todas as configurações.

Observação

96+A opção do compilador /Zo (Aprimorar Depuração Otimizada) (introduzida no Visual Studio Atualização 3) gera informações mais avançadas de depuração para código otimizado (projetos que não são criados com a opção do compilador /Od. Confira Opções /O (Otimizar Código)). Isso inclui suporte aprimorado à depuração de variáveis locais e funções embutidas.

Editar e Continuar é desabilitado quando a opção do compilador /Zo é usada.

Quando o compilador otimiza o código, ele reposiciona e reclassifica instruções. Isso resulta em um código compilado mais eficiente. Devido a esse rearranjo, o depurador nem sempre pode identificar o código-fonte que corresponde a um conjunto de instruções.

A otimização pode afetar:

  • As variáveis locais, que podem ser removidas pelo otimizador ou movidas para locais que o depurador não entende.

  • Posições dentro de uma função, que são alteradas quando o otimizador mescla blocos de código.

  • Nomes de função para quadros na pilha de chamadas, que pode estar errado se o otimizador mesclar duas funções.

    Os quadros que você vê na pilha de chamadas estão quase sempre corretos, porém, supondo que você tenha símbolos para todos os quadros. Os quadros na pilha de chamadas estarão incorretos se você tiver um dano na pilha, se você tiver as funções escritas na linguagem assembly, ou se houver quadros do sistema operacional sem símbolos correspondentes na pilha de chamadas.

    As variáveis globais e estáticas são sempre mostradas corretamente. Da mesma forma que o layout da estrutura. Se você tiver um ponteiro para uma estrutura e o valor do ponteiro estiver correto, cada variável de membro da estrutura mostrará o valor correto.

    Devido a essas restrições, você deverá depurar usando uma versão não otimizada do programa se isso for possível. Por padrão, a otimização está desativada na configuração de Depuração de um programa C++ e ativada na configuração de Versão.

    No entanto, um bug pode aparecer somente em uma versão otimizada de um programa. Nesse caso, você deverá depurar o código otimizado.

Para ativar a otimização em uma configuração da compilação de Depuração

  1. Quando você cria um novo projeto, selecione o destino de Win32 Debug. Use o destino Win32 Debug até que seu programa seja depurado completamente e você esteja pronto para compilar um destino de Win32 Release. O compilador não otimiza o destino de Win32 Debug.

  2. Selecione o projeto no Gerenciador de Soluções.

  3. No menu Exibir, clique em Página de Propriedades.

  4. Na caixa de diálogo Páginas de Propriedades, verifique se Debug está selecionado na lista suspensa Configuração.

  5. Na exibição da pasta à esquerda, selecione a pasta C/C++.

  6. Na pasta C++, selecione Optimization.

  7. Na lista de propriedades à direita, localize Optimization. A configuração ao lado provavelmente informa Disabled (/Od). Escolha uma dessas opções (Minimum Size``(O1), Maximum Speed``(/O2), Full Optimization``(/Ox) ou Custom).

  8. Se você escolher a opção Custom para Optimization, agora poderá definir opções para qualquer uma das outras propriedades mostradas na lista de propriedades.

  9. Selecione Propriedades de Configuração, C/C++, Nó de Linha de Comando da página de propriedades do projeto e adicione (/Zo) à caixa de texto Opções Adicionais.

    Aviso

    A adição de /Zo desabilitará Editar e Continuar.

    Quando você depura o código otimizado, use a janela Desmontagem para ver quais instruções de fato estão criadas e executadas. Quando você define pontos de interrupção, precisa saber que o ponto de interrupção pode mover junto com uma instrução. Por exemplo, considere o seguinte código:

for (x=0; x<10; x++)

Suponha que você defina um ponto de interrupção nesta linha. Você pode esperar que o ponto de interrupção seja atingido 10 vezes, mas se o código for otimizado, o ponto de interrupção será atingido somente uma vez. Isso ocorre porque a primeira instrução define o valor de x como 0. O compilador reconhece que isso somente precisa ser feito uma vez e o move para fora do loop. O ponto de interrupção também será movido. As instruções que comparam e incrementam x permanecem dentro do loop. Quando você exibe a janela Desmontagem, a unidade da etapa será definida automaticamente como Instrução para obter maior controle, o que é útil quando você passa por código otimizado.