C++ 用GDB调试Clang生成的RTTI代码

C++ 用GDB调试Clang生成的RTTI代码,c++,debugging,gdb,clang,C++,Debugging,Gdb,Clang,我正在将Clang++与GDB一起使用。我注意到,对于一些多态类,GDB并没有显示正确的动态类型。经过调查,Clang在DWARF和RTTI中使用了不同的类型名称: 我有一个模板类: template< class T, sc_writer_policy POL> class sc_signal : public sc_object {/*...*/} 当我调试此类的多态对象时,我得到了如下GDB错误: warning: RTTI symbol not found for clas

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

我有一个模板类:

template< class T, sc_writer_policy POL>
class sc_signal : public sc_object {/*...*/}
当我调试此类的多态对象时,我得到了如下GDB错误:

warning: RTTI symbol not found for class 'sc_core::sc_signal<int, (sc_core::sc_writer_policy)0>'
警告:未找到“sc\U核心::sc\U信号”类的RTTI符号
看起来问题的根源在于,它的类型名称在RTTI和Debug info中的保存方式似乎有所不同

来自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>
(gdb)信息类型sc\U信号
(gdb) info types sc_signal<int
All types matching regular expression "sc_signal<int":
sc_core::sc_signal<int, sc_core::SC_ONE_WRITER>
cout << typeid(*obj).name();
N7sc_core9sc_signalIiLNS_16sc_writer_policyE0EEE
sc_core::sc_signal<int, (sc_core::sc_writer_policy)0>
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;
}
(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}
(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>}