2013-03-01 32 views
12

Javaでコードを書くときは、Eclipseに埋め込まれたデバッガを使用します。このコンテキストでオブジェクトを視覚化すると、デバッガはtoString()関数を自動的に呼び出します。この関数は、プログラムの状態を調べながら簡単に視覚化するのに便利です。C構造体のgdbプリント関数を定義する

私はCで作業するとき、デバッグにemacs + gdbを使用しますが、複雑なC構造を視覚化する(つまり特定の印刷機能を呼び出す)同等の機能を見つけ出したり再作成したりすることはできませんでした。もちろん、一般的なtoString()メソッドはありませんが、とにかく私は自分の構造の印刷機能をどこかに実装していることがよくあります。

しかし、私はgdbで何かを視覚化したいときは、gdbからp my_print_function(my_struct_pointer)という手作業でこれらの印刷機能を手動で呼び出す必要があります。名前を覚えて正しく入力してください。さらに、ウィンドウ...)。

私がしたい事は、「...構造体のポインタ型T上のgdbの印刷機能を呼び出すときに、 fを自動的にそのユーザー定義の印刷機能を呼び出す」言うためにgdbを設定することです。これを行う方法はありますか?前もって感謝します。

答えて

5

良い質問です。

はい、私は推測しています。 GDB 7は"pretty-printers" written in Pythonをサポートしているようです。実際のターゲット言語ですでに書かれたコードを使用するのと同じくらい便利ではない(私の意見では)が、おそらく十分です。

These are the commands pretty-printersでの作業に適しています。あなたは1行に1つのメンバーでインデント形式の構造を印刷するにはgdbをしたい場合は与えられた構造体

使用print *struct_ptrのメンバーを印刷する

+0

確かに便利ではありませんが、おそらく最も優れた既存のソリューションです。ありがとう。 – Hobbes

7

使用print struct_varは、与えられた構造体ポインタのメンバー

使用set print pretty onを印刷します

$1 = { 
     next = 0x0, 
     flags = { 
      sweet = 1, 
      sour = 1 
     }, 
     meat = 0x54 "Pork" 
     } 

ともあなたが与えられた構造体

の定義をプリントアウトする ptype struct_varを使用することができます。このような私はすべてのGDB/pythonのプリティプリントする理論を学ぶための時間がなかったものの

詳細here

1

は、私は、GDBの私のCプリンタを再利用するための簡単な方法を発見しました。 C関数に構造体 "struct_name_1" と "struct_name_2" をリンクする

例 "struct_printer_1_c_func" と "struct_printer_2_c_func":

1)

class Pstruct (gdb.Function): 
    """Returns a string describing a struct... 
    """ 

    def __init__ (self): 
    super (Pstruct, self).__init__ ("pstruct") 

    def invoke (self, name): 
     expr_type = name.dereference().type.tag 
     expr_string = name.__str__()    
     expr_address = expr_string.split(" ")[0]  
     if (cmp(expr_type, "struct_name_1") == 0): 
     return gdb.parse_and_eval("struct_printer_1_c_func("+ expr_address +")") 
     elif (cmp(expr_type, "struct_name_2") == 0): 
     return gdb.parse_and_eval("struct_printer_2_c_func("+ expr_address +")") 
     else: 
     print "[No struct printer for this type]" 
     return gdb.parse_and_eval(expr_address) 

Pstruct() 

2ファイルstruct_printers.pyを作成)を追加しますこれはあなたの.gdbinitに:あなたは、あなたが調べたい構造体へのポインタの前でGDBにあるとき

source struct_printers.py 

define pstruct 
p $pstruct($arg0) 
end 

はその後、代わりに印刷のpstructを呼び出します。

おそらく醜い、伸びが悪いかもしれませんが、私が必要としていたものの十分に機能します(しかし、私は誰かがpythonのきれいな印刷物でこれを行う正しい方法を知っていることを嬉しく思っています)。

関連する問題