Há alguns dias, falamos sobre problemas enfrentados ao tentar depurar uma aplicação compilada em modo Release. Entretanto, no “mundo real”, o problema que encontramos com mais frequência são sistemas, em produção, compilados em modo Debug.
Nesse post vamos trazer um pouco da diferença entre “buildar” em debug e “buildar” em release.
Diferenças entre compilação em Debug e em Release
A ênfase do compilador, em modo Debug, é gerar o máximo de informações possível para facilitar o trabalho de depuração. Em função disso, poucas otimizações são implementadas tanto no processo de compilação do código-fonte em Intermediate Language, quanto no processo que compila o código em Intermediate Language em binário (pelo JIT).
A informação de stack trace gerada em modo Debug é mais rica. Afinal, os arquivos PDB (Program Database files) são muito mais ricos.
No modo Release, o código é submetido a otimização pelo JIT e muito deste código pode deixar de existir ou pode ser reescrito pelo processo de otimização, consumindo também menos memória em runtime.
IMPORTANTE: Testes de performance SEMPRE devem ser feitos em Release. É comum vermos duas opções de código com diferenças de performance significativas quando compiladas em Debug, terem o mesmo desempenho quando compiladas em Release.
Algumas palavras sobre .PDB
Program database (PDB) é um formato proprietário (criado pela Microsoft) que armazena informações importantes para depuração de programas. Ele é criado, geralmente, a partir do código-fonte durante o processo de compilação.
O arquivo .PDB contem uma lista de todos os símbolos econtrados em um programa junto com o nome do arquivo e a respectiva linha do código-fonte onde o símbolo foi definido.
Arquivos .PDB não devem, por padrão, ser distribuídos por padrão em ambientes de produção por conter informações demais que podem adicionar um nível extra de vulnerabilidade. Entretanto, eles são muito úteis quando estamos procedendo algum diagnóstico avançado (envolvendo dumps de memória)
Concluindo
Modos Debug e Release geram códigos executáveis diferentes, com performances diferentes e com propósitos diferentes. Lembre-se de testar sua aplicação compilando seu código em ambos os modos.
Utilize o modo Debug e o modo Release apropriadamente, guarde os arquivos .PDB (gerados no build) para cenários de depuração de erros em produção.
Em posts futuros, iremos falar sobre cenários avançados de depuração – tanto para o ambiente de desenvolvimento, como em produção.
No aspnet core tornou-se mais comum que a compilação em release também gere os arquivos pdbs durante a publicação. Então o melhor a se fazer é armazenar esses arquivos em um lugar seguro acompanhando o versionamento e não enviá-los para o ambiente do cliente?
Flávio, obrigado pelo comentário.
Os arquivos .PDBs precisam ficar separados do binário final “onde está publicado”, é uma boa prática.
Geralmente utilizamos um Symbol Server.
Abraços!
Interessante esse artigo. Já vi muitos desses arquivos no servidor de produção e nunca me atentei para isso. Obrigado Elemar.
Obrigado. Mas o post é do Tiago Tartari. 🙂