Condividi tramite


Procedura: eseguire il debug di codice ottimizzato

Aggiornamento: novembre 2007

Le informazioni contenute in questo argomento sono valide per:

Edition

Visual Basic

C#

C++

Web Developer

Express

Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Standard

Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Pro e Team

Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Legenda tabella:

Argomento applicabile

Si applica

Argomento non applicabile

Non applicabile

Argomento valido ma comando nascosto per impostazione predefinita

Comando o comandi nascosti per impostazione predefinita.

Nota:

Le finestre di dialogo e i comandi di menu visualizzati possono differire da quelli descritti nella Guida a seconda delle impostazioni attive o dell'edizione in uso. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Impostazioni di Visual Studio.

Quando il compilatore ottimizza il codice, modifica la posizione e l'organizzazione delle istruzioni, restituendo un codice compilato più efficace. A causa di questa ridisposizione, il debugger non è sempre in grado di identificare il codice sorgente corrispondente a un gruppo di istruzioni.

L'ottimizzazione del codice può influenzare:

  • Le variabili locali, che possono essere rimosse o spostate in posizioni non riconosciute dal debugger

  • Le posizioni all'interno di una funzione, che vengono modificate quando l'utilità di ottimizzazione esegue l'unione di blocchi di codice.

  • I nomi delle funzioni per i frame nello stack di chiamate, che potrebbero risultare errati se due funzioni vengono unite.

I frame visualizzati nello stack di chiamate sono in genere corretti, se si dispone di simboli per ciascuno di essi. I frame nello stack di chiamate risulteranno errati se lo stack è danneggiato, se sono presenti funzioni scritte in linguaggio assembly oppure se esistono frame del sistema operativo privi di simboli corrispondenti nello stack di chiamate.

Le variabili globali e di tipo statico vengono visualizzate sempre correttamente, analogamente al layout delle strutture. Se si dispone di un puntatore a una struttura e il valore di questo puntatore è corretto, tutte le variabili membro della struttura conterranno il valore corretto.

A causa di questi limitazioni, è opportuno eseguire il debug utilizzando una versione del programma non ottimizzata, se possibile. Per impostazione predefinita l'ottimizzazione è disattivata nella configurazione di debug di un programma Visual C++ e attivata nella configurazione di rilascio.

A volte può tuttavia accadere che un errore venga individuato solo nella versione ottimizzata di un programma. In tal caso è necessario effettuare il debug del codice ottimizzato.

Per attivare l'ottimizzazione nella configurazione di una build di debug

  1. Quando si crea un nuovo progetto, selezionare la destinazione Win32 Debug. Utilizzare la destinazione Win32Debug fino a quando non viene completato il debug del programma e non si è pronti a compilare una destinazione Win32 Release. Il compilatore non ottimizza la destinazione Win32 Debug.

  2. Selezionare il progetto in Esplora soluzioni.

  3. Scegliere Pagine delle proprietà dal menu Visualizza.

  4. Nella finestra di dialogo Pagine delle proprietà verificare che sia selezionato Debug nell'elenco a discesa Configurazione.

  5. Nella struttura di cartelle visualizzata sulla sinistra selezionare la cartella C/C++.

  6. Nella cartella C++ selezionare Optimization.

  7. Nell'elenco di proprietà situato a destra cercare Optimization. L'impostazione accanto a tale opzione sarà probabilmente Disabled (/Od). Scegliere una delle altre opzioni (Minimum Size(/O1), Maximum Speed(/O2), Full Optimization(/Ox) o Custom).

  8. Se si è scelto l'opzione Custom per Optimization, a questo punto è possibile impostare le opzioni per le altre proprietà presenti nell'elenco.

Quando si effettua il debug di codice ottimizzato, controllare nella finestra Disassembly quali istruzioni vengono effettivamente create ed eseguite. Nell'impostazione di punti di interruzione, è necessario considerare che un punto di interruzione può essere spostato insieme a un'istruzione. Si consideri ad esempio il seguente codice:

for (x=0; x<10; x++)

Si supponga di impostare un punto di interruzione in questa riga. Ci si aspetterebbe che il punto di interruzione venga raggiunto 10 volte, ma se il codice è ottimizzato, il punto di interruzione verrà raggiunto solo una volta. La prima istruzione imposta infatti il valore di x su 0. Il compilatore riconosce che questa operazione deve essere eseguita solo una volta ed esce dal ciclo. Il punto di interruzione si sposta con essa.

Le istruzioni che confrontano e incrementano x rimangono all'interno del ciclo. Quando si visualizza la finestra Disassembly, l'unità di esecuzione viene impostata automaticamente su Istruzione per consentire un maggiore controllo, utile se si esegue il codice un'istruzione alla volta.

Vedere anche

Concetti

Protezione del debugger

Altre risorse

Debug del codice nativo