Pergunta

Se eu tiver uma DLL (que foi construído em modo release) eo arquivo PDB correspondente, é possível depurar (passo-a) as classes / métodos contida nessa DLL?

Se sim, quais são os passos necessários / configuração (por exemplo, onde colocar o arquivo PDB)?

Editar:

Se tiver o arquivo PDB no mesmo lugar que a DLL (no diretório bin / debug de uma aplicação simples teste de console). Eu posso ver que os símbolos para a DLL são carregados (na janela de saída e também na janela de Módulos), mas ainda não posso passo para os métodos de que DLL.

Poderia ser este o resultado de otimizações do compilador (como descrito por Michael em sua resposta)?

Foi útil?

Solução 3

Eu finalmente encontrei o que causa os problemas de depuração uma DLL que foi construído em configuração de lançamento:

Em primeiro lugar, que basicamente funciona como esperado. O que significa, se eu tiver uma DLL construído na liberação configuração mais o arquivo PDB correspondente, então eu posso depurar as classes / métodos contida nessa DLL.

Quando eu tentei primeiramente este, eu infelizmente tentou passo para métodos de uma classe que tem o DebuggerStepThroughAttribute , por exemplo:

[System.Diagnostics.DebuggerStepThrough]
public class MyClass {
    public void Test() { ... }
}

Nesse caso, é claro, não é possível passo no método do depurador (como esperado / pretendida).

Então, tudo funciona como deveria. Muito obrigado por suas respostas.

Outras dicas

A APO é normalmente (para mim pelo menos) detectado se ele fica ao lado da dll (como com os arquivos intellisense XML).

Como alternativa; você vai precisar de um ponto de ruptura após o módulo foi carregado ...

No ponto-break, abrir a janela de "módulos" (Ctrl + D, M - ou Debug-> Windows-> Modules). Botão direito do mouse em seu dll "símbolos de carga a partir", "caminho Símbolo", etc.

Sim, você pode depurar código de liberação com um APO. Existem algumas armadilhas no entanto, com a depuração de código otimizado, mais info aqui e aqui .

O seu APO só precisa estar em um lugar que o depurador pode encontrá-lo - para depuração mesmo diretório local como a dll é geralmente mais fácil. Caso contrário, colocá-lo em algum lugar que o depurador pode encontrá-lo, e aponte o depurador para aquele lugar com o caminho de símbolo.

Depuração de um compilação de lançamento é normalmente muito mais difícil que a depuração de uma versão de depuração. Em geral, você vai precisar de algum entendimento do assembler x86 e provavelmente você vai passar algum tempo olhando para a janela desmontagem. Isso tende a ser a única maneira de descobrir o que linha de código que você está realmente em uma vez em uma compilação de lançamento com otimizações no compilador pode fazer inlining significativo e reordenação de instruções. Além disso, eu encontrar o depurador com frequência não consegue relatar corretamente os valores das variáveis. Se você precisa saber o valor de uma variável e você não tem certeza que o depurador está correta, vá para a janela de desmontagem e encontrar a localização de memória ou registrá-lo está localizado na.

Os arquivos PDB podem ser armazenados em um servidor de símbolos. Confira Configurar um servidor de símbolos para um bom tutorial. Cada compilação nós produto em uma máquina de compilação publica os símbolos para o nosso servidor de símbolos, para que possamos sempre depurar qualquer despejos de memória que recebemos de Winqual.

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