GDB を使用していくつかの関数にステップインできないように見える問題があります。
私は「PImplイディオム」を使用しています.cppファイルにインラインクラスがあり、公開されているクラスから呼び出される関数が含まれています。
// Foo.cpp
class FooImpl
{
public:
void open()
{
// ...
}
};
Foo::open()
{
// Impl is a FooImpl*
impl->open();
}
デバッガーを使用すると、 にステップインできないようですFooImpl::open()
。
- 呼び出しがインライン化されていないことは確かです (私は使用しており、アセンブリ内
-fno-inline
の命令を見ることができます)。call
- 関数内にブレークポイントを設定すると、GDB がそのブレークポイントにヒットし、その名前と現在の関数を教えてくれます。
- ただし、ソースファイルは教えてくれません (Foo::open() と同じファイルですが)。
- 関数の内側にステップインできません。を実行する
step
と、単に呼び出しをステップオーバーします。
FooImpl::open()
呼び出し内のブレークポイントにいるときのスタック トレースは次のようになります。
#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 がトップ スタック フレームのソースの場所を特定できない理由を教えてください。
(記録として、バックグラウンドで GDB を使用するグラフィカル デバッガー (Qt Creator) を使用していますが、GDB を直接実行する場合も同じことが言えます)。
編集: コンパイル コマンド ラインは次のようになります。
g++ -c -pipe -g -O0 -fno-inline -ggdb -fPIC -Wall -W ...(defines, include dirs, object file, source file)