这是与如何确定对象是否是从指向GDB中基类的指针中派生的C++类的实例?相同的问题,但在Python中的gdb扩展中也要这样做。
在回答这个问题时,给出了同样的例子:
#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;
}正如答覆所述,我可以这样做:
(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中,我得到了以下内容。
(gdb) python-interactive
>>> myBase = gdb.parse_and_eval("myBase")
>>> str(myBase.type)
'MyBase *'如何在Python扩展中获得实际的类?这里的真正目标是能够将实例转换到右边的派生类,这样我就可以很好地打印特定于该派生类的信息。
发布于 2016-11-22 01:45:11
我可以使用属性dynamic_type作为文档化的这里:
-变量: Value.dynamic_type 此gdb.Value的动态类型。这使用C++运行时类型信息来确定值的动态类型。如果这个值是类类型的,它将返回嵌入该值的类(如果有的话)。如果此值为指针或对类类型的引用,则它将计算引用对象的动态类型,并分别返回对该类型的指针或引用。在所有其他情况下,它将返回值的静态类型。 请注意,此特性仅在调试包含对所涉对象的RTTI的C++程序时才能工作。否则,它将返回值的静态类型,如ptype foo (参见ptype)。
因此,我可以通过以下方法获得派生类:
>>> str(myBase.dynamic_type)
'MyDerived1 *'https://stackoverflow.com/questions/40732499
复制相似问题