Condividi tramite


Eseguire il debug di codice ottimizzato

Questo articolo illustra le opzioni del compilatore da impostare per consentire di eseguire il debug del codice ottimizzato meglio.

Un'esperienza migliore è disponibile a partire da Visual Studio 2022 versione 17.14 che consente di eseguire il debug di codice ottimizzato come se fosse stato compilato non ottimizzato, mantenendo al tempo stesso la velocità del codice ottimizzato. Per altre informazioni, vedere debug dinamico C++ (anteprima).

Nota

Le finestre di dialogo e i comandi di menu visualizzati potrebbero differire da quelli descritti nella Guida in base alle impostazioni o all'edizione attiva. Per modificare le impostazioni, scegliere Impostazioni di importazione ed esportazione nel menu Strumenti. Per altre informazioni, vedere Reimpostare tutte le impostazioni.

Nota

L'opzione del compilatore /Zo (Ottimizza debug ottimizzato) (introdotta in Visual Studio Update 3) genera informazioni di debug più complete per il codice ottimizzato (progetti non compilati con l'opzione del compilatore /Od ). Vedere /O Options (Optimize Code)). Sono inclusi un supporto migliorato per il debug di variabili locali e funzioni in linea.

Modifica e continuazione è disabilitata quando viene usata l'opzione del compilatore /Zo .

Quando il compilatore ottimizza il codice, riposiziona e riorganizza le istruzioni. Ciò comporta un codice compilato più efficiente. A causa di questa ridisistribuzione, il debugger non è sempre in grado di identificare il codice sorgente che corrisponde a un set di istruzioni.

L'ottimizzazione può influire su:

  • L'utilità di ottimizzazione può rimuovere le variabili locali o spostarle in posizioni che il debugger non riconosce.

  • Posizioni all'interno di una funzione, che vengono modificate quando l'utilità di ottimizzazione unisce blocchi di codice.

  • Nomi di funzione per i frame nello stack di chiamate, che potrebbero risultare errati se l'ottimizzatore unisce due funzioni.

    I frame visualizzati nello stack di chiamate sono quasi sempre corretti, presumendo che abbiate simboli per tutti i frame. I frame nello stack di chiamate saranno errati se si verifica un danneggiamento dello stack, se sono presenti funzioni scritte in linguaggio assembly o se sono presenti frame del sistema operativo senza simboli corrispondenti nello stack di chiamate.

    Le variabili globali e statiche vengono sempre visualizzate correttamente. Così è anche il layout della struttura. Se si dispone di un puntatore a una struttura e il valore del puntatore è corretto, ogni variabile membro della struttura mostrerà il valore corretto.

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

    Tuttavia, un bug potrebbe apparire solo in una versione ottimizzata di un programma. In tal caso, è necessario eseguire il debug del codice ottimizzato.

Per attivare l'ottimizzazione in una configurazione di compilazione di debug

  1. Quando si crea un nuovo progetto, selezionare la Win32 Debug destinazione. Usare la Win32 Debug destinazione fino a quando il programma non viene completamente sottoposto a debug e si è pronti per compilare una Win32 Release destinazione. Il compilatore non ottimizza la Win32 Debug destinazione.

  2. Selezionare il progetto in Esplora soluzioni.

  3. Nel menu Visualizza, fare clic su le Pagine delle Proprietà.

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

  5. Nella visualizzazione cartella a sinistra selezionare la cartella C/C++ .

  6. Nella cartella C++ selezionare Optimization.

  7. Nell'elenco delle proprietà a destra trovare Optimization. L'impostazione accanto a esso probabilmente indica Disabled (/Od). Scegliere una delle altre opzioni (Minimum Size``(/O1), Maximum Speed``(/O2), Full Optimization``(/Ox) o Custom).

  8. Se si sceglie l'opzione Custom per Optimization, è ora possibile impostare le opzioni per qualsiasi altra proprietà visualizzata nell'elenco delle proprietà.

  9. Selezionare il nodo Proprietà di configurazione, C/C++, Riga di comando della pagina delle proprietà del progetto e aggiungere (/Zo) alla casella di testo Opzioni aggiuntive .

    Avvertimento

    L'aggiunta /Zo disabilita Modifica e Continua.

    Quando si esegue il debug di codice ottimizzato, usare la finestra Disassembly per visualizzare le istruzioni create ed eseguite. Quando si impostano punti di interruzione, è necessario sapere che il punto di interruzione potrebbe essere spostato insieme a un'istruzione. Si consideri ad esempio il codice seguente:

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

Si supponga di impostare un punto di interruzione in questa riga. È possibile che il punto di interruzione venga raggiunto 10 volte, ma se il codice è ottimizzato, il punto di interruzione viene raggiunto una sola volta. Ciò è dovuto al fatto che la prima istruzione imposta il valore di x su 0. Il compilatore riconosce che questa operazione deve essere eseguita una sola volta e la sposta all'esterno del ciclo. Il punto di interruzione si sposta insieme ad esso. Le istruzioni che confrontano e incrementano x rimangono all'interno del ciclo. Quando si visualizza la finestra Disassembly , l'unità di passaggio viene impostata automaticamente su Istruzioni per un controllo maggiore, utile quando si esegue il codice ottimizzato.