Qual é a diferença entre Debug e Release no Visual Studio?

Respostas:

114

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.

Vilx-
fonte
1
"Como resultado, algumas linhas do seu código podem ficar sem nenhuma instrução ou algumas podem ficar todas misturadas".
Sim
4
"O mais importante é que no modo de depuração não há otimizações" - isso é discutível. o mais importante é que haja informações de depuração que permitem depurar. embora isso também possa existir no lançamento.
shoosh
Não sei qual é o modo padrão (Debug / Release). Geralmente, em minha experiência, todos os projetos estão em modo de depuração e a equipe do instalador cuidará deste lançamento para evitar o arquivo pdb e para introduzir a otimização. Mas hoje me deparei com uma situação em que o modo foi alterado para liberar e não sou capaz de quebrar o código usando o ponto de interrupção. Eu tentei por uma longa 1 hora fazendo muitas coisas e finalmente percebi que é devido ao problema com o modo de compilação atual. @ Vlix- Obrigado pela sua resposta.
kbvishnu
1
Isso realmente me ajudou a resolver o problema "O nome 'variável' não existe no contexto atual" que encontrei ao tentar analisar um símbolo dentro da janela imediata ao depurar um aplicativo em conformidade com a configuração de versão padrão. Muito obrigado!
M463 de
1) E quanto aos seguintes problemas? Existem 3 configurações em um projeto ASP.NET MVC: base (web), debug (web.debug), release (web.release). Suponha que definimos depuração e liberação da string de conexão por transformação para a configuração correspondente (depuração e liberação). Ao publicar, podemos publicar de acordo com nossa seleção na caixa de diálogo de publicação. Mas, ao executar o aplicativo, apesar de eu selecionar Debug, ele usa a configuração de lançamento (porque eu defini a configuração de depuração na base e a configuração de depuração), isso é normal?
Jason
52

"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:

  • Arquivos de banco de dados de depuração do programa, que permitem acompanhar a execução do programa de perto na origem durante o tempo de execução.
  • Todas as otimizações desativadas, o que permite que você inspecione o valor das variáveis ​​e rastreie as funções que, de outra forma, poderiam ter sido otimizadas ou alinhadas
  • Uma definição de pré-processador _DEBUG que permite escrever código que atua de maneira diferente no modo de depuração em comparação com a versão, por exemplo, para instrumentar ASSERTs que devem ser usados ​​apenas durante a depuração
  • Vinculando a bibliotecas que também foram compiladas com opções de depuração ativadas, que geralmente não são implantadas para clientes reais (por razões de tamanho e segurança)

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.

Joris Timmermans
fonte
5
"apenas dois rótulos" - na verdade, o Visual Studio oferece a capacidade de criar mais! Isso pode ser excepcionalmente útil ao testar um programa. Por exemplo, recentemente escrevi um programa para meu trabalho que aceitava nomes de arquivos da linha de comando. Testei minha análise de linha de comando, mas depois que isso foi feito, não queria mexer com CMD e listas de nomes de arquivo todos os dias; Eu criei uma configuração com a qual poderia usar a compilação condicional para fornecer valores fictícios de linha de comando e testar a lógica de negócios do programa, o que me deu um ciclo de iteração muito mais rápido no desenvolvimento do programa.
Brian S
9

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.

Rik
fonte
1) E quanto aos seguintes problemas? Existem 3 configurações em um projeto ASP.NET MVC: base (web), debug (web.debug), release (web.release). Suponha que definimos depuração e liberação da string de conexão por transformação para a configuração correspondente (depuração e liberação). Ao publicar, podemos publicar de acordo com nossa seleção na caixa de diálogo de publicação. Mas, ao executar o aplicativo, apesar de eu selecionar Debug, ele usa a configuração de lançamento (porque eu defini a configuração de depuração na base e a configuração de depuração), isso é normal?
Jason
2) Ao executar o aplicativo no modo Debug ou Release, o VS usa a configuração da web base ou a configuração da web correspondente (web.debug.confg ou web.release.config)?
Jason
7

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).

NeARAZ
fonte
2
@Vilx: quando eu perguntei, não havia tag .net ainda, apenas visualstudio. Então, presumi que fosse C ++.
NeARAZ
6

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 .

Matt Jacobsen
fonte
Mas apenas para .NET (não C ++)?
Peter Mortensen
6

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.

Annakata
fonte
"... mude drasticamente ... a lógica de negócios real" - soa como um bug para mim! Temos muito código condicional e isso torna muito difícil de entender. Além disso, cada combinação de sinalizadores de código condicional é essencialmente uma versão diferente do seu software que deve ser testada para garantir a correção e integridade básica. De acordo com o "Code Complete", minha Bíblia da construção de software, nossa "Primeira Diretriz" é o gerenciamento da complexidade. (É nosso problema número 1 para resolver). Pense bem antes de adicionar indiscriminadamente mais sinalizadores condicionais!
MicroservicesOnDDD
Meu comentário acima não foi direcionado a esta resposta em particular no que diz respeito à última frase ... isso foi apenas uma coisa adicional que eu pensei que os leitores que vêm aqui deveriam ler.
MicroservicesOnDDD
6

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.DLLlink 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.

foraidt
fonte
muito verdadeiro. Tive problemas com isso uma vez enquanto estava com um cliente. Funciona em minha máquina (TM).
Matt Jacobsen de
Você pode distribuí-los .. (não sei se você tem permissão). Eles devem estar em uma subpasta de nomes adequados de seu aplicativo.
Andreas Reiff
@Andreas Em relação ao meu exemplo, "não redistribuível" significa que a Microsoft não permite distribuí-los.
fora de
4

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 ...

Depuração de VCXPROJs vazia vs Dif de lançamento

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 GenerateDebugInformationdefinido como verdadeiro.

Jxramos
fonte
3

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 .

fasih.rana
fonte
-15

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.

f470071
fonte
7
Como isso responde à pergunta? E preste atenção ao digitar.
mmking 05 de
Eu tive um problema semelhante, o código funciona no modo de depuração, mas tem problema no modo de liberação. Acontece que o problema está no meu código. Há um ótimo artigo sobre problemas comuns na versão de lançamento. Espero que isso possa ajudar outros também.
Weihui Guo