मैं __attribute__
के साथ खेलने की कोशिश कर रहा हूं ताकि फ़ंक्शन को शेष कोड से अलग-अलग झंडे के साथ अनिवार्य रूप से संकलित किया जा सके। उदाहरण के लिए:जी ++ और __attribute __ ((ऑप्टिमाइज़)) डीबगर व्यवहार को बदल नहीं रहा
#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;
}
मैं जी -O2 साथ निर्माण कर रहा हूँ, लेकिन मैं sanely MyDebugabbleFunction()
डिबग करने के लिए सक्षम होना चाहते हैं - तो मैं अपनी घोषणा पर __attribute__((optimize(0)))
इस्तेमाल किया। हालांकि, डीबगर के साथ इन दो कार्यों के माध्यम से कदम उठाने पर मैं वास्तव में कोई अंतर नहीं बता सकता। मैं MyNormalFunction
में अनुकूलित कोड के माध्यम से कदम उठाने का प्रयास करते समय "आमतौर पर अनियमित" व्यवहार की अपेक्षा करता हूं, लेकिन MyDebuggableFunction
में मानक "-g" -only डीबगर व्यवहार।
क्या यह है कि मैंने __attribute__
के साथ कुछ गलत किया है? या मैंने दो कार्यों के अंदर खराब डेमो कोड (यानी कोड जो "बहुत अनुकूलित" नहीं किया है) का उपयोग किया है? या क्या मैं गलत व्याख्या कर रहा हूं कि डीबगर में क्या अंतर होना चाहिए?
मैं जीसीसी 4.6 का उपयोग कर रहा हूं।
संपादित GManNickG के सुझाव के आधार पर
मैं इस कोड के बजाय इस्तेमाल किया, और -O2 जी के साथ बनाया गया:
#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;
}
यदि आप उस फ़ंक्शन के लिए कोई अनुकूलन नहीं कर रहे हैं और यह अभी भी तोड़ रहा है, जहां ऑप्टिमाइज़ेशन बंद होने पर यह टूट नहीं जाता है, तो आप जिस समस्या को खोज रहे हैं वह किसी अन्य फ़ंक्शन में है। – Wug
एक बेहतर परीक्षण 'int foo() {int val = 0 हो सकता है; वैल = 1; वैल = 2; वापसी मूल्य; } '। फिर 'मुख्य' में बस प्रत्येक फ़ंक्शन के रिटर्न वैल्यू को प्रिंट करें। – GManNickG
वग - नहीं, इन कार्यों के साथ कोई समस्या नहीं है। वे सिर्फ इस __attribute__ कमांड का उपयोग करने के प्रभाव को प्रदर्शित करने की कोशिश कर रहे हैं। @GManNickG - तो विचार यह है कि अनुकूलन (MyNormalFunction) के साथ डीबगर = 0 और = 1 लाइनों को एक साथ छोड़ देगा, लेकिन ऑप्टिमाइज़ेशन (MyDebugabbleFunction) के बिना यह सभी लाइनों को हिट करेगा? –