Как перечислить методы класса в GDB? - PullRequest
26 голосов
/ 18 октября 2010

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

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

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

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

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

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

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

Спасибо

1 Ответ

34 голосов
/ 18 октября 2010

Вы можете использовать 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 (я не знаю, как это сделать за один шаг).

...