2012-07-20 25 views
1

我试图调试一个核心转储我发现结构,其第一个变量指向0x00000055558.. 当我输入x 0x00000055558..,它输出:什么将“<_ZThn24_N15 [某些命名空间] 22 [某些类名称] D1Ev>”在gdb中的意思?

0x55558.. <_ZTVN15NameSpace22ClassNameE+16>: 0x0000005.. 

这是否意味着是这个类的一个变量在这里定义?尝试返回16个字节并将其转换为ClassName不会提供有效的值。

对不起,这样的新手问题,但我无法在谷歌找到相当多的时间。

+1

谷歌名称mangling,然后采取真实的名称(不是你错误地为这个问题制定的),并将其传递给C++ filt – PlasmaHH 2012-07-20 11:16:24

回答

3

您正在看到mangled name。你可以告诉GDB来还原函数为你(或者更好的是,从现在开始还原函数名):

set print demangle on 

根据this website,这个命令告诉GDB:

打印C++的名字在他们的源而不是以传递给汇编器和链接器进行类型安全链接的编码(“损坏”)形式。默认打开。

而且,要看到在某个地址的代码,你可以写:

l *0x<address> 
2

见其他答案的方式来还原函数一个符号名。它可能会变成像“vSpace for NameSpace :: ClassName”一样。 (以_ZTV开头的g ++符号是vtable。)

找到指向vtable内部偏移量的指针通常是一个非常好的指示,表明您已找到包含派生类型最多的对象的内存。当然,它并不保证它不会遗留在释放内存或某些其他事物上。

相关问题