Possibile duplicato Debug di Visual Studio Release in .NET
Qual è la differenza tra Debug e Release in Visual Studio?
Possibile duplicato Debug di Visual Studio Release in .NET
Qual è la differenza tra Debug e Release in Visual Studio?
Risposte:
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.
"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:
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.
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.
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).
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 .
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.
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.
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 ...
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.
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 .
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.