У меня проблема, когда я не могу перейти на некоторые функции с помощью GDB.GDB backtrace говорит мне имя символа, но не исходный файл
Я использую «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())
- Я не могу вставить INSIDE функцию; когда я выполняю
step
, он просто перешагивает вызов.
Это то, что мой StackTrace выглядит, когда я нахожусь на контрольной точке внутри 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
Может кто-нибудь сказать мне, почему GDB не может определить местоположение источника верхнего фрейма стека , хотя он находится в том же файле, что и стоп-кадр # 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? –