Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo explica quais opções de compilador devem ser definidas para permitir que você depure melhor o código otimizado.
Uma experiência melhor está disponível a partir do Visual Studio 2022 versão 17.14 que permite depurar código otimizado como se fosse compilado não otimizado, mantendo a velocidade do código otimizado. Para obter mais informações, consulte C++ Dynamic Debugging (Preview).
Observação
As caixas de diálogo e os comandos de menu exibidos podem ser diferentes dos descritos na Ajuda, dependendo das configurações ativas ou da edição. Para alterar as suas definições, escolha Importar e Exportar Configurações no menu Ferramentas. Para obter mais informações, consulte Redefinir todas as configurações.
Observação
A opção de compilador /Zo (Enhance Optimized Debugging) (introduzida no Visual Studio Update 3) gera informações de depuração mais ricas para código otimizado (projetos que não são criados com a opção de compilador /Od . Consulte /O Options (Otimização de Código). Isso inclui suporte aprimorado para depuração de variáveis locais e funções embutidas.
Edit and Continue é desativado quando a opção de compilador /Zo é usada.
Quando o compilador otimiza o código, ele reposiciona e reorganiza as instruções. Isso resulta em um código compilado mais eficiente. Devido a esse rearranjo, o depurador nem sempre consegue identificar o código-fonte que corresponde a um conjunto de instruções.
A otimização pode afetar:
O otimizador pode remover variáveis locais ou movê-las 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, o que poderá estar incorreto se o otimizador mesclar duas funções.
Os quadros que você vê na pilha de chamadas estão quase sempre corretos, no entanto, supondo que você tenha símbolos para todos os quadros. Os quadros na pilha de chamadas estarão errados se houver corrupção da pilha, se tiveres funções escritas em linguagem assembly, ou se existirem quadros do sistema operativo sem símbolos correspondentes na pilha de chamadas.
As variáveis globais e estáticas são sempre mostradas corretamente. O mesmo se aplica ao layout da estrutura. Se você tiver um ponteiro para uma estrutura e o valor do ponteiro estiver correto, cada variável membro da estrutura mostrará o valor correto.
Devido a essas limitações, você deve depurar usando uma versão não otimizada do seu programa, se possível. Por padrão, a otimização é 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 apenas em uma versão otimizada de um programa. Nesse caso, você deve depurar o código otimizado.
Para ativar a otimização em uma configuração de compilação de depuração
Ao criar um novo projeto, selecione o
Win32 Debugdestino. Use oWin32 Debugdestino até que seu programa esteja totalmente depurado e você esteja pronto para criar umWin32 Releasedestino. O compilador não otimiza oWin32 Debugdestino.Selecione o projeto no Gerenciador de Soluções.
No menu Ver, clique em Páginas de Propriedades.
Na caixa de diálogo Páginas de Propriedades, assegure-se de que
Debugestá selecionado na lista suspensa Configuração.Na vista de pastas à esquerda, selecione a pasta C/C++ .
Na pasta C++ , selecione
Optimization.Na lista de propriedades à direita, localize
Optimization. A configuração ao lado provavelmente dizDisabled (/Od). Escolha uma das outras opções (Minimum Size``(/O1),Maximum Speed``(/O2),Full Optimization``(/Ox)ouCustom).Se você escolheu a
Customopção paraOptimization, agora você pode definir opções para qualquer uma das outras propriedades mostradas na lista de propriedades.Selecione o nó Propriedades de Configuração, C/C++, Linha de Comando da página de propriedades do projeto e adicione
(/Zo)à caixa de texto Opções Adicionais .Advertência
Adicionar
/Zodesativa Editar e Continuar.Ao depurar o código otimizado, use a janela Desmontagem para ver quais instruções são criadas e executadas. Ao definir pontos de interrupção, você precisa saber que o ponto de interrupção pode se 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 nessa 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 apenas uma vez. Isso ocorre porque a primeira instrução define o valor de x 0. O compilador reconhece que isso só tem que ser feito uma vez e move-lo para fora do loop. O ponto de interrupção move-se com ele. As instruções que comparam e incrementam x permanecem dentro do loop. Quando você visualiza a janela Desmontagem , a unidade de etapa é automaticamente definida como Instrução para maior controle, o que é útil quando você percorre o código otimizado.