2012-06-28 11 views
28

Devo eseguire il debug di un progetto C++, ma siccome una dipendenza non si compila in modalità debug e non sono stato in grado di risolvere il problema fino ad ora, mi piacerebbe provare a eseguire il debug del progetto in modalità di rilascio.Come eseguire il debug in modalità di rilascio?

Attualmente l'applicazione si arresta in modo anomalo a causa di un puntatore nullo, ma non ho il codice che causa l'errore. Poiché i punti di interruzione apparentemente vengono ignorati in modalità di rilascio, mi piacerebbe sapere qual è il modo migliore per trovare l'errore.

risposta

52

In VS, fare clic con il pulsante destro del mouse sul progetto, selezionare "Proprietà".

  1. Fare clic sul nodo C/C++. Imposta il formato delle informazioni di debug su C7 compatibile (/ Z7) o sul database del programma (/ Zi).

  2. Espandere Linker e fare clic sul nodo Generale. Impostare Abilita collegamento incrementale su No (/ INCREMENTAL: NO).

  3. Selezionare il nodo di debug. Imposta Genera informazioni di debug su Sì (/ DEBUG).

  4. Selezionare il nodo Ottimizzazione. Impostare i riferimenti su Sì (/ OPT: REF).

    if/OPT: REF specificato,/OPT: ICF è attivato per impostazione predefinita.

che è strappato direttamente dalla documentazione di Microsoft:

Lo faccio tutto il tempo e praticamente mai di debug in modalità debug più. Come sapete, molti errori che si verificano in una build di rilascio potrebbero non verificarsi in una build di debug (quasi certamente gli errori derivanti dal richiamo di UB).

Inoltre, lavoro su un progetto che utilizza una tonnellata di elaborazione delle immagini ed esegue molta compressione/decompressione di immagini di grandi dimensioni. L'uso di una build lenta di debug è semplicemente poco pratico.

+0

grazie risolto!Non so molto sugli effetti di tutte queste impostazioni, quindi è meglio usarle solo per il debug e rimuoverle di nuovo quando si completa una versione di rilascio effettiva? – Pedro

+5

@Pedro: Sì, probabilmente è meglio ripristinarli e lasciare i valori predefiniti per la versione ON. Generalmente creo un nuovo tipo di build per questa configurazione, ad esempio "rilascio w/simboli". Detto questo, non può far male andare a studiare ciò che effettivamente fanno questi interruttori. –

4

Non è sempre possibile modificare solo le impostazioni del progetto e ricompilare.
A volte è disponibile una versione rilasciata che si desidera eseguire il debug o un file di dump inviato da un client.

Quando si compila un progetto C++ in versione con ottimizzazioni, il debugger a volte non mostra le informazioni sull'oggetto corretto.

Le variabili locali sono in genere le prime a passare e molte volte le informazioni dell'oggetto vengono perse dal debugger.

Il motivo è che il compilatore utilizza i registri hardware disponibili per conservare le informazioni e utilizza le ottimizzazioni per evitare l'allocazione di variabili locali.

ho suggerito un modo per trovare le informazioni mancanti qui: problema

Debugging Release Projects in C++ - Finding the Lost Object Information

+0

La risposta di @Ed s è ottima se si ha accesso a codice e IDE. La risposta di Yochai vale la pena leggere. –