首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过Python从GDB中的基类指针获取派生类信息

如何通过Python从GDB中的基类指针获取派生类信息
EN

Stack Overflow用户
提问于 2016-11-22 01:45:11
回答 1查看 1.7K关注 0票数 1

这是与如何确定对象是否是从指向GDB中基类的指针中派生的C++类的实例?相同的问题,但在Python中的gdb扩展中也要这样做。

在回答这个问题时,给出了同样的例子:

代码语言:javascript
复制
#include <iostream>

class MyBase {
public:
  virtual int myMethod() = 0;
};

class MyDerived1 : public MyBase {
public:
  virtual int myMethod() { return 1; }
};

class MyDerived2 : public MyBase {
public:
  virtual int myMethod() { return 2; }
};

int main() {
  MyBase *myBase;
  MyDerived1 myDerived1;
  MyDerived2 myDerived2;
  myBase = &myDerived1;
  std::cout << myBase->myMethod() << std::endl;
  myBase = &myDerived2;
  std::cout << myBase->myMethod() << std::endl;
}

正如答覆所述,我可以这样做:

代码语言:javascript
复制
(gdb) b 24
Breakpoint 1 at 0x400a19: file derived.cc, line 24.
(gdb) run
Starting program: /home/ubuntu/c-test/derived/derived
1

Breakpoint 1, main () at derived.cc:24
24        myBase = &myDerived2;
(gdb) p *myBase
$1 = {_vptr.MyBase = 0x400c00 <vtable for MyDerived1+16>}
(gdb) set print object on
(gdb) p *myBase
$2 = (MyDerived1) {<MyBase> = {_vptr.MyBase = 0x400c00 <vtable for MyDerived1+16>}, <No data fields>}

所以我可以看到这是MyDerived1的一个实例。但是在Python中,我得到了以下内容。

代码语言:javascript
复制
(gdb) python-interactive
>>> myBase = gdb.parse_and_eval("myBase")
>>> str(myBase.type)
'MyBase *'

如何在Python扩展中获得实际的类?这里的真正目标是能够将实例转换到右边的派生类,这样我就可以很好地打印特定于该派生类的信息。

EN

回答 1

Stack Overflow用户

发布于 2016-11-22 01:45:11

我可以使用属性dynamic_type作为文档化的这里

-变量: Value.dynamic_type 此gdb.Value的动态类型。这使用C++运行时类型信息来确定值的动态类型。如果这个值是类类型的,它将返回嵌入该值的类(如果有的话)。如果此值为指针或对类类型的引用,则它将计算引用对象的动态类型,并分别返回对该类型的指针或引用。在所有其他情况下,它将返回值的静态类型。 请注意,此特性仅在调试包含对所涉对象的RTTI的C++程序时才能工作。否则,它将返回值的静态类型,如ptype foo (参见ptype)。

因此,我可以通过以下方法获得派生类:

代码语言:javascript
复制
>>> str(myBase.dynamic_type)
'MyDerived1 *'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40732499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档