2012-08-24 40 views
5

Tôi đang cố gắng chơi với __attribute__ để cho phép một hàm được biên dịch cơ bản với các cờ khác nhau từ phần còn lại của mã. Ví dụ:G ++ và __attribute __ ((tối ưu hóa)) không thay đổi hành vi của trình gỡ lỗi

#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; 
} 

Tôi đang xây dựng với -O2 -g, nhưng tôi muốn để có thể sanely gỡ lỗi MyDebugabbleFunction() - vì vậy tôi đã sử dụng __attribute__((optimize(0))) về kê khai của mình. Tuy nhiên, tôi thực sự không thể nói bất kỳ sự khác biệt nào khi bước qua hai hàm này bằng một trình gỡ lỗi. Tôi sẽ mong đợi hành vi "dường như thất thường" mà tôi thường thấy khi cố gắng bước qua mã được tối ưu hóa trong MyNormalFunction, nhưng hành vi "debug" chuẩn --g "-g" trong MyDebuggableFunction.

Có phải tôi đã làm điều gì đó sai với __attribute__ không? Hoặc tôi đã sử dụng mã trình diễn không tốt (ví dụ: mã không nhận được "tối ưu hóa nhiều") bên trong hai hàm? Hoặc tôi hiểu sai sự khác biệt được cho là trong trình gỡ rối?

Tôi đang sử dụng gcc 4.6.


EDIT dựa trên đề nghị của GManNickG

tôi đã sử dụng mã này để thay thế, và xây dựng với -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; 
} 
+0

Nếu bạn đang sử dụng không tối ưu hóa cho chức năng đó và nó vẫn phá vỡ nơi nó không phá vỡ nếu tối ưu hóa là tắt, sau đó vấn đề bạn đang tìm kiếm là trong một chức năng khác. – Wug

+0

Một thử nghiệm tốt hơn có thể là 'int foo() {int val = 0; val = 1; val = 2; trả về val; } '. Sau đó, trong 'main' chỉ cần in ra giá trị trả về của mỗi hàm. – GManNickG

+0

Wug - không không, không có vấn đề gì với các chức năng này. Họ chỉ đang cố gắng chứng minh ảnh hưởng của việc sử dụng lệnh __attribute__ này. @GManNickG - vì vậy ý ​​tưởng là với tối ưu hóa (MyNormalFunction) trình gỡ lỗi sẽ bỏ qua các dòng = 0 và = 1 tất cả cùng nhau, nhưng không tối ưu hóa (MyDebugabbleFunction) nó sẽ đánh tất cả các dòng? –

Trả lời

2

Hãy thử một thử nghiệm như thay vì điều này:

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; 
} 

Nó sẽ làm cho nó dễ dàng hơn để làm theo.


Lưu ý rằng bạn nên bắt đầu trong main, khi bước qua, bởi vì nó rất có thể sẽ được giảm xuống còn:

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

Nếu bạn đang lên cho nó, nhìn vào tháo dỡ làm nhiệm vụ này dễ dàng hơn nhiều.

0

Sau khi sửa chữa các lỗi trong mã, vì vậy nó biên dịch:

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 

Như bạn có thể thấy các thuộc tính tối ưu hóa hoạt động tốt.

+0

chắc chắn, nhưng tôi đã tìm kiếm một bản demo mà tôi có thể thấy sự khác biệt khi bước qua với một trình gỡ lỗi. Bạn phải khắc phục những lỗi nào? (Nó biên soạn tốt cho tôi). –

Các vấn đề liên quan