Possível duplicado Debug Visual Studio Release em .NET
Qual é a diferença entre Debug e Release no Visual Studio?
Possível duplicado Debug Visual Studio Release em .NET
Qual é a diferença entre Debug e Release no Visual Studio?
Respostas:
O mais importante é que no modo Debug não há otimizações, enquanto no modo Release há otimizações. Isso é importante porque o compilador é muito avançado e pode fazer algumas melhorias de baixo nível bem complicadas em seu código. Como resultado, algumas linhas do seu código podem ser deixadas sem nenhuma instrução ou algumas podem ficar todas misturadas. A depuração passo a passo seria impossível. Além disso, as variáveis locais são frequentemente otimizadas de maneiras misteriosas, então relógios e QuickWatches geralmente não funcionam porque a variável é "otimizada". E também há inúmeras outras otimizações. Tente depurar código .NET otimizado algum dia e você verá.
Outra diferença importante é que, por causa disso, as configurações de versão padrão não se preocupam em gerar informações extensas de símbolos de depuração. Esse é o arquivo .PDB que você deve ter notado e permite que o depurador descubra quais instruções de montagem correspondem a qual linha de código, etc.
"Debug" e "Release" são, na verdade, apenas dois rótulos para uma série de configurações que podem afetar sua construção e depuração.
No modo "Depurar", você geralmente tem o seguinte:
No modo "Release", as otimizações são ativadas (embora haja várias opções disponíveis) e a definição do pré-processador _DEBUG não é definida. Normalmente, você ainda desejará gerar os arquivos PDB, porque é muito útil ser capaz de "depurar" no modo de lançamento quando as coisas estão funcionando mais rápido.
Principalmente, a depuração inclui muitas informações extras úteis durante a depuração. No modo de liberação, tudo isso é cortado e negociado por desempenho.
Se você passar pelas opções de compilação do projeto e compará-las, verá quais são as diferenças.
Presumindo que a pergunta seja sobre código nativo / C ++ (não está totalmente claro a partir da frase):
Basicamente, em Debug, todas as otimizações de geração de código estão desativadas. Algumas bibliotecas (por exemplo, STL ) têm como padrão uma verificação de erros mais rígida (por exemplo, iteradores de depuração). Mais informações de depuração são geradas (por exemplo, para "Editar e continuar"). Mais coisas são geradas no código para detectar erros (os valores das variáveis locais são configurados para um padrão não inicializado e o heap de depuração é usado).
Além disso, aparentemente, o modo de depuração cria muitos threads extras para ajudar na depuração. Eles permanecem ativos durante toda a vida do processo, independentemente de você anexar um depurador ou não. Veja minha pergunta relacionada aqui .
Provavelmente, vale a pena mencionar o muito óbvio, que os sinalizadores de construção permitem lógicas diferentes que devem ser usadas apenas para alterar o registro e o "console" de mensagens, mas pode ser abusado e alterar drasticamente não apenas os níveis baixos, mas a lógica de negócios real.
Observe também que, ao usar o MFC, por exemplo, os projetos de depuração vinculam as versões DLL não redistribuíveis, como o MFC90D.DLL
link de compilações while em relação às versões redistribuíveis, como MFC90.DLL
. Isso provavelmente é semelhante a outras estruturas.
Portanto, você provavelmente não conseguirá executar aplicativos de compilação de depuração em máquinas que não sejam de desenvolvimento.
Também fiquei curioso sobre essa questão quando desenvolvi um aplicativo copiado de uma configuração de compilação de lançamento existente.
Eu tenho um desenvolvedor que é interessante em usar esse aplicativo no modo de depuração, então eu me perguntei o que seria necessário para fazer essa configuração de compilação que existe com um nome de ReleaseMyBuild copiado de uma configuração de versão (e, portanto, deve ter todas as configurações voltadas para otimizações de versão ) para mudar repentinamente de equipe e se tornar um build de depuração, apesar do nome confuso de configuração de build.
Achei que a configuração do projeto era apenas um nome e uma maneira conveniente de selecionar a "enorme quantidade de configurações" mencionada por Joris Timmermans. Eu queria saber os detalhes de quais podem ser essas configurações que fazem uma configuração de compilação chamada "FOO" funcionar como uma compilação de lançamento otimizada .
Aqui está um vislumbre disso. Criei um novo VCXPROJ a partir do modelo de projeto vazio do Visual Studio 2010. Em seguida, copiei e editei ambos, o primeiro para reter o conteúdo de depuração e o segundo, o conteúdo de lançamento. Aqui está a diferença centrada nas diferenças relevantes ...
LIBERAÇÃO
<PropertyGroup>
<WholeProgramOptimization>true</WholeProgramOptimization>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
DEPURAR
<PropertyGroup>
<UseDebugLibraries>true</UseDebugLibraries>`
<ClCompile>
<Optimization>Disabled</Optimization>
É interessante que, na seção Link, ambos tenham GenerateDebugInformation
definido como verdadeiro.
A diferença óbvia que você pode ver é o tamanho do binário. Uma compilação de depuração produz um binário maior do que uma compilação de lançamento.
Ao compilar em Debug, a tabela de símbolos é adicionada ao objeto compilado do arquivo de código, o que permite que os programas de depuração acessem esses binários e acessem os valores dos objetos e variáveis.
Outra diferença observável é que, no modo de lançamento, o binário simplesmente travaria em um erro fatal enquanto no modo de depuração. Se você iniciar a depuração do aplicativo no Visual Studio, poderá verificar a pilha de chamadas que informa a localização exata da instrução incorreta .
Não sei quais são as diferenças exatas porque, na verdade, não há informações facilmente disponíveis sobre isso.
Mas a principal diferença observada é que a versão de lançamento às vezes corrompe o arquivo DLL resultante e, portanto, torna seu aplicativo ou aplicativo da web inutilizável.
Infelizmente, você deve colocar a compilação de depuração em produção. E sim, para publicar você tem que usar o bom e velho FTP.