2012-08-24 10 views
5

मैं __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; 
} 
+0

यदि आप उस फ़ंक्शन के लिए कोई अनुकूलन नहीं कर रहे हैं और यह अभी भी तोड़ रहा है, जहां ऑप्टिमाइज़ेशन बंद होने पर यह टूट नहीं जाता है, तो आप जिस समस्या को खोज रहे हैं वह किसी अन्य फ़ंक्शन में है। – Wug

+0

एक बेहतर परीक्षण 'int foo() {int val = 0 हो सकता है; वैल = 1; वैल = 2; वापसी मूल्य; } '। फिर 'मुख्य' में बस प्रत्येक फ़ंक्शन के रिटर्न वैल्यू को प्रिंट करें। – GManNickG

+0

वग - नहीं, इन कार्यों के साथ कोई समस्या नहीं है। वे सिर्फ इस __attribute__ कमांड का उपयोग करने के प्रभाव को प्रदर्शित करने की कोशिश कर रहे हैं। @GManNickG - तो विचार यह है कि अनुकूलन (MyNormalFunction) के साथ डीबगर = 0 और = 1 लाइनों को एक साथ छोड़ देगा, लेकिन ऑप्टिमाइज़ेशन (MyDebugabbleFunction) के बिना यह सभी लाइनों को हिट करेगा? –

उत्तर

2

इस बजाय की तरह एक परीक्षण का प्रयास करें:

int MyNormalFunction() 
{ 
    int val = 0; 
    val = 1; 
    val = 2; 

    // should optimize to return 2 
    return val; 
} 

int MyDebuggableFunction() __attribute__((optimize(0))); 
{ 
    int val = 0; 
    val = 1; 
    val = 2; 

    // could optimize to return 2, but attribute blocks that 
    return val; 
} 

int main() 
{ 
    // we need to actually output the return values, 
    // or main itself could be optimized to nothing 
    std::cout << MyNormalFunction() << std::endl; 
    std::cout << MyDebuggableFunction() << std::endl; 
} 

यह इसे पालन करना अधिक आसान बना देगा।


ध्यान दें कि आप main, में शुरू कर देना चाहिए जब के माध्यम से कदम है, क्योंकि यह सबसे अधिक संभावना को कम किया जाएगा:

int main() 
{ 
    std::cout << 2 << std::endl; 
    std::cout << MyDebuggableFunction() << std::endl; 
} 

आप इसके लिए कर रहे हैं, disassembly को देखकर इस कार्य करता है बहुत आसान।

0

कोड में त्रुटियों को ठीक करने के बाद, तो यह संकलित:

g++ -S x.c 

_Z16MyNormalFunctionv: 
.LFB1255: 
    .cfi_startproc 
    movl $2, %eax 
    ret 

_Z20MyDebuggableFunctionv: 
.LFB1256: 
    .cfi_startproc 
    movl $0, -4(%rsp) 
    movl $1, -4(%rsp) 
    movl $2, -4(%rsp) 
    movl -4(%rsp), %eax 
    ret 

आप देख सकते हैं अनुकूलन विशेषता ठीक काम किया।

+0

यकीन है, लेकिन मैं एक डेमो की तलाश में था कि एक डीबगर के साथ कदम उठाने पर मैं अंतर देख सकता था। आपको क्या त्रुटियों को ठीक करना पड़ा? (यह मेरे लिए ठीक संकलित)। –

संबंधित मुद्दे