Вопрос или проблема
Я собрал gdb-7.12 с поддержкой Python на своем Ubuntu 14.04 и включил красивую печать, а также настроил свой файл gdbinit, следуя https://sourceware.org/gdb/wiki/STLSupport.
Но каждый раз, когда я пытаюсь напечатать размер любого контейнера:
p ivec.size()
Не удается оценить функцию -- возможно, она встроена
Вот минимальный рабочий пример, который я использую
#include <vector>
using namespace std;
int main(){
vector<int> ivec;
return 0;
}
Я пробовал разные варианты компиляции
g++-6 -g -O0 -fno-inline-functions -gdwarf-2 Source.cpp --std=c++14
На самом деле, я пробовал каждую комбинацию из вышеперечисленных опций, и всегда одна и та же проблема.
Я попробовал переключиться на gdb-7.11 (тоже собранный из исходников), чтобы посмотреть, решит ли это проблему, и также переключился на g++-4.8, ни один из них, похоже, не исправил проблему.
Что я делаю не так? Существует ли какой-то специфический порядок, в котором нужно указывать опции? Есть ли способ проверить, работает ли опция -O0?
У вас должен быть вызов vector::size(), чтобы функция была скомпилирована. Она не компилируется, потому что это шаблон класса. Я думаю, что вызов также должен быть в том же контексте, но я не уверен в этом.
Ответ или решение
Ваш вопрос о том, почему функции STL все еще отображаются как инлайновые в gdb даже после отключения оптимизаций, является довольно распространенной проблемой, с которой сталкиваются разработчики, использующие отладчики.
-
Проблема с компиляцией:
Чтобы gdb мог корретно отобразить результаты вызовов методов контейнеров STL, таких какvector::size()
, необходимо убедиться, что компилятор действительно компилирует эти функции.В вашем примере код не вызывает метод
size()
. Нужно модифицировать код, чтобы делать вызов этого метода:#include <vector> #include <iostream> using namespace std; int main(){ vector<int> ivec; ivec.push_back(1); cout << "Size of vector: " << ivec.size() << endl; // Вызов функции size() return 0; }
-
Использование правильных флагов компиляции:
Для компиляции вашего кода необходимо использовать соответствующие опции. Попробуйте следующую команду:g++-6 -g -O0 -fno-inline -gdwarf-2 Source.cpp --std=c++14
Здесь
-fno-inline
гарантирует, что функции не будут инлайновыми, и-g
включает отладочную информацию. -
Проверка отладочной информации:
Чтобы убедиться, что отладочная информация создается правильно, вы можете использовать командуobjdump
для просмотра сгенерированного кода:objdump -d -S a.out
Это позволит вам увидеть код с вставленной отладочной информацией, чтобы понять, вызывается ли
vector::size()
. -
Замечания по gdb:
Если при выполненииp ivec.size()
вы все равно получаете сообщение о том, что функция может быть инлайновой, это может быть связано с тем, как gdb обрабатывает шаблонные функции. Иногда проблемы с шаблонами могут приводить к таким сообщениям, даже если функции не инлайновые. -
Версия gdb:
Если вы используете gdb-7.12 и у вас возникли проблемы, попробуйте обновить gdb до более новой версии, поскольку в более поздних версиях может быть улучшена поддержка STL.
Резюмируя, убедитесь, что вы вызываете функцию size()
в коде, используйте правильные флаги компиляции и проверьте, сгенерирован ли необходимый отладочный код. Если проблема сохраняется, возможно, стоит рассмотреть обновление gdb до более новой версии и проверить другие версии компилятора.