如果对象的类类型像A :: B ,如何使用GDB从地址打印c对象成员

参见英文答案 > Why gdb casting is not working?3
从这个链接
gdb interpret memory address as an object
我们知道,如果A类的对象处于特定的地址,如0x6cf010,那么我们可以使用:
(gdb) p *(A *) 0x6cf010

打印此对象的成员元素.

但是,当c命名空间涉及时,这似乎不起作用.也就是说,如果类型为A :: B的对象,则所有以下尝试都不起作用:

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

那么,谁知道如何在这个条件下打印对象元素?

我们可以使用以下故意的核心代码尝试从地址打印p的成员(我们可以使用“info locals”显示地址).

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

}

解决方法

为我工作:
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版本,操作系统,编译标志?)

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...