1

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)
4

1 に答える 1

1

スタック フレーム #1 と同じファイルにあるにもかかわらず、GDB がトップ スタック フレームのソースの場所を特定できない理由を教えてください。

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

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

現在の GDB と GCC をビルドしてみてください。それでも失敗する場合は、小さなリプリケータを作成し、GDB にバグを報告します (GCC のバグであることが判明した場合は、GDB 開発者が教えてくれます)。

于 2012-04-17T16:02:24.900 に答える