我正在尝试使用__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;
}
我正在使用-g -O2进行构建,但我希望能够灵活地调试MyDebugabbleFunction()
- 所以我在其声明中使用了__attribute__((optimize(0)))
。但是,当使用调试器单步执行这两个函数时,我无法区分任何差异。我希望在尝试逐步完成MyNormalFunction
中的优化代码时,通常会看到“看似不稳定”的行为,但MyDebuggableFunction
中的标准“-g”-only调试器行为。
我对__attribute__
做错了吗?或者我在两个函数中使用了不好的演示代码(即代码没有得到“优化很多”)?或者我是否误解了调试器中应该有什么区别?
我正在使用gcc 4.6。
根据GManNickG的建议进行编辑
我使用了这段代码,并使用-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 :(得分: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;
}
如果您愿意,请查看反汇编使这项任务变得更加容易。
答案 1 :(得分: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
正如您所看到的,优化属性运行良好。