2010-02-16 11 views
8

Tengo una aplicación que solo se bloquea en -O2 optimización (compilada con gcc 4.2.4). Cuando paso por el código y llego al punto que se bloquea y trato de inspeccionar el valor, obtengo un "valor optimizado" en gdb.¿Está <value optimised out> en gdb un problema?

He leído en Internet que esto significa que el valor se almacena en el registro. Me preguntaba si mi accidente podría estar relacionado con el hecho de que cierta información se coloca en los registros. ¿Hay alguna forma de imprimir lo que está en los registros para ver si está dañado? ¿Hay alguna manera de mantener optimizaciones pero no usar registros?

Gracias!

+2

La optimización normalmente no crea errores (esto sería extremadamente raro). Sin embargo, a menudo puede causar que se pierdan las pérdidas de memoria que no se detectaron en una versión no optimizada. – Pace

+4

Por favor, acepte una respuesta; Han pasado casi 2 años desde que hizo esta pregunta. –

Respuesta

10

Es 99% probable que sea un error en su código y 1% probable que sea un error de generación de código de compilación. Pase una cantidad proporcional de tiempo buscando errores latentes en su código, pero tenga en cuenta que solo puede haber encontrado un error de generación de código (en cuyo caso deberá estudiar cuidadosamente el código generado por el compilador para ver cuál es el problema)

+6

Más como 99.9% y 0.1%. Los optimizadores tienen la increíble capacidad de descifrar el código con errores sutiles, incluso cuando normalmente funciona bien. –

+0

@Caspin - sí, probablemente tengas razón - incluso 1 error en 1000 debido al compilador tal vez esté exagerando. Creo que solo he visto un puñado de errores de compilación genuinos (en compiladores maduros y estables, al menos) en los últimos 25 años. –

5

prueba info registers en gdb.

Puede desactivar la optimización con -O0, pero hay algo sospechoso y le sugiero que investigue más y, finalmente, publique el código.

2

Si puede detectar el error en el flujo de su programa, puede hacer algunas impresiones usted mismo, si tiene algo que ver con pérdidas de memoria y daños en la memoria, entonces valgrind es probablemente un mejor amigo que gdb.

0

Esto no es un problema, es más un problema con las optimizaciones agresivas en las versiones más nuevas de gcc.

Ver: A Plan to Fix Local Variable Debug Information in GCC.

+3

¿Cómo puede estar tan seguro? No hemos visto su código; por supuesto, esto puede ser un error en las optimizaciones de gcc, pero hasta que tengamos más información ... –

0

Lo único a tener en cuenta es el alias de punteros, donde el compilador puede hacer suposiciones que usted no cumple, por ejemplo, que un puntero que pase a una función no apunte a una variable global también utilizada por esa función. Pero puede controlar esto con las opciones del compilador, etc.

Cuestiones relacionadas