Как печатать члены объекта С++ с использованием 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;