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