Depurando uma versão de lançamento de uma DLL (com o arquivo PDB)

Se eu tiver uma DLL (que foi criada no modo de lançamento) e o arquivo PDB correspondente, é possível depurar (step-into) classs / methods contidos nessa DLL?

Em caso afirmativo, quais são as etapas / configurações necessárias (por exemplo, onde colocar o arquivo PDB)?

Editar:

Se tiver o arquivo PDB no mesmo local que a DLL (no diretório bin / debug de um aplicativo de teste de console simples). 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 consigo entrar nos methods dessa DLL.

Isso poderia ser o resultado de otimizações de compilador (como descrito por Michael em sua resposta)?

O pdb é normalmente (pelo menos para mim) detectado se estiver ao lado da dll (como nos arquivos xml intellisense).

Alternativamente; você precisará de um ponto de interrupção após o carregamento do módulo …

No ponto de interrupção, abra a janela “Módulos” (Ctrl + D, M – ou Debug -> Windows -> Módulos). Clique com o botão direito do mouse em sua dll “Carregar símbolos de”, “Caminho do símbolo” etc.

Sim, você pode depurar o código de lançamento com um PDB. Há algumas armadilhas, no entanto, com o código otimizado de debugging, mais informações aqui e aqui .

Seu PDB só precisa estar em um lugar que o depurador pode encontrá-lo – para local de debugging do mesmo diretório como a dll é geralmente mais fácil. Caso contrário, coloque-o em algum lugar em que o depurador possa encontrá-lo e aponte o depurador para esse local com o caminho do símbolo.

Eu finalmente encontrei o que causa os problemas de debugging de uma DLL que foi construída na configuração de lançamento:

Primeiro de tudo, basicamente funciona como esperado. O que significa que, se eu tiver uma DLL construída em release-configuration mais o arquivo PDB correspondente, então eu posso depurar as classs / methods contidos nessa DLL.

Quando eu tentei isso, infelizmente eu tentei entrar em methods de uma class que tem o DebuggerStepThroughAttribute , por exemplo:

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

Nesse caso, é claro que não é possível entrar no método a partir do depurador (conforme esperado / planejado).

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

A debugging de uma compilation de lançamento é normalmente muito mais difícil do que depurar uma versão de debugging. Em geral, você precisará de um pouco de compreensão do assembler x86 e provavelmente passará algum tempo observando a janela de desassembly. Esta tende a ser a única maneira de descobrir em qual linha de código você está realmente, já que em uma compilation de release com otimizações no compilador pode fazer um inlining significativo e reordenar a instrução. Além disso, descubro que o depurador frequentemente falha em relatar corretamente os valores das variables. Se você precisar saber o valor de uma variável e não tiver certeza de que o depurador está correto, vá para a janela de desassembly e encontre o local da memory ou registre-o.

Os arquivos pdb podem ser armazenados em um Symbol Server. Confira Configurando um Servidor de Símbolos para um bom tutorial. Cada produto que construímos em uma máquina de compilation publica os símbolos em nosso servidor de símbolos, para que possamos sempre depurar quaisquer despejos de falhas que recebemos do WinQual.