Подтвердить что ты не робот

Как перечислить методы класса в gdb?

Я искал это для поиска и просматривал руководство gdb, но, похоже, не нашел ответа на то, что я пытаюсь сделать.

Есть ли способ заставить gdb распечатать список всех методов для данного типа класса? Кажется, что команда печати показывает члены данных и поля, ни один из методов не отображается для нее.

Кроме того, чтобы сделать это еще дальше, существует ли способ распечатать все правильные виртуальные методы, заданные указателем базы *? Скажем, например:

struct A
{
  virtual void foo() {}
};

struct B : public A
{
  void foo() {}
};

int main()
{
  A *b = new B;
}

Как я могу получить gdb для печати переменной * b и показать ему правильный виртуальный метод (ы)?

Спасибо

4b9b3361

Ответ 1

Вы можете использовать ptype.

Предположим, что эти строки добавляются в ваш пример:

A alpha;
B beta;

Теперь в gdb я могу попросить описание типа класса (или экземпляр одного):

(gdb) ptype alpha
type = class A {
  public:
    virtual void foo();
}

(gdb) ptype A
type = class A {
  public:
    virtual void foo();
}

(gdb) ptype beta
type = class B : public A {
  public:
    virtual void foo();
}

(gdb) ptype B
type = class B : public A {
  public:
    virtual void foo();
}

Если я попробую это с помощью указателя, я получаю объявленный тип:

(gdb) ptype b
type = class A {
  public:
    virtual void foo();
} *

Если мне нужен реальный тип, я должен установить переменную `print object ':

(gdb) set print object on
(gdb) ptype b
type = /* real type = B * */
class A {
  public:
    virtual void foo();
} *

а затем снова вызовите ptype, чтобы узнать, что имеет B (я не знаю, как это сделать за один шаг).