__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)))
ただし、デバッガーを使用してこれら2つの関数をステップ実行すると、実際には違いがわかりません。で最適化されたコードをステップスルーしようとしたときに通常見られる「一見不安定な」動作を期待しますMyNormalFunction
が、では標準の「-g」のみのデバッガー動作ですMyDebuggableFunction
。
私が何か間違ったことをしたということ__attribute__
ですか?または、2つの関数内で不正なデモコード(つまり、「あまり最適化されていない」コード)を使用したことがありますか?それとも、デバッガーの違いが何であるかを誤解していますか?
私はgcc4.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;
}