2012-01-18 12 views
4

GDBに構造体があり、この構造体を調べるスクリプトを実行したいと考えています。 PythonのGDBでは、簡単にPython GDBのキーまたは値にアクセスする方法値

(gdb) python mystruct = gdb.parse_and_eval("mystruct") 

を経由して構造体にアクセスすることができます今、私はGDB.Valueオブジェクトである。この変数mystructというのです。そして、このオブジェクトを辞書(単にmystruct['member']のように)として使うだけで、構造体のすべてのメンバーにアクセスできます。

問題は、私のスクリプトでは、特定の構造体にどのメンバーがあるかわからないということです。そこで、このGDB.Valueオブジェクトからキー(または値)を取得したかったのです。しかし、mystruct.values()mystruct.keys()もここでは働いていません。

この情報へのアクセスはできませんか?私はあなたがこの情報にアクセスすることは非常にありそうにないと思うが、私はそれをどこにも見つけられなかった。 A dir(mystruct)には、キーや値の機能もないことがわかりました。 mystructを印刷することですべてのメンバーを見ることができますが、メンバーをPythonで入手する方法はありませんか?

答えて

4

GDB documentationから:

あなたはとても似mystructの種類を取得することができます:tp.fields()

経由

tp = mystruct.type 

fieldsを反復処理します邪悪な回避策は必要ありません;-)

更新: GDB 7.4がリリースされました。

構造体と共用のタイプの

Typeオブジェクトは、現在の標準的なPythonの辞書(マッピング)メソッドを使用して フィールドへのアクセスを許可する:announcementから。

+0

更新いただきありがとうございます! :) – Uhlo

1

バイオハザードの回避策:

python print eval("dict(" + str(mystruct)[1:-2] + ")") 

これは一般化である場合、私は知りません。デモとして、私は今、私はいつものようにg++ -g test.cpp -o testを実行し、gdb testを起動し、最小限の例test.cpp

#include <iostream> 

struct mystruct 
{ 
    int i; 
    double x; 
} mystruct_1; 

int main() 
{ 
    mystruct_1.i = 2; 
    mystruct_1.x = 1.242; 
    std::cout << "Blarz"; 
    std::cout << std::endl; 
} 

を書きました。ここでは例セッションのトランスクリプトは次のとおりです。

(gdb) break main 
Breakpoint 1 at 0x400898: file test.cpp, line 11. 
(gdb) run 
Starting program: ... 

Breakpoint 1, main() at test.cpp:11 
11  mystruct_1.i = 2; 
(gdb) step 
12  mystruct_1.x = 1.242; 
(gdb) step 
13  std::cout << "Blarz"; 
(gdb) python mystruct = gdb.parse_and_eval("mystruct_1") 
(gdb) python print mystruct 
{i = 2, x = 1.242} 
(gdb) python print eval("dict(" + str(mystruct)[1:-2] + ")") 
{'i': 2, 'x': 1.24} 
(gdb) python print eval("dict(" + str(mystruct)[1:-2] + ")").keys() 
['i', 'x'] 
+0

この回避策をお寄せいただきありがとうございます。悲しいことに、内部に文字列や他の構造体がある構造体では機能しません。だから、この解決法は必ずしも機能しません! – Uhlo

関連する問題