Estoy tratando de jugar con __attribute__
para permitir que una función se compile esencialmente con banderas diferentes del resto del código. Por ejemplo:G ++ and __attribute __ ((optimize)) no cambia el comportamiento del depurador
#include <iostream>
#include <vector>
void MyNormalFunction();
void MyDebugabbleFunction() __attribute__((optimize(0)));
void MyNormalFunction()
{
std::cout << "Test" << std::endl;
std::vector<int> a;
for(unsigned int i = 0; i < 10; ++i)
{
a.push_back(i);
}
}
void MyDebugabbleFunction()
{
std::cout << "Test" << std::endl;
std::vector<int> a;
for(unsigned int i = 0; i < 10; ++i)
{
a.push_back(i);
}
}
int main()
{
MyNormalFunction();
MyDebugabbleFunction();
return 0;
}
estoy construyendo con -O2 -g, pero yo quiero ser capaz de depurar con cordura MyDebugabbleFunction()
- por lo que utiliza el __attribute__((optimize(0)))
en su declaración. Sin embargo, realmente no puedo decir ninguna diferencia al pasar por estas dos funciones con un depurador. Esperaría el comportamiento "aparentemente errático" que suelo ver al tratar de pasar por el código optimizado en MyNormalFunction
, pero el comportamiento estándar "-g" del depurador en MyDebuggableFunction
.
¿Es que he hecho algo mal con __attribute__
? ¿O que he usado un código de demostración malo (es decir, un código que no se "optimiza mucho") dentro de las dos funciones? ¿O estoy malinterpretando cuál se supone que es la diferencia en el depurador?
Estoy usando gcc 4.6.
EDITAR basado en la sugerencia de GManNickG
que utiliza este código en su lugar, y construido con -O2 -g:
#include <iostream>
#include <vector>
int MyNormalFunction();
int MyDebugabbleFunction() __attribute__((optimize(0)));
int MyNormalFunction()
{
int val = 0; // breakpoint here - debugger does NOT stop here
val = 1;
val = 2;
return val;
} // debugger stops here instead
int MyDebugabbleFunction()
{
int val = 0; // breakpoint here - debugger stops here and steps through the next 3 lines as if it were built with only -g
val = 1;
val = 2;
return val;
}
int main()
{
int a = MyNormalFunction();
std::cout << a << std::endl;
int b = MyDebugabbleFunction();
std::cout << b << std::endl;
return 0;
}
Si no utiliza la optimización para esa función y todavía se está rompiendo donde no se rompe si la optimización está desactivada, entonces el problema que está buscando está en otra función. – Wug
Una mejor prueba podría ser 'int foo() {int val = 0; val = 1; val = 2; return val; } ' Luego, en "main" solo imprime el valor de retorno de cada función. – GManNickG
Wug: no, no, no hay problemas con estas funciones. Solo intentan demostrar el efecto de usar este comando __attribute__. @GManNickG - por lo que la idea es que con la optimización (MyNormalFunction) el depurador omita las líneas = 0 y = 1 juntas, pero sin optimización (MyDebugabbleFunction) golpeará todas las líneas? –