Pergunta

De modo a ser capaz de adequadamente liberação depuração cria um arquivo PDB é necessário. Pode o arquivo PDB tornar-se menos útil quando o compilador usa diferentes tipos de otimizações (FPO, PGO, funções intrínsecas, inlining etc.)? Se assim for, é o efeito de otimização grave ou apenas causa linhas adjacentes de código para se misturam?

(estou usando VC2005, e será sempre escolher debugability sobre o desempenho otimizado - mas a questão é geral)

Foi útil?

Solução

Sim, código otimizado é menos debuggable. Não só está faltando alguma informação, algumas informações serão muito enganosa.

O maior problema na minha opinião é variáveis ??locais. O compilador pode usar o mesmo endereço pilha ou registar-se para múltiplas variáveis ??ao longo de uma função. Como outras pôsteres mencionados, às vezes até descobrir o que o ponteiro "este" é pode levar um pouco de tempo. Quando a depuração otimizado código que você pode ver a linha atual pulando como você única etapa, uma vez que o compilador reorganizou o código gerado. Se você usar PGO, esta em torno de salto provavelmente só irá piorar.

FPO não deve afetar debuggability muito desde que você tenha um APO já que o PDB contém todas as informações necessárias para relaxar a pilha para quadros FPO. FPO pode ser um problema ao usar ferramentas de que precisam para tomar rastreamentos de pilha sem símbolos. Para muitos projectos, o benefício perf de FPO hoje em dia não superam o hit para diagnosticabilidade; por esta razão, MS decidiu não construir Windows Vista com a otimização FPO ( http://blogs.msdn.com/larryosterman/archive/2007/03/12/fpo.aspx ).

Eu prefiro para depurar código unoptimized mas isso nem sempre é possível - alguns problemas só repro com código otimizado, despejos de memória do cliente são da compilação lançada, e obter uma depuração implantado privado às vezes não é possível. Muitas vezes, quando a depuração de código otimizado, eu uso a exibição de desmontagem - dissasembly Never Lies

.

Isso tudo se aplica a windbg desde que eu fazer tudo o código nativo depuração com ele. depurador do Visual Studio pode lidar com alguns desses casos, melhor.

Outras dicas

Sim. Pode ser grave, às vezes, apesar de que é geralmente mais o resultado de inlining ou reordenação de código.

As variáveis ??locais também não pode ser exibido com precisão na janela do relógio como eles só podem existir nos registos e não pode ser exibido corretamente quando você alternar quadros de pilha.

A otimização pode afetar seriamente a depuração em qualquer plataforma (não apenas arquivos PDB do VC).

Exatamente pelas razões que você mencionou, a função inlining pode, em alguns casos, completamente Confuse qual as instruções pertencem a qual a função (desde às vezes eles meio que pertencem a ambos).

Também uma optimização comum é fazer "sujas" pilha quadros (-fomit-frame-ponteiro no GCC), que faz com que o código não para controlar o topo da pilha. Isso é bom, ele libera um registo adicional (ebp em x86) para outras operações. Mas torna-se quase impossível para relaxar a pilha para ver o que está realmente acontecendo. Ele também faz com que seja quase impossível para encontrar as variáveis ??locais e parâmetros de função na pilha.

Em geral: Não espere para obter informações de depuração útil fora "release" constrói. Se a depuração é que, mesmo na versão importantes, então você deve estar "lançando" compilações de depuração em seu lugar.

Além de variáveis ??locais, o ponteiro 'this' é tipicamente otimizado afastado em otimizado constrói. Isto pode ser, por vezes contornado por subir o suficiente na pilha de chamadas para o ponto onde o ponteiro do objeto ou referência existe como uma variável não-otimizado-away.

Em geral. single-stepping na construção otimizado geralmente funciona mais ou menos e permite um para ver o que decisões lógicas as marcas de código. Examinando os dados em que se baseiam essas decisões é geralmente muito mais complicado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top