Próbuję grać z __attribute__
, aby umożliwić zasadniczo kompilację funkcji za pomocą różnych flag od reszty kodu. Na przykład:G ++ i __attribute __ ((optymalizuj)) nie zmieniają zachowania debuggera
#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;
}
buduję z -g -O2, ale chcę, aby móc zdrowo debugowania MyDebugabbleFunction()
- więc użyłem __attribute__((optimize(0)))
na swojej deklaracji. Jednak nie mogę powiedzieć żadnej różnicy podczas przechodzenia przez te dwie funkcje za pomocą debuggera. Spodziewam się "pozornie nieregularnego" zachowania, które zwykle widzę, próbując przejść przez zoptymalizowany kod w MyNormalFunction
, ale standardowe "-g" - jedyne zachowanie debuggera w MyDebuggableFunction
.
Czy zrobiłem coś złego z __attribute__
? Albo, że użyłem złego kodu demo (tj. Kodu, który nie "zoptymalizuje się dużo") wewnątrz dwóch funkcji? Czy błędnie interpretuję, jaka różnica ma być w debugerze?
Używam gcc 4.6.
EDIT na podstawie sugestii GManNickG za
użyłem zamiast tego kodu, a zbudowane z -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;
}
Jeśli nie używasz optymalizacji dla tej funkcji i nadal się zepsuje tam, gdzie się nie zepsuje, jeśli optymalizacja jest wyłączona, problem, którego szukasz, znajduje się w innej funkcji. – Wug
Lepszym testem może być 'int foo() {int val = 0; val = 1; val = 2; return val; } '. Następnie w 'main' po prostu wydrukuj wartość zwracaną każdej funkcji. – GManNickG
Wug - nie, nie ma problemów z tymi funkcjami. Po prostu próbują zademonstrować wpływ użycia polecenia __attribute__. @GManNickG - więc pomysł polega na tym, że przy optymalizacji (MyNormalFunction) debugger przeskoczy wszystkie linie razem = 0 i = 1, ale bez optymalizacji (MyDebugabbleFunction) uderzy we wszystkie wiersze? –