2012-04-17 5 views
1

GDBを使用していくつかの機能に入ることができないという問題があります。デバッガを使用してGDBのバックトレースがシンボル名を通知しますが、ソースファイルは表示されません

// Foo.cpp 


class FooImpl 
{ 
public: 
    void open() 
    { 
     // ... 
    } 
}; 


Foo::open() 
{ 
    // Impl is a FooImpl* 
    impl->open(); 
} 

を:私はそうのように、公開さクラスから呼び出される関数を含む、私は私の.cppファイルにインラインクラスを持っている「PIMPLイディオム」を、使用してい

、私はFooImpl::open()に入ることはできません。

  • 私は(私は-fno-inlineを使用していると私は、アセンブリ内のcall命令を見ることができます)呼び出しがインライン化されていないことを確認するために知っています。
  • 私は関数内にブレークポイントを設定することができ、GDBはそのブレークポイントに命中し、その名前と私の関数を教えてくれます。
  • しかし、ソースファイルは教えてくれませんFoo :: open())
  • 私は関数をINSIDEすることはできません。 stepを実行すると、単にコールをステップオーバーします。

これは私がFooImpl::open()コール内部のブレークポイントにしていたときに私のスタックトレースは次のようになります。GDBは、トップスタックフレームのソースの場所を決定することができない理由

#0 0x080eee52 in macawi::PowerMateInputImpl::open(std::string)() 
#1 0x080ee766 in macawi::PowerMateInput::open (this=0x83cf204) 
    at ../../app/hal/interfaces/powermateinput_linux.cpp:126 
#2 0x08137455 in macawi::ActorInput::backgroundLoop (this=0x83cf204) 
    at ../../app/common/actors/actorinput.cpp:51 

誰も教えてもらえますたとえそれがスタックフレーム#1と同じファイルに入っていても?

(私は、GDBをバックグラウンドで使用するグラフィカルなデバッガ(Qt Creator)を使用していますが、GDBを直接実行するときにも同じことが言えます)。


EDITは:コンパイルのコマンドラインは次のようになります。

g++ -c -pipe -g -O0 -fno-inline -ggdb -fPIC -Wall -W ...(defines, include dirs, object file, source file) 
+0

コンパイル時にgccにどのようなオプションを渡しますか?コードは-ggdbでコンパイルされていますか? –

答えて

1
GDBはそれがでだにもかかわらず、トップスタックフレームのソースの場所を決めることができない理由

は、誰も私を伝えることができますスタックフレーム#1と同じファイル

これはGDBまたはGCCのバグです。

残念ながら、使用しているGCCとGDBのバージョンを教えてくれていないので、どのバージョンを更新する必要があるかも推測できません。

現在のGDBとGCCをビルドしてみてください。彼らがまだ失敗した場合は、小さな再生器を作成し、GDBにバグを報告します(GCCのバグであると判明した場合、GDB開発者があなたに伝えます)。

関連する問題