从核心转储中识别auto_ptr背后的具体对象类型

时间:2012-10-17 14:22:47

标签: c++ gdb postmortem-debugging

我有一个auto_ptr<IFoo>,其中IFoo是一个只有纯虚方法的接口。

我现在在分段错误之后还有一个核心文件,我真的想知道这个auto_ptr背后的具体子类是什么。由于dynamic_cast在项目中起作用,我认为RTTI必须以某种方式提供,但我不知道如何通过gdb访问此信息?

我得到的输出如下:

(gdb) print this->obj._M_ptr
$22 = (class martin::IFoo *) 0x7418

如果指针属于IBarIBaz,我真的想知道。

感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

  

如果指针属于IBaror和IBaz

,我真的想知道

GDB应该能够告诉你。使用(gdb) set print object on。文档here

  

显示指向对象的指针时,标识实际(派生)   使用虚拟对象的类型而不是声明的类型   功能表。请注意,虚拟功能表是必需的 - 这个   功能只适用于具有运行时类型的对象   识别;对象声明的类型中的单个虚方法   已经足够了。

更新

  

它只输出IFoo *接口

这可能意味着指针确实指向IFoo(例如,类型为IBarIBaz的对象已被破坏)。

  

使用dynamic_cast意味着

是的,没有RTTI,dynamic_cast无效;如果您使用的是dynamic_castprint object on应该可以使用。