私は__attribute__
と遊んで、コードの残りの部分とは異なるフラグで本質的にコンパイルできるようにしています。たとえば:G ++と__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で構築していますが、私はsanely MyDebugabbleFunction()
をデバッグできるようにしたい - ので、私はその宣言に__attribute__((optimize(0)))
を使用しました。しかし、私は実際にデバッガでこれら2つの機能を実行するときに違いを感じることはできません。 MyNormalFunction
で最適化されたコードをステップ実行しようとするときに私が通常見る "一見不思議な"振る舞いを期待しますが、標準的な "-g" - オンリーデバッガの振る舞いはMyDebuggableFunction
です。
__attribute__
で何か問題が起きたことはありますか?または、私は2つの関数の中で悪いデモコード(つまり、「最適化されていない」コード)を使用しましたか?あるいは、私はデバッガの違いがどうなっているのか誤解していますか?
私はgcc 4.6を使用しています。
GManNickGの提案
に基づくEDIT私の代わりにこのコードを使用して、-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;
}
その機能の最適化機能を使用しておらず、最適化機能がオフの場合でも問題が解消されない場合、探している問題は別の機能にあります。 – Wug
より良いテストは 'int foo(){int val = 0; val = 1; val = 2;戻り値。 } '。そして、 'main'では各関数の戻り値を出力します。 – GManNickG
Wug - いいえ、これらの機能に問題はありません。彼らはこの__attribute__コマンドの使用の影響を実証しようとしています。 @@GManNickG - 最適化(MyNormalFunction)では、デバッガは= 0と= 1行をすべてスキップしますが、最適化(MyDebugabbleFunction)がなければすべての行がヒットします。 –