À 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;
}
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?)
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;