Como: Depurar código otimizado
This topic applies to:
Edition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Native only |
||||
Pro, Premium e Ultimate |
Native only |
Observação |
---|
Caixas de diálogo e comandos de menu que você vê podem diferir das descritas na Help dependendo das suas configurações ativas ou edição. Para alterar as configurações, escolha Import and Export Settings sobre o Ferramentas menu. For more information, see Trabalhando com configurações. |
Quando o compilador otimiza o código, ele reposiciona e reorganiza as instruções. Isso resulta em código compilado mais eficiente. Devido esta reorganização, o depurador não pode sempre identificar o código-fonte que corresponde a um conjunto de instruções.
Pode afetar a otimização:
Variáveis locais, que podem ser removidas pelo otimizador de ou movidas para locais que não entende o depurador.
Posições dentro de uma função, que são alteradas quando o otimizador de mescla de blocos de código.
Nomes de função para quadros na pilha de chamadas, podem estar incorretas se o otimizador mescla duas funções.
Os quadros que você vê na pilha de chamadas são quase sempre corretos, no entanto, supondo que você tenha de símbolos para todos os quadros. Os quadros na pilha de chamadas estará errados se você tiver uma corrupção de pilha, se você tiver funções escritas em linguagem assembly, ou se há quadros de sistema operacional sem símbolos correspondentes na pilha de chamadas.
As variáveis globais e estáticas são sempre mostradas corretamente. Portanto, é o layout da estrutura. Se você tiver um ponteiro para uma estrutura e o valor do ponteiro está correto, cada variável de membro da estrutura mostrará o valor correto.
Devido essas limitações, você deve depurar usando uma versão não otimizada do seu programa se possível. Por padrão, otimização é desativada na configuração de depuração de um Visual C++ de programa e ativado na configuração do lançamento.
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 de uma depuração construir configuração
Quando você cria um novo projeto, selecione o Win32 Debug de destino. Use o Win32Debug de destino até que seu programa totalmente está sendo depurado e você está pronto para criar um Win32 Release de destino. O compilador não otimiza o Win32 Debug de destino.
Selecione o projeto em Solution Explorer.
On the View menu, click Property Pages.
No Property Pages diálogo caixa, certifique-se Debug está selecionado na configuração na lista suspensa.
Na visualização de pastas, à esquerda, selecione o C/C++ pasta.
Sob o C++ pasta, selecione Optimization.
Na lista de propriedades da direita, localize Optimization. A configuração provavelmente diz Disabled (/Od). Choose one of the other options (Minimum Size (/O1), Maximum Speed (/O2), Full Optimization (/Ox), or Custom).
Se você escolheu o Custom opção para Optimization, agora, você pode definir opções para qualquer uma das propriedades mostradas na lista de propriedades.
Quando você depurar código otimizado, use o Disassembly janela para ver quais instruções, na verdade, são criadas e executadas. Ao definir pontos de interrupção, você precisa saber que o ponto de interrupção pode mover junto com uma instrução. For example, consider the following code:
for (x=0; x<10; x++)
Suponha que você definir um ponto de interrupção nesta linha. Você pode esperar que o ponto de interrupção sejam atingidos 10 vezes, mas se o código é otimizado, o ponto de interrupção é atingido somente uma vez. Isso ocorre porque a primeira instrução define o valor de x como 0. O compilador reconhece que isso só deve ser feita uma vez e move-sai do loop. O ponto de interrupção se move com ele. As instruções que comparam e incrementam x permanecem dentro do loop. Quando você visualiza o Disassembly janela, o a unidade de etapa é definida automaticamente a instrução para ter maior controle, que é útil quando você depurar código otimizado.