我正在和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>}