C++ 用GDB调试Clang生成的RTTI代码
我正在将Clang++与GDB一起使用。我注意到,对于一些多态类,GDB并没有显示正确的动态类型。经过调查,Clang在DWARF和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
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>}