2011-09-11 8 views
15

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; 

}

+0

"generowanie rdzeń" lol? –

+0

Tak, właśnie "rozdałem" mój sekret, aby zacząć od debuggera i ustawienia punktu przerwania; patrz poprawiona odpowiedź – sehe

Odpowiedz

8

roboty dla mnie:

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} 

To działa na mnie. Czego używasz (wersja gcc, system operacyjny, flagi kompilacji?)

+0

Jest podłączony! dlaczego znalazłem, że: (gdb) p p $ 1 = (A :: B *) 0x1878f010 (gdb) p (A :: B *) 0x1878f010 Błąd składni w wyrażeniu, w pobliżu ') 0x1878f010 '. (gdb) p * ((A :: B *) 0x1878f010) Błąd składni w wyrażeniu, w pobliżu ') 0x1878f010) '. –

+0

jest podłączony? Mam nadzieję, że to dobrze. Reszta komentarza nie miała dla mnie sensu, niestety – sehe

+0

Używam z tobą tych samych flag kompilacji. Mój os to CentOS 5 x 64. Wersja GDB to: GNU gdb Fedora (6.8-27.el5) Copyright (C) 2008 Free Software Foundation, Inc. Licencja GPLv3 +: GNU GPL wersja 3 lub nowsza To jest bezpłatne oprogramowanie: możesz je zmienić i rozpowszechniać. Nie ma ŻADNEJ GWARANCJI w zakresie dozwolonym przez prawo. Aby uzyskać szczegółowe informacje, wpisz "show copying" i "pokaż gwarancję". Ten GDB został skonfigurowany jako "x86_64-redhat-linux-gnu" ... –

14

Wiem, że jest to oznaczone jako odebrane, ale udało mi się odtworzyć ten problem za pomocą gdb na OS X (GNU gdb 6.3.50-20050815 (Apple version gdb-1820) (Sat Jun 16 02:40:11 UTC 2012)), a rozwiązanie works-for-me didn Odpowiedz mi na to.

Okazuje się, że nie było innego quesion na tak że miał odpowiedzi, który pracował, więc myślę, że warto pociągnięcie do tego quesiton:

Why gdb casting is not working?

Krótka odpowiedź jest taka, że ​​może być jedno- podać swój przestrzeni nazw zmiennych:

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

Powiązane problemy