Qual è la differenza tra Debug e Release in Visual Studio?


Risposte:


114

La cosa più importante è che in modalità Debug non ci sono ottimizzazioni, mentre in modalità Release ci sono ottimizzazioni. Questo è importante perché il compilatore è molto avanzato e può migliorare il codice a basso livello piuttosto complicato. Di conseguenza, alcune righe del codice potrebbero rimanere senza alcuna istruzione o alcune potrebbero essere confuse. Il debug passo dopo passo sarebbe impossibile. Inoltre, le variabili locali sono spesso ottimizzate in modi misteriosi, quindi Orologi e QuickWatch spesso non funzionano perché la variabile è "ottimizzata". E ci sono anche moltitudini di altre ottimizzazioni. Prova a eseguire il debug del codice .NET ottimizzato qualche volta e vedrai.

Un'altra differenza fondamentale è che per questo motivo le impostazioni di rilascio predefinite non si preoccupano di generare ampie informazioni sui simboli di debug. Questo è il file .PDB che potresti aver notato e consente al debugger di capire quali istruzioni di assemblaggio corrispondono a quale riga di codice, ecc.


1
"Di conseguenza, alcune righe del codice potrebbero rimanere senza alcuna istruzione o alcune potrebbero essere confuse". Sì, non è stato possibile utilizzare Stack frame per ottenere il nome del metodo / proprietà corrente - e molte delle proprietà sono state integrate nel rilascio ...
kpollock

4
"La cosa più importante è che in modalità Debug non ci siano ottimizzazioni" - questo è discutibile. la cosa più importante è che ci siano informazioni di debug che ti consentono di eseguire il debug. sebbene questo possa esistere anche in versione.
shoosh

Non so quale sia la modalità predefinita (Debug / Release). In genere, nella mia esperienza, tutti i progetti sono in modalità debug e il team di installazione si occuperà di questa versione per evitare file pdb e per introdurre l'ottimizzazione. Ma oggi mi sono imbattuto in una situazione in cui la modalità è cambiata in rilascio e non sono in grado di rompere il codice usando il punto di interruzione. Ho provato per 1 ora a fare un sacco di cose e alla fine ho notato che è dovuto al problema con l'attuale modalità di compilazione. @ Vlix- Grazie per la tua risposta.
kbvishnu

1
Questo in realtà mi ha aiutato a risolvere il problema "Il nome 'variabile' non esiste nel contesto corrente" che ho riscontrato durante il tentativo di analizzare un simbolo all'interno della finestra immediata durante il debug di un'applicazione conforme alla configurazione di rilascio predefinita. Molte grazie!
M463

1) E i seguenti problemi? Ci sono 3 configurazioni in un progetto ASP.NET MVC: base (web), debug (web.debug), release (web.release). Supponiamo di impostare la stringa di connessione di debug e di rilascio mediante trasformazione nella configurazione corrispondente (debug e rilascio). Durante la pubblicazione, possiamo pubblicare in base alla nostra selezione nella finestra di dialogo di pubblicazione. Ma, quando si esegue l'applicazione, nonostante abbia selezionato Debug, utilizza la configurazione di rilascio (poiché ho impostato la configurazione di debug in base e la configurazione di debug), è normale?
Jason

52

"Debug" e "Release" sono in realtà solo due etichette per tutta una serie di impostazioni che possono influenzare la build e il debug.

In modalità "Debug" di solito hai quanto segue:

  • File di database di debug del programma, che consentono di seguire l'esecuzione del programma abbastanza da vicino nel sorgente durante il runtime.
  • Tutte le ottimizzazioni disattivate, il che consente di ispezionare il valore delle variabili e rintracciarle in funzioni che altrimenti sarebbero state ottimizzate o in-line
  • Una definizione del preprocessore _DEBUG che consente di scrivere codice che agisce in modo diverso in modalità debug rispetto al rilascio, ad esempio per gli ASSERT dello strumento che dovrebbero essere utilizzati solo durante il debug
  • Collegamento a librerie che sono state anche compilate con opzioni di debug attive, che di solito non vengono distribuite ai clienti effettivi (per motivi di dimensioni e sicurezza)

Nella modalità "Release" sono attivate le ottimizzazioni (sebbene siano disponibili più opzioni) e la definizione del preprocessore _DEBUG non è definita. Di solito vorrai comunque generare i file PDB, perché è molto utile essere in grado di "eseguire il debug" in modalità di rilascio quando le cose funzionano più velocemente.


5
"solo due etichette": in effetti, Visual Studio ti dà la possibilità di crearne di più! Questo può essere eccezionalmente utile durante il test di un programma. Ad esempio, di recente ho scritto un programma per il mio lavoro che accettava nomi di file dalla riga di comando. Ho testato la mia analisi della riga di comando, ma una volta fatto, non volevo fare confusione con CMD e gli elenchi di nomi di file ogni giorno; Ho creato una configurazione con cui potevo usare la compilazione condizionale per fornire valori fittizi della riga di comando e testare la logica di business del programma, che mi ha dato un ciclo di iterazione molto più veloce sullo sviluppo del programma.
Brian S

9

Per lo più, il debug include molte informazioni extra utili durante il debug. Nella modalità di rilascio, tutto questo viene tagliato e scambiato per le prestazioni.


1) E i seguenti problemi? Ci sono 3 configurazioni in un progetto ASP.NET MVC: base (web), debug (web.debug), release (web.release). Supponiamo di impostare la stringa di connessione di debug e di rilascio mediante trasformazione nella configurazione corrispondente (debug e rilascio). Durante la pubblicazione, possiamo pubblicare in base alla nostra selezione nella finestra di dialogo di pubblicazione. Ma, quando si esegue l'applicazione, nonostante abbia selezionato Debug, utilizza la configurazione di rilascio (poiché ho impostato la configurazione di debug in base e la configurazione di debug), è normale?
Jason

2) Quando si esegue l'applicazione in modalità Debug o Release, VS utilizza la configurazione web di base o la configurazione web corrispondente (web.debug.confg o web.release.config)?
Jason

7

Se esamini le opzioni di compilazione del progetto e le confronti, vedrai quali sono le differenze.

Supponendo che la domanda riguardi il codice nativo / C ++ (non è del tutto chiaro dalla frase):

Fondamentalmente, in Debug tutte le ottimizzazioni della generazione di codice sono disattivate. Alcune librerie (ad es. STL ) utilizzano di default un controllo degli errori più rigoroso (ad es. Iteratori di debug). Vengono generate più informazioni di debug (ad esempio per "Modifica e continua"). Altre cose vengono generate nel codice per rilevare gli errori (i valori delle variabili locali sono impostati su un modello non inizializzato e viene utilizzato l'heap di debug).


2
@Vilx: quando ho risposto, non c'era ancora alcun tag .net, solo visualstudio. Quindi ho pensato che fosse C ++.
NeARAZ

6

Inoltre, a quanto pare, la modalità Debug crea molti thread aggiuntivi per aiutare con il debug. Questi rimangono attivi per tutta la durata del processo, indipendentemente dal fatto che si colleghi o meno un debugger. Vedi la mia domanda correlata qui .


Ma solo per .NET (non C ++)?
Peter Mortensen

6

Probabilmente vale la pena menzionare l'ovvio, che i flag di build consentono una logica diversa che dovrebbe essere utilizzata solo per modificare la registrazione e la messaggistica "console", ma può essere abusata e cambiare drasticamente non solo i livelli bassi, ma la logica aziendale effettiva.


"... cambia drasticamente ... l'effettiva logica aziendale" - mi suona come un bug! Abbiamo molto codice condizionale e questo lo rende davvero difficile da capire. Inoltre, ogni combinazione di flag di codice condizionale è essenzialmente una versione diversa del software che dovrebbe essere testata per garantire la correttezza e l'integrità di base. Secondo "Code Complete", la mia Bibbia della costruzione del software, la nostra "Prima Direttiva" è la gestione della complessità. (È il nostro problema numero 1 da risolvere). Pensa a lungo prima di aggiungere indiscriminatamente più flag condizionali!
MicroservicesOnDDD

Il mio commento sopra non era mirato a questa risposta in particolare per quanto riguarda l'ultima frase ... questa era solo un'ulteriore cosa che pensavo che i lettori che vengono qui dovrebbero leggere.
MicroservicesOnDDD

6

Si noti inoltre che quando si utilizza MFC, ad esempio, i progetti di debug si collegano a versioni DLL non ridistribuibili come MFC90D.DLLmentre le build di rilascio si collegano alle versioni ridistribuibili come MFC90.DLL. Questo è probabilmente simile ad altri framework.

Quindi probabilmente non sarai in grado di eseguire applicazioni di build di debug su macchine non di sviluppo.


Verissimo. Mi sono imbattuto in questo una volta mentre ero a un cliente. Funziona su My Machine (TM).
Matt Jacobsen

Sei in grado di distribuirli .. (non so se ti è permesso). Devono trovarsi in una sottocartella con nomi appropriati dell'applicazione.
Andreas Reiff

@Andreas Per quanto riguarda il mio esempio, "non ridistribuibili" significa che Microsoft non consente la loro distribuzione.
previsto il

4

Mi sono incuriosito anche su questa domanda quando ho sviluppato un'applicazione copiata da una configurazione di build di rilascio esistente.

Ho uno sviluppatore che è interessante nell'usare quell'applicazione in modalità di debug, quindi mi chiedevo cosa sarebbe necessario per rendere questa configurazione di build esistente con un nome di ReleaseMyBuild copiata da una configurazione di Release (e quindi dovrebbe avere tutte le impostazioni orientate alle ottimizzazioni di rilascio ) per cambiare improvvisamente team e diventare una build di debug nonostante il nome confuso della configurazione della build.

Ho pensato che la configurazione del progetto fosse solo un nome e un modo conveniente per selezionare "l'intera sfilza di impostazioni" menzionata da Joris Timmermans. Volevo sapere il nocciolo di ciò che possono essere quelle impostazioni che fanno funzionare una configurazione di build chiamata "FOO" come una versione ottimizzata build di .

Ecco uno sguardo in esso. Ho creato un nuovo VCXPROJ dal modello di progetto vuoto di Visual Studio 2010. L'ho quindi copiato e modificato entrambi, il primo per mantenere i contenuti di debug e il secondo il contenuto della versione. Ecco la differenza centrata sulle differenze rilevanti ...

VCXPROJ vuoti Debug vs Release diff

PUBBLICAZIONE

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

<ClCompile>
    <Optimization>MaxSpeed</Optimization>
    <FunctionLevelLinking>true</FunctionLevelLinking>
    <IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
    <EnableCOMDATFolding>true</EnableCOMDATFolding>
    <OptimizeReferences>true</OptimizeReferences>

DEBUG

<PropertyGroup>
    <UseDebugLibraries>true</UseDebugLibraries>`

<ClCompile>
    <Optimization>Disabled</Optimization>

È interessante che nella sezione Link entrambi siano GenerateDebugInformationimpostati su true.


3

L'ovvia differenza che puoi vedere è la dimensione del file binario. Una build di debug produce un binario più grande di una build di rilascio.

Durante la compilazione in Debug, la tabella dei simboli viene aggiunta all'oggetto compilato del file di codice che consente ai programmi di debug di attingere a questi binari e accedere ai valori di oggetti e variabili.

Un'altra differenza osservabile è che, in modalità di rilascio, il binario si bloccherebbe semplicemente per un errore fatale mentre in modalità di debug, se avvii il debug dell'applicazione in Visual Studio, puoi controllare lo stack di chiamate che ti dice la posizione esatta dell'istruzione errata .


-15

Non so quali siano le differenze esatte perché in realtà non ci sono informazioni facilmente disponibili su questo.

Ma la principale differenza osservata è che la versione di rilascio a volte corrompe il file DLL risultante e quindi rende inutilizzabile l'applicazione, l'applicazione web.

Purtroppo, devi mettere la build di debug in produzione. E sì, per pubblicare devi usare il buon vecchio FTP.


7
Come risponde questo alla domanda? E ti preghiamo di prestare attenzione durante la digitazione.
mmking

Ho avuto un problema simile, il codice funziona in modalità di debug, ma ha problemi in modalità di rilascio. Si scopre che il problema è nel mio codice. C'è un ottimo articolo sui problemi comuni nella versione di rilascio.Spero che questo possa aiutare anche gli altri.
Weihui Guo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.