Pergunta

É possível que o depurador (ou o manipulador de exceção CLR) para mostrar a linha onde a exceção aconteceu no modo de versão usando o pdb?

O código, no modo de versão, é otimizado e nem sempre seguem a ordem e lógica do código "original".

Também é surpreendente que o depurador pode navegar através de meu código passo a passo, mesmo no modo de versão. A otimização deve tornar a navegação muito inconfortable.

Você poderia por favor esclarecer esses dois pontos para mim?

Foi útil?

Solução

Eu não sou tão familiarizado com a forma como isso é feito com CLR, mas é provavelmente muito semelhante à forma como ele é feito com código nativo. Quando o compilador gera instruções de máquina, ele adiciona entradas ao APO que, basicamente, dizer "a instrução no endereço atual, X, veio da linha 25 em foo.cpp".

O depurador sabe o endereço de programa está em execução. Portanto, parece-se algum endereço, X, no APO e vê que ele veio de linha 25 em foo.cpp. Usando isso, é capaz de "passo" através de seu código-fonte.

Este processo é o mesmo, independentemente do modo de lançamento de depuração ou (desde que a APO é gerado em tudo no modo de versão). Você está certo, no entanto, que muitas vezes no modo de versão devido a otimizações do depurador não passo "linearmente" através do código. Ele pode saltar em torno de diferentes linhas inesperadamente. Isto é devido ao otimizador mudando a ordem das instruções, mas isso não muda o mapeamento endereço-to-source-line, de modo que o depurador ainda é capaz de segui-lo.

Outras dicas

[@ Não Tenho Certeza] tem quase certa. O compilador faz uma melhor esforço na identificação de um número de linha apropriado que intimamente corresponde a instrução código de máquina atual.

A APO eo depurador não sei nada sobre otimizações; o arquivo PDB essencialmente mapas locais de endereço no código de máquina para números de linhas de código fonte. No código otimizado, nem sempre é possível para corresponder exatamente uma instrução de montagem para uma linha específica de código-fonte, para que o compilador vai escrever ao APO a coisa mais próxima que tem em mãos. Isso pode ser "a linha de código-fonte antes", ou "a linha de código-fonte do contexto envolvente (circular, etc)" ou qualquer outra coisa.

Independentemente disso, o depurador essencialmente encontra a entrada no APO mapear mais próximo (como em "antes ou igual") para o IP atual (Instruction Pointer) e destaques dessa linha.

Às vezes o jogo não é muito bom, e isso é quando você vê a área destacada saltando em todo o lugar.

O depurador faz uma suposição de melhor esforço de onde ocorreu o problema. Não é garantido para ser 100% exato, e com totalmente otimizado código, será muitas vezes imprecisas -. Eu encontrei as imprecisões que variam de algumas linhas fora para ter uma pilha de chamadas totalmente errado

Como precisa o depurador é com código otimizado realmente depende do próprio código e que otimizações que você está fazendo.

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