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

Possibile duplicato Debug Visual Studio Release in .NET

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

La cosa più importante è che in modalità Debug non ci sono ottimizzazioni, mentre in modalità di rilascio ci sono ottimizzazioni. Questo è importante perché il compilatore è molto avanzato e può fare un miglioramento piuttosto ingannevole del codice a livello basso. Di conseguenza alcune righe del tuo codice potrebbero essere lasciate senza alcuna istruzione, o alcune potrebbero confondersi. Il debug passo dopo passo sarebbe imansible. 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 ottimizzato di .NET a volte e vedrai.

Un’altra differenza fondamentale è che a causa di ciò 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 un’intera serie di impostazioni che possono influenzare la compilazione e il debug.

Nella modalità “Debug” di solito hai il seguente:

  • Programma i file di debug del database, che ti permettono di seguire l’esecuzione del programma abbastanza da vicino nell’origine durante l’esecuzione.
  • Tutte le ottimizzazioni distriggerste, che consentono di esaminare il valore delle variabili e tracciare in funzioni che altrimenti sarebbero state ottimizzate o allineate
  • Una definizione del preprocessore _DEBUG che consente di scrivere codice che agisce in modo diverso in modalità debug rispetto al rilascio, ad esempio allo strumento ASSERT che deve essere utilizzato solo durante il debug
  • Collegamento a librerie che sono state compilate anche con opzioni di debug, che di solito non vengono distribuite ai clienti effettivi (per motivi di dimensioni e sicurezza)

Nella modalità “Rilascio” sono triggerste le ottimizzazioni (sebbene siano disponibili più opzioni) e la definizione del preprocessore _DEBUG non sia definita. Generalmente, comunque, vorrete comunque generare i file PDB, perché è molto utile poter eseguire il “debug” in modalità rilascio quando le cose girano più velocemente.

Principalmente, il debug include molte informazioni extra utili durante il debug. In modalità di rilascio, questo è tutto tagliato e scambiato per le prestazioni.

Se passi alle opzioni di compilazione del progetto e le confronti, vedresti quali sono le differenze.

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

Fondamentalmente, in Debug tutte le ottimizzazioni della generazione del codice sono distriggerste. Alcune librerie (ad es. STL) predefinite per il controllo degli errori più severo (ad esempio gli iteratori di debug). Vengono generate ulteriori informazioni di debug (ad es. 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, viene utilizzato l’heap di debug).

Probabilmente vale la pena menzionare l’ovvio, che i flag di compilazione 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 bassi livelli ma la logica aziendale reale.

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

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

Inoltre, apparentemente, la modalità Debug crea molti thread aggiuntivi per aiutare nel 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 .

L’ovvia differenza che puoi vedere è la dimensione del file binario. La build di debug produce un binario più grande rispetto alla build di rilascio.

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

Un’altra differenza osservabile è che, in modalità Rilascio, il file binario si arresterebbe semplicemente in caso di errore irreversibile in modalità Debug, se si avvia il debug dell’applicazione in Visual Studio, è ansible controllare lo stack delle chiamate che indica la posizione esatta dell’istruzione errata .

Sono stato curioso anche su questa domanda quando avevo sviluppato un’applicazione copiata da una configurazione di build Release esistente. Ho uno sviluppatore che è interessante nell’utilizzo di tale applicazione in modalità di debug, quindi mi chiedevo cosa sarebbe servito 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 necessarie per rilasciare le ottimizzazioni ) cambiare improvvisamente team e diventare una build di debug nonostante il confondimento del nome della configurazione di build. Ho pensato che la configurazione del progetto fosse solo un nome e un modo conveniente per selezionare “l’intera gamma di impostazioni” menzionate da Joris Timmermans. Volevo sapere il nocciolo di quello che potrebbero essere queste impostazioni che rendono una configurazione di build chiamata “FOO” come una versione di rilascio ottimizzata.

Ecco un assaggio in esso, ho creato un nuovo VCXPROJ dal modello di progetto vuoto da VS2010. L’ho poi copiato e modificato entrambi, il primo a conservare i contenuti di debug e il secondo i contenuti del rilascio. Ecco la differenza centrata sulle differenze rilevanti … Vu VCXPROJs Debug vs Release diff

PUBBLICAZIONE

  true  MaxSpeed true true  true true 

DEBUG

  true`  Disabled 

È interessante notare che nella sezione Link entrambi hanno GenerateDebugInformation impostato su true.

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 rende quindi inutilizzabile l’applicazione Web.

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