2011-08-10 17 views
1

GDBマシンインタフェースを使用して、特定の変数の基本型を取得する方法はありますか?たとえば、型がuint32_t(types.hから)の変数を持っている場合、GDBにその変数の基本型が符号なしlong intか、あるいはuint32_tがtypedefされていることを伝える方法があります符号なしlong intに?GDB/MIを使用して変数の基本型を取得する方法

+0

FWIW、これは通常「基本タイプ」ではなく「基本タイプ」と呼ばれ、AFAIKです。申し訳ありませんが、答えはありません。 –

+1

Quibble: 'uint32_t'は、 ''または ''です。 –

答えて

8

あなたが "whatisは" コマンド

は、私は、GDB/MIについてほとんど知っているあなたは

typedef unsigned char BYTE; 
BYTE var; 

(gdb)whatis var 
type = BYTE 
(gdb)whatis BYTE 
BYTE = unsigned char 
0

があるとし使用することができます。次のハックは、MI '-interpreter-exec'コマンドから呼び出し可能な状態で、MIを回避するためにPythonを使用します。おそらくあなたが想像していたものではないでしょう。

私はMIのドキュメントでは何もわかりませんでした-var-info-typeはあなたが望むことをしていないようですが、これはバグ8143と似ています(またはバグ8143が実装されていれば可能です) :

http://sourceware.org/bugzilla/show_bug.cgi?id=8143

パート1:あなたはpythonで何をしたいんコマンドを実装します。

# TODO figure out how to do this without parsing the the normal gdb type = output 

class basetype (gdb.Command): 
    """prints the base type of expr""" 

    def __init__ (self): 
     super (basetype, self).__init__ ("basetype", gdb.COMMAND_OBSCURE); 

    def call_recursively_until_arg_eq_ret(self, arg): 
     x = arg.replace('type = ', "") 
     x = gdb.execute("whatis " + x, to_string=True) 
     if arg != x: 
      x = self.call_recursively_until_arg_eq_ret(x).replace('type = ', "") 
     return x 

    def invoke (self, arg, from_tty): 
     gdb.execute("ptype " + self.call_recursively_until_arg_eq_ret('type = ' + arg).replace('type = ', "")) 


basetype() 

パート2:コンソールインタプリタ

source ~/git/misc-gdb-stuff/misc_gdb/base_type.py 
&"source ~/git/misc-gdb-stuff/misc_gdb/base_type.py\n" 
^done 
-interpreter-exec console "basetype y" 
~"type = union foo_t {\n" 
~" int foo;\n" 
~" char *y;\n" 
~"}\n" 
^done 
-interpreter-exec console "whatis y" 
~"type = foo\n" 
^done 

パート3使用してそれを実行します。

お知らせパート2あなたの出力の全ての制限は標準出力ストリームに起こっています。それが受け入れられない場合は、gdbの2番目の出力チャンネルをインターフェイスで使用するためにフックし、Pythonで書き込むことができます。ツイスト・マトリックスやファイルを使用しています。

ここではツイストマトリックスを使用した例ですが、必要に応じて 'basetype'出力を指示するためにそれを切り替えてください。 https://gitorious.org/misc-gdb-stuff/misc-gdb-stuff/blobs/master/misc_gdb/twisted_gdb.py

そうでなければ、私が想定しているstdoutストリームを解析することができます。 希望があれば幸いです。

関連する問題