2012-02-03 16 views
28

Sto usando gdb per eseguire il debug di un programma C++.Come posso visualizzare il valore di una variabile <ottimizzata> in C++?

ho questo codice:

int x = floor(sqrt(3)); 

e voglio vedere il valore di x. Tuttavia, gdb afferma che x è "< optimized_out>". Come visualizzo il valore di x? Dovrei cambiare le mie bandiere del compilatore?

+2

Dovrebbe essere disponibile se è stato compilato senza ottimizzazione, ovvero -O0 –

+4

Sì, in genere è necessario eseguire il debug del codice con le ottimizzazioni * disabilitato *. Usa la bandiera '-O0' per quello. –

risposta

33

Su livelli di ottimizzazione elevati, il compilatore può eliminare i valori intermedi, come si è visto qui. Esistono diverse opzioni:

  • È possibile ridurre il livello di ottimizzazione per rendere più facile per il debugger tenere traccia delle cose. -O0 funzionerà sicuramente (ma sarà molto più lento), -O1 potrebbe funzionare anche bene.
  • È possibile aggiungere alcune istruzioni di stampa esplicite per registrare il valore di output.
  • In genere, è possibile forzare il compilatore a mantenere questo valore specifico rendendolo volatile (ma ricordarsi di non renderlo volatile quando hai finito!). Nota, tuttavia, poiché il flusso di controllo è soggetto anche a modifiche nel codice ottimizzato, anche se puoi vedere il valore della variabile, potrebbe non essere del tutto chiaro in quale punto del codice sei quando guardi il variabile in questione.
+3

Spesso è anche possibile disassemblare la funzione e dedurre cosa registra la variabile "ottimizzata" e stampare quella variabile. Ci sono degli sforzi di sviluppo in corso per fare in modo che GCC emetta informazioni di debug sufficientemente dettagliate in modo che GDB possa in futuro essere in grado di farlo per te. –

+1

@EmployedRussian, questo può funzionare se la variabile esiste effettivamente, ma è possibile che il lavoro effettivo di calcolo della variabile venga eliminato, quindi non funziona in tutti i casi. – bdonlan

+0

È anche possibile che una variabile locale esista solo in un registro. 'gcc' può ottimizzare il tuo codice in questo modo - un'altra possibile causa per variabili non visualizzabili. Vedere questa risposta per come visualizzare le variabili di registro: http://stackoverflow.com/a/1354762/350875 – appas

13

Se non puoi o non vuoi disattivare l'ottimizzazione, allora si può provare dichiarare la variabile come volatili. Questo di solito è sufficiente per far sì che il compilatore conservi la variabile nel codice finale.

In alternativa, nelle versioni recenti di GCC è possibile disattivare l'ottimizzazione solo per una funzione, come questo:

void my_function() __attribute__((optimize(0))) 
{ 
    int x = floor(sqrt(3)); 
} 
+0

Per me, questo attributo non è definito. Quando ho usato 'optnone', invece, la variabile è stata ottimizzata indipendentemente (clang 3.8). – starturtle

0

Crea il tuo 'variabile globale' e stampare la variabile ottimizzata fuori in questa variabile globale. Assicurati di rimuovere questi globals creati da te dopo aver terminato il debugging!

Problemi correlati