2012-08-24 2 views
5

私は__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; 
} 
+0

その機能の最適化機能を使用しておらず、最適化機能がオフの場合でも問題が解消されない場合、探している問題は別の機能にあります。 – Wug

+0

より良いテストは 'int foo(){int val = 0; val = 1; val = 2;戻り値。 } '。そして、 'main'では各関数の戻り値を出力します。 – GManNickG

+0

Wug - いいえ、これらの機能に問題はありません。彼らはこの__attribute__コマンドの使用の影響を実証しようとしています。 @@GManNickG - 最適化(MyNormalFunction)では、デバッガは= 0と= 1行をすべてスキップしますが、最適化(MyDebugabbleFunction)がなければすべての行がヒットします。 –

答えて

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

、解体を見ていることは、このタスクを作りますはるかに簡単です。コード内のエラーを修正した後

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 

あなたが最適化の属性がうまく働いた見ることができるように。

+0

確かに、私はデモを見ていたので、デバッガを使って歩いていくとその違いを見ることができました。どのようなエラーを修正しなければなりませんでしたか? (それは私のためにうまくコンパイルされました)。 –

関連する問題