Функции STL gdb по-прежнему отображаются как встроенные после отключения оптимизаций

Вопрос или проблема

Я собрал 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 даже после отключения оптимизаций, является довольно распространенной проблемой, с которой сталкиваются разработчики, использующие отладчики.

  1. Проблема с компиляцией:
    Чтобы 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;
    }
  2. Использование правильных флагов компиляции:
    Для компиляции вашего кода необходимо использовать соответствующие опции. Попробуйте следующую команду:

    g++-6 -g -O0 -fno-inline -gdwarf-2 Source.cpp --std=c++14

    Здесь -fno-inline гарантирует, что функции не будут инлайновыми, и -g включает отладочную информацию.

  3. Проверка отладочной информации:
    Чтобы убедиться, что отладочная информация создается правильно, вы можете использовать команду objdump для просмотра сгенерированного кода:

    objdump -d -S a.out

    Это позволит вам увидеть код с вставленной отладочной информацией, чтобы понять, вызывается ли vector::size().

  4. Замечания по gdb:
    Если при выполнении p ivec.size() вы все равно получаете сообщение о том, что функция может быть инлайновой, это может быть связано с тем, как gdb обрабатывает шаблонные функции. Иногда проблемы с шаблонами могут приводить к таким сообщениям, даже если функции не инлайновые.

  5. Версия gdb:
    Если вы используете gdb-7.12 и у вас возникли проблемы, попробуйте обновить gdb до более новой версии, поскольку в более поздних версиях может быть улучшена поддержка STL.

Резюмируя, убедитесь, что вы вызываете функцию size() в коде, используйте правильные флаги компиляции и проверьте, сгенерирован ли необходимый отладочный код. Если проблема сохраняется, возможно, стоит рассмотреть обновление gdb до более новой версии и проверить другие версии компилятора.

Оцените материал
Добавить комментарий

Капча загружается...