Как печатать члены объекта С++ с использованием GDB с адреса, если тип класса объекта похож на A:: B

Из этой ссылки gdb интерпретировать адрес памяти как объект мы знаем, что если объект класса A имеет определенный адрес, такой как 0x6cf010, то мы можем использовать:

(gdb) p *(A *) 0x6cf010 

для печати элементов элемента этого объекта.

Однако, похоже, это не работает, когда используется пространство имен С++. То есть, если объект класса типа A:: B, то все следующие попытки не работают:

(gdb) p *(A::B *) 0x6cf010
(gdb) p *((A::B *) 0x6cf010)

Итак, кто знает, как печатать элементы объекта в этих условиях?


Мы можем использовать следующий преднамеренный код ядра, чтобы попытаться напечатать элементы p из адреса (мы можем использовать "локаторы информации" для отображения адреса).

#include <stdio.h>

namespace A
{
    class B
    {
    public:
        B(int a) : m_a(a) {}

        void print()
        {
            printf("m_a is %d\n", m_a);
        }

    private:
        int  m_a;
    };
}

int main()
{
    A::B *p = new A::B(100);

    p->print();

    int *q = 0;

    // Generating a core here
    *q = 0;
    return 0;

}

Ответы

Ответ 1

Работает для меня:

g++ -g test.cpp -o test
gdb test
(gdb) break main
(gdb) r


Breakpoint 1, main () at test.cpp:22
22      A::B *p = new A::B(100);
(gdb) n
24      p->print();
(gdb) n
m_a is 100
26      int *q = 0;
(gdb) p p
$1 = (A::B *) 0x602010
(gdb) p (A::B *) 0x602010
$2 = (A::B *) 0x602010
(gdb) p *((A::B *) 0x602010)
$3 = {m_a = 100}

Это работает для меня. Что вы используете (версия gcc, ОС, флаги компиляции?)

Ответ 2

Я знаю, что это помечено как ответ, но я смог воспроизвести эту проблему с помощью gdb на OS X (GNU gdb 6.3.50-20050815 (Apple version gdb-1820) (Sat Jun 16 02:40:11 UTC 2012)), и решение "работа для меня" не ответило мне.

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

Почему кастинг gdb не работает?

Короткий ответ заключается в том, что вам может потребоваться одинарная котировка переменных, замененных именами:

(gdb) p ('MyScope::MyClass'*) ptr;