2016-11-22 15 views
0

これはHow to determine if an object is an instance of certain derived C++ class from a pointer to a base class in GDB?と同じ質問ですが、これはPythonのgdb拡張からも同じです。その質問への答えに示されているのと同じ例を考えるとGDBのベースクラスポインタからPython経由で派生クラス情報を取得する方法

:応答で述べたように

#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拡張モジュールで実際のクラスを取得するにはどうすればよいですか?実際の目的は、インスタンスを正しい派生クラスにキャストできるようにすることです。その派生クラスに固有の情報をきれいに印刷できます。

答えて

0

私は文書化さhereとして属性dynamic_typeを使用することができます。

- 変数:Value.dynamic_type

このgdb.Valueの動的な型。これは、C++ランタイムタイプ 情報(RTTI)を使用して、値の動的タイプを判別します。この の値がクラス型である場合、値が に埋め込まれているクラスがあればそれを返します。この値がクラス のクラスへのポインタまたは参照の場合、参照されるオブジェクトの動的型が計算され、 はそれぞれその型へのポインタまたは参照を返します。他のすべての のケースでは、値の静的型が返されます。

この機能は、問題のオブジェクトのRTTIを含むC++プログラム をデバッグする場合にのみ機能することに注意してください。それ以外の場合は、 のptype foo(ptypeを参照)のように、値の静的型を返します。

>>> str(myBase.dynamic_type) 
'MyDerived1 *' 

だから、私は、派生クラスを取得することができます

関連する問題