2012-02-03 15 views
28

Estoy usando gdb para depurar un programa en C++.¿Cómo veo el valor de una variable <optimized out> en C++?

tengo este código:

int x = floor(sqrt(3)); 

y quiero ver el valor de x. Sin embargo, gdb afirma que x es "< optimized_out>". ¿Cómo veo el valor de x? ¿Debo cambiar las banderas de mi compilador?

+2

Debería estar disponible si compiló sin optimización, es decir, -O0 –

+4

Sí, generalmente debe depurar código con optimizaciones * deshabilitado *. Use la bandera '-O0' para eso. –

Respuesta

33

En altos niveles de optimización, el compilador puede eliminar los valores intermedios, como ha visto aquí. Hay una serie de opciones:

  • Puede reducir el nivel de optimización para facilitar al rastreador el seguimiento de las cosas. -O0 es seguro que funcionará (pero será bastante más lento), -O1 podría funcionar bien también.
  • Puede agregar algunas instrucciones de impresión explícitas para registrar el valor de salida.
  • También puede obligar al compilador a conservar este valor específico volviéndolo volátil (¡pero recuerde deshacerlo volátil cuando haya terminado!). Sin embargo, tenga en cuenta que, dado que el flujo de control también está sujeto a alteraciones en el código optimizado, incluso si puede ver el valor de la variable, puede no estar del todo claro en qué punto del código se encuentra cuando mira el código. variable en cuestión.
+3

A menudo también puede desensamblar la función y deducir en qué registro reside realmente la variable "optimizada" e imprimir esa variable. Se están realizando esfuerzos de desarrollo para hacer que GCC emita información de depuración suficientemente detallada para que GDB en el futuro pueda hacer esto por usted. –

+1

@EmployedRussian, esto puede funcionar si la variable existe de hecho, pero es posible que el trabajo real de cálculo de la variable se elimine, por lo que no funciona en todos los casos. – bdonlan

+0

También es posible que exista una variable local solo en un registro. 'gcc' puede optimizar su código para que sea de esta manera, otra causa posible para las variables no visibles. Vea esta respuesta para ver las variables de registro: http://stackoverflow.com/a/1354762/350875 – appas

13

Si usted no puede o no desea desactivar la optimización, entonces puede intentar declarar la variable como volátil. Esto suele ser suficiente para que el compilador conserve la variable en el código final.

Por otra parte, en las versiones recientes de GCC puede desactivar la optimización de sólo una función, así:

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

Para mí, este atributo no está definido. Cuando usé 'optnone' en su lugar, la variable se optimizó independientemente (clang 3.8). – starturtle

0

Crear su propio 'variable global' e imprimir la variable optimizado a cabo en esta variable global. Asegúrese de eliminar estos globales creados por usted una vez que haya terminado con la depuración.

Cuestiones relacionadas