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

Gar*_* Hu 15 c++ linux gdb

从这个链接 gdb解释内存地址作为对象, 我们知道,如果类类型A的对象在特定地址(如0x6cf010),那么我们可以使用:

(gdb) p *(A *) 0x6cf010 
Run Code Online (Sandbox Code Playgroud)

打印此对象的成员元素.

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

(gdb) p *(A::B *) 0x6cf010
(gdb) p *((A::B *) 0x6cf010)
Run Code Online (Sandbox Code Playgroud)

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


我们可以使用以下有意的核心代码来尝试从地址打印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;
Run Code Online (Sandbox Code Playgroud)

}

Mat*_*att 17

我知道这被标记为已回答,但我能够在OS X上使用gdb重现此问题,(GNU gdb 6.3.50-20050815 (Apple version gdb-1820) (Sat Jun 16 02:40:11 UTC 2012))并且for-for-me解决方案没有为我解答.

原来还有另一个关于SO的问题确实有一个有效的答案,所以我认为值得深入研究这个问题:

为什么gdb转换不起作用?

简短的回答是您可能必须单引号命名您的命名空间变量:

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


seh*_*ehe 9

适合我:

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}
Run Code Online (Sandbox Code Playgroud)

这个对我有用.你在用什么(gcc版本,操作系统,编译标志?)