GDBマシンインタフェースを使用して、特定の変数の基本型を取得する方法はありますか?たとえば、型がuint32_t(types.hから)の変数を持っている場合、GDBにその変数の基本型が符号なしlong intか、あるいはuint32_tがtypedefされていることを伝える方法があります符号なしlong intに?GDB/MIを使用して変数の基本型を取得する方法
1
A
答えて
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ストリームを解析することができます。 希望があれば幸いです。
FWIW、これは通常「基本タイプ」ではなく「基本タイプ」と呼ばれ、AFAIKです。申し訳ありませんが、答えはありません。 –
Quibble: 'uint32_t'は、 ''または ''です。 –