2012-04-17 2 views
1

У меня проблема, когда я не могу перейти на некоторые функции с помощью 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) 
+0

Какие параметры вы передаете gcc при компиляции? Скомпилирован ли код с -ggdb? –

ответ

1

Может кто-нибудь сказать мне, почему GDB не может определить местоположение источника верхнего фрейма стека, даже если это в тот же файл, что и стоп-кадр # 1

Это ошибка, либо в GDB, либо в GCC.

К сожалению, вы не сказали нам, какие версии GCC и GDB вы используете, поэтому мы даже не можем догадаться, какие версии вам могут понадобиться обновить.

Попробуйте построить текущий GDB и GCC. Если они все еще терпят неудачу, напишите небольшой репродуктор и напишите ошибку с GDB (если это окажется ошибкой GCC, разработчики GDB скажут вам).

Смежные вопросы