首页 > 程序人生 > C++结构类型在GDB中的强制类型转换

C++结构类型在GDB中的强制类型转换

今天在调试程序的过程中遇到的一个小问题,在这里记录一下,希望能对遇到同样问题的朋友有所帮助。

以下面的程序为例程进行说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class Base
{
public:
 
    Base(int nNum) :
        m_nNum(nNum)
    {}
 
private:
 
    int m_nNum;
};
 
class A : public Base
{
public:
 
    A(int nNum, char bCh) :
        Base(nNum),
        m_bCh(bCh)
    {}
 
private:
 
    char m_bCh;
};
 
namespace Test
{
    class Base
    {   
        public:
 
            Base(int nNum) :
                m_nNum(nNum)
        {}  
 
        private:
 
            int m_nNum;
    };  
 
    class A : public Base
    {   
        public:
 
            A(int nNum, char bCh) :
                Base(nNum),
                m_bCh(bCh)
        {}  
 
        private:
 
            char m_bCh;
    };
}
 
int main()
{
    Base * pObj1 = new A(10, 'A');
    Test::Base * pObj2 = new Test::A(10, 'A');
 
    delete pObj1;
    delete pObj2;
}

相信只要有点C++基础的人都能够看懂上面的程序,如果看不懂的话,还是先回去学C++吧,嘿嘿!好了,言规正传,现在抛出问题:用gdb启动编译好的程序,在63行处设置断点,如何查看pObj1和pObj2的m_bCh的值?

1. 第一次尝试,直接p *pObj1,结果如下所示:

1
2
3
4
(gdb) p *pObj1
$1 = {
  m_nNum = 10
}

2. 由第一次尝试的结果,想到了强制类型转型,转换为子类A的指针类型,然后再print, 结果如下:

1
2
3
4
5
6
7
8
(gdb) p *(A*)pObj1 
$3 = {
    Base = {
    m_nNum = 10
  }, 
  members of A: 
  m_bCh = 65 'A'
}

这里便可以看到pObj1的m_bCh的值了。
3. 有了上面的经验,对于pObj2的m_bCh,就依上面2中的方法,直接上了,结果如下:

1
2
(gdb) p *(Test::A*)pObj2
A syntax error in expression, near `)pObj2'.

汗啊,居然提示说是语法错误,于是在网上找啊找,终于找到了解决的方法。
4. 下面是找到的方法,说是带namespace的强制转型要加单引号的,好诡异的语法:

1
2
3
4
5
6
7
8
(gdb) p *('Test::A'*)pObj2
$5 = {
   test ::Base = {
    m_nNum = 10
  }, 
  members of Test::A: 
  m_bCh = 65 'A'
}

通过上面一步步的介绍,相信读者朋友对GDB中结构类型的强制类型转换已经有了较为深入的了解,这里特别注意的就是第4步中提到的带namespace的结构类型,其它的跟C++基本中的类型的强制转换是一致的。

  1. 本文目前尚无任何评论.
  1. 2010年4月18日12:51 | #1
您必须在 登录 后才能发布评论.