GDB красивая информация подкласса принтера - PullRequest
0 голосов
/ 16 февраля 2019

Я использую Clion IDE и VS Code для разработки и отладки C ++, и я заметил разницу, которая сводит меня с ума.В случае, если у меня есть вектор указателей на подклассы, Clion показывает мне тип подкласса, а VS Code - нет.Вот самый простой код, который я могу воспроизвести:

#include <iostream>
#include <memory>
#include <vector>
#include <string>

class A {
protected:
    int x;
public:
    A(int x) : x(x) {}

    virtual std::string to_str() { return std::to_string(x); }
};

class B : public A {
    int y;
public:
    B(int x, int y) : A(x), y(y) {}

    std::string to_str() override { return std::to_string(x) + '_' + std::to_string(y); }
};

class C : public A {
    std::string z;
public:
    C(int x, std::string z) : A(x), z(z) {}

    std::string to_str() override { return std::to_string(x) + '_' + z; }
};

int main() {
    std::vector<std::shared_ptr<A>> v;
    v.push_back(std::make_shared<B>(2, 3));
    v.push_back(std::make_shared<C>(4,"5"));

    for(auto &elem : v) {
        std::cout << elem->to_str() << std::endl;
    }

    return 0;
}

Без виртуальной функции нет информации о подклассе.И Clion, и VS Code используют один и тот же компилятор и GDB.Размещение точки останова внутри for и выполнение в консоли gdb:
p *elem.get() Я получаю $1 = {_vptr.A = 0x40fc70 <vtable for B+16>, x = 2}, однако в Clion я получаю $1 = (B) {<A> = {_vptr.A = 0x40fc70 <vtable for B+16>, x = 2}, y = 3}.

Перечисление конфигурации GDB не показывает никакой разницы (тот же самый gdbinit)Кроме того, перечисление симпатичных принтеров имеет некоторую разницу, но ничего не выделяется.

Я предполагаю, что Clion добавит специальный принтер, но результат будет тот же, если я отключу рендеры библиотеки.Я попробовал это на Windows (mingw64 GCC 8.2) и Linux (GCC 7.3) тоже, тот же результат.

Я проверил документацию по GDB pretty-printer, но она не очень полезна, поэтому я не пытался ее написать,Есть ли специальный симпатичный принтер для отображения типа и членов подкласса?

1 Ответ

0 голосов
/ 18 февраля 2019

Чтобы показать фактический тип объекта, CLion включает настройку GDB print object, которая описана в руководстве по GDB как:

set print object
set print object on

При отображении указателя наобъект, идентифицируйте фактический (производный) тип объекта, а не объявленный тип, используя таблицу виртуальных функций.Обратите внимание, что требуется таблица виртуальных функций - эта функция может работать только для объектов, которые имеют идентификацию типа во время выполнения;достаточно одного виртуального метода в объявленном типе объекта.

Это поведение включено при запуске сеанса отладки с использованием GDB, его нельзя отключить, кроме как из представления консоли GDB в CLion:

(gdb) set print object off
...