Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
Questo articolo è specifico di .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .NET 6 e versioni successive.
Quando si compila codice non gestito, è possibile configurare un'immagine eseguibile per il debug impostando opzioni dell'IDE o opzioni della riga di comando. Ad esempio, è possibile usare l'opzione della riga di comando /Zi in Visual C++ per chiedergli di generare file di simboli di debug (estensione pdb). Analogamente, l'opzione della riga di comando /Od indica al compilatore di disabilitare l'ottimizzazione. Il codice risultante viene eseguito più lentamente, ma è più facile eseguire il debug, se necessario.
Durante la compilazione di codice gestito di .NET Framework, i compilatori come Visual C++, Visual Basic e C# compilano il programma di origine in common intermediate language (CIL). CIL viene quindi compilato JIT, subito prima dell'esecuzione, in codice macchina nativo. Come per il codice non gestito, è possibile configurare un'immagine eseguibile per il debug impostando opzioni dell'IDE o opzioni della riga di comando. È anche possibile configurare la compilazione JIT per il debug nello stesso modo.
Questa configurazione JIT presenta due aspetti:
È possibile richiedere al compilatore JIT di generare informazioni di rilevamento. In questo modo è possibile per il debugger allineare una catena di CIL con la sua controparte di codice macchina e tenere traccia della posizione in cui vengono archiviati le variabili locali e gli argomenti delle funzioni. In .NET Framework versione 2.0 e successive il compilatore JIT genera sempre informazioni di rilevamento, quindi non è necessario richiederlo.
È possibile richiedere al compilatore JIT di non ottimizzare il codice del computer risultante.
In genere, il compilatore che genera CIL imposta queste opzioni del compilatore JIT in modo appropriato, in base alle opzioni dell'IDE o alle opzioni della riga di comando specificate, ad esempio /Od.
In alcuni casi, potrebbe essere necessario modificare il comportamento del compilatore JIT in modo che il codice del computer generato sia più semplice da eseguire per il debug. Ad esempio, è possibile generare informazioni di rilevamento JIT per una compilazione al dettaglio o un'ottimizzazione del controllo. È possibile farlo con un file di inizializzazione (.ini).
Ad esempio, se l'assembly di cui si vuole eseguire il debug viene chiamato MyApp.exe, è possibile creare un file di testo denominato MyApp.ini, nella stessa cartella di MyApp.exe, che contiene queste tre righe:
[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0
È possibile impostare il valore di ogni opzione su 0 o 1 e qualsiasi opzione assente viene impostata su 0. L'impostazione GenerateTrackingInfo su 1 e AllowOptimize su 0 fornisce il debug più semplice.
A partire da .NET Framework 2.0, il compilatore JIT genera sempre informazioni di rilevamento indipendentemente dal valore per GenerateTrackingInfo. Tuttavia, il AllowOptimize valore ha ancora un effetto. Quando si usa il Ngen.exe (Generatore di immagini native) per precompilare l'immagine nativa senza ottimizzazione, il file .ini deve essere presente nella cartella di destinazione con AllowOptimize=0 quando Ngen.exe viene eseguito. Se è stato precompilato un assembly senza ottimizzazione, è necessario rimuovere il codice precompilato usando NGen.exe /uninstall opzione prima di eseguire nuovamente Ngen.exe per precompilare il codice come ottimizzato. Se il file .ini non è presente nella cartella, per impostazione predefinita Ngen.exe precompila il codice come ottimizzato.
Il componente System.Diagnostics.DebuggableAttribute controlla le impostazioni per un assembly.
DebuggableAttribute include due campi che controllano se il compilatore JIT deve ottimizzare e/o generare informazioni di rilevamento. In .NET Framework 2.0 e versioni successive il compilatore JIT genera sempre informazioni di rilevamento.
Per una versione retail, i compilatori non impostano alcun DebuggableAttribute. Per impostazione predefinita, il compilatore JIT genera le prestazioni più elevate, più difficile da eseguire il debug del codice del computer. L'abilitazione del rilevamento JIT riduce leggermente le prestazioni e la disabilitazione dell'ottimizzazione riduce notevolmente le prestazioni.
Si DebuggableAttribute applica a un intero assemblaggio per volta, non ai singoli moduli all'interno dell'assemblaggio. Gli strumenti di sviluppo devono quindi associare attributi personalizzati al token dei metadati dell'assembly, se è già stato creato un assembly o alla classe denominata System.Runtime.CompilerServices.AssemblyAttributesGoHere. Lo strumento ALink promuove quindi questi DebuggableAttribute attributi da ogni modulo all'assembly di cui diventano parte. In caso di conflitto, l'operazione ALink non riesce.
Annotazioni
Nella versione 1.0 di .NET Framework, il compilatore Microsoft Visual C++ aggiunge DebuggableAttribute quando vengono specificate le opzioni del compilatore /clr e /Zi. Nella versione 1.1 di .NET Framework, è necessario aggiungere DebuggableAttribute manualmente nel tuo codice, oppure utilizzare l'opzione del linker /ASSEMBLYDEBUG.