web-dev-qa-db-fra.com

Comment imprimer un objet d'objet C ++ à l'aide de GDB à partir d'une adresse si le type de classe de l'objet est comme A :: B

À partir de ce lien GDB interpréter l'adresse de la mémoire comme objet Nous savons que, si un objet de type de classe A est à une adresse spécifique telle que 0x6CF010, nous pouvons utiliser:

(gdb) p *(A *) 0x6cf010 

imprimer les éléments de membre de cet objet.

Cependant, cela semble ne fonctionne pas lorsque l'espace de noms C++ est impliqué. C'est-à-dire que si l'objet de type A :: B, alors tous les suivants qui essaient ne fonctionnent pas:

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

Alors, qui sait comment imprimer les éléments d'objet dans ces conditions?


Nous pouvons utiliser le code de base délibéré suivant pour tenter d'imprimer les membres de P de l'adresse (nous pouvons utiliser "Info Locaux" pour afficher l'adresse).

#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;

}

15
Gary Hu

Travaille pour moi:

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}

Ça marche pour moi. Qu'utilisez-vous (version GCC, OS, drapeaux de compilation?)

9
sehe

Je sais que cela est étiqueté comme répondu, mais j'ai pu reproduire ce problème à l'aide de GDB sur OS X (GNU gdb 6.3.50-20050815 (Apple version gdb-1820) (Sat Jun 16 02:40:11 UTC 2012)) et la solution de travail-for-moi ne vous répondait pas pour moi.

Il se trouve qu'il y avait une autre question sur SO qui a eu une réponse qui a fonctionné, alors je pense que cela vaut la peine de tirer dans ce quesiton:

Pourquoi la coulée GDB ne fonctionne pas?

La réponse courte est que vous devrez peut-être avoir à citer vos variables au nom de noms:

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

17
Matt