Od tego linku gdb interpret memory address as an object wiemy, że jeśli obiekt klasy typu A znajduje się pod określonym adresem, takim jak 0x6cf010, to możemy użyć:Jak wydrukować elementy obiektu C++ za pomocą GDB z adresu, jeśli typ klasy obiektu jest podobny: A :: B
(gdb) p *(A *) 0x6cf010
wydrukować elementy członkiem tego obiektu.
Jednak wydaje się, że to nie działa, gdy w grę wchodzi przestrzeń nazw w języku C++. Oznacza to, że jeśli obiekt typu klasa A :: B, a następnie wszystkie następujące męczący nie działa:
(gdb) p *(A::B *) 0x6cf010
(gdb) p *((A::B *) 0x6cf010)
Więc, kto wie, jak drukować elementy obiektów w tych warunkach?
Możemy użyć następującego kodu umyślne rdzenia do próby drukowania członków p od adresu (możemy użyć „Info mieszkańcami”, aby wyświetlić adres).
#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;
}
"generowanie rdzeń" lol? –
Tak, właśnie "rozdałem" mój sekret, aby zacząć od debuggera i ustawienia punktu przerwania; patrz poprawiona odpowiedź – sehe