Bir işlevin, kodun geri kalanından farklı bayraklarla temel olarak derlenmesine izin vermek için __attribute__
ile oynamaya çalışıyorum. Örneğin:G ++ ve __attribute __ ((optimize)) hata ayıklayıcı davranışını değiştirmiyor
#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;
}
Ben -g -o2 ile inşa ediyorum, ama sanely MyDebugabbleFunction()
hata ayıklama yapabilmek istiyor - bu yüzden onun beyanı üzerine __attribute__((optimize(0)))
kullandı. Ancak, bu iki işlevi bir hata ayıklayıcısına yönlendirirken gerçekten bir fark bile edemiyorum. Genellikle MyNormalFunction
'da optimize edilmiş koddan geçmeye çalışırken gördüğüm "görünüşte düzensiz" davranışı, ancak MyDebuggableFunction
'da standart "-g" -only debugger davranışını beklerim.
__attribute__
ile ilgili bir sorun mu var? Ya da iki fonksiyonun içinde kötü demo kodu (yani "çok optimize edilmiş" olmayan kod) kullandım mı? Yoksa hata ayıklayıcıda farkın ne olduğunu yanlış yorumluyor muyum?
gcc 4.6 kullanıyorum.
#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;
}
Bu işlev için herhangi bir optimizasyon kullanmıyorsanız ve optimizasyon kapalıysa hala kırılmadığı yerde kırılıyorsa, aradığınız sorun başka bir işlevdedir. – Wug
Daha iyi bir test 'int foo() {int val = 0; val = 1; val = 2; dönüş valı; } '. Sonra 'ana' her işlevin dönüş değerini yazdırın. – GManNickG
Wug - hayır hayır, bu işlevlerde sorun yok. Sadece bu __attribute__ komutunu kullanmanın etkisini göstermeye çalışıyorlar. @GManNickG - bu nedenle, optimizasyon (MyNormalFunction) ile hata ayıklayıcının = 0 ve = 1 satırlarını birlikte atlayacağı, ancak optimizasyon (MyDebugabbleFunction) olmadan tüm satırları vuracağıdır. –