从这个链接 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) p ('MyScope::MyClass'*) ptr;
适合我:
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版本,操作系统,编译标志?)
归档时间: |
|
查看次数: |
46688 次 |
最近记录: |