Sto provando a giocare con __attribute__
per consentire a una funzione di essere essenzialmente compilata con diversi flag dal resto del codice. Per esempio:G ++ e __attribute __ ((ottimizzazione)) non cambiano il comportamento del debugger
#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;
}
sto costruendo con -O2 -g, ma voglio essere in grado di eseguire il debug in modo sano MyDebugabbleFunction()
- così ho usato il __attribute__((optimize(0)))
sulla sua dichiarazione. Tuttavia, non posso davvero dire alcuna differenza quando si passa attraverso queste due funzioni con un debugger. Mi aspetterei il comportamento "apparentemente erratico" che di solito vedo quando provo a passare attraverso il codice ottimizzato in MyNormalFunction
, ma il comportamento standard del "-g" -only debugger in MyDebuggableFunction
.
È che ho fatto qualcosa di sbagliato con __attribute__
? O che ho usato un cattivo codice dimostrativo (cioè codice che non viene "ottimizzato molto") all'interno delle due funzioni? Oppure sto interpretando male la differenza che si suppone nel debugger?
Sto utilizzando gcc 4.6.
EDIT basato su suggerimento di GManNickG
ho usato questo codice, invece, e costruita 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;
}
Se non si sta utilizzando l'ottimizzazione per quella funzione e si sta ancora interrompendo il punto in cui non si interrompe se l'ottimizzazione è disattivata, il problema che si sta cercando è in un'altra funzione. – Wug
Un test migliore potrebbe essere 'int foo() {int val = 0; val = 1; val = 2; return val; } '. Quindi in 'main' è sufficiente stampare il valore di ritorno di ciascuna funzione. – GManNickG
Wug - no no, non ci sono problemi con queste funzioni. Stanno solo cercando di dimostrare l'effetto dell'uso di questo comando __attribute__. @GManNickG - quindi l'idea è che con l'ottimizzazione (MyNormalFunction) il debugger salterà le righe = 0 e = 1 tutte insieme, ma senza ottimizzazione (MyDebugabbleFunction) colpirà tutte le linee? –