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