使用GDB调试Clang生成的RTTI代码

时间:2018-01-26 21:24:06

标签: c++ debugging gdb clang

我正在和GDB一起使用Clang ++。我注意到,对于某些多态类,GDB没有显示正确的动态类型。经过一番调查后发现,Clang在DWARF和RTTI中输入了不同的类型名称:

我有一个模板类:

template< class T, sc_writer_policy POL>
class sc_signal : public sc_object {/*...*/}

其中sc_writer_policy是枚举:

enum sc_writer_policy
{
  SC_ONE_WRITER        = 0, 
  SC_MANY_WRITERS      = 1, 
  SC_UNCHECKED_WRITERS = 3
};

当我调试这个类的多态对象时,我得到了像这样的GDB错误:

warning: RTTI symbol not found for class 'sc_core::sc_signal<int, (sc_core::sc_writer_policy)0>'

看起来问题的根源是它的类型名称似乎在RTTI和调试信息中保存的方式不同。

来自GDB:

(gdb) info types sc_signal<int
All types matching regular expression "sc_signal<int":
sc_core::sc_signal<int, sc_core::SC_ONE_WRITER>

使用RTTI:

cout << typeid(*obj).name();
N7sc_core9sc_signalIiLNS_16sc_writer_policyE0EEE

所以在RTTI中我们已经破坏了

sc_core::sc_signal<int, (sc_core::sc_writer_policy)0>

是否可以在两种情况下使Clang发出相同的类型名称,以便可以在GDB中调试?或者是否可以让GDB理解

sc_core::sc_signal<int, sc_core::SC_ONE_WRITER> 
sc_core::sc_signal<int, (sc_core::sc_writer_policy)0>

是相同的类型吗?

完整的代码示例:

#include <typeinfo>
#include <iostream>

namespace sc_core
{

enum sc_writer_policy
{
    SC_ONE_WRITER        = 0,
    SC_MANY_WRITERS      = 1,
    SC_UNCHECKED_WRITERS = 3
};

class sc_object {
public:
    virtual ~sc_object(){}
};

template< class T, sc_writer_policy POL = SC_ONE_WRITER>
class sc_signal : public sc_object {
    T dummy_field = 42;
};

}

int main() {
    sc_core::sc_object *obj = new sc_core::sc_signal<int>();
    std::cout << typeid(obj).name() << std::endl;
    return 0;
}

使用g ++ 7.0编译时在GDB中进行测试:

(gdb) p *obj
$2 = (sc_core::sc_signal<int, (sc_core::sc_writer_policy)0>) {<sc_core::sc_object> = {_vptr.sc_object = 0x400c78 <vtable for sc_core::sc_signal<int, (sc_core::sc_writer_policy)0>+16>}, dummy_field = 42}

使用Clang 5.0编译时在GDB中进行测试:

(gdb) p *obj
warning: RTTI symbol not found for class 'sc_core::sc_signal<int, (sc_core::sc_writer_policy)0>'
$1 = warning: RTTI symbol not found for class 'sc_core::sc_signal<int, (sc_core::sc_writer_policy)0>'
warning: RTTI symbol not found for class 'sc_core::sc_signal<int, (sc_core::sc_writer_policy)0>'
{_vptr$sc_object = 0x400df0 <vtable for sc_core::sc_signal<int, (sc_core::sc_writer_policy)0>+16>}

0 个答案:

没有答案