使用GDB机器界面,有没有办法获得特定变量的基本类型?例如,如果我有一个类型为uint32_t的变量(来自types.h),有一种方法可以让GDB告诉我该变量的基本类型是unsigned long int,或者uint32_t是typedef'ed到一个unsigned long int?
答案 0 :(得分:9)
您可以使用“whatis”命令
假设你有
typedef unsigned char BYTE;
BYTE var;
(gdb)whatis var
type = BYTE
(gdb)whatis BYTE
BYTE = unsigned char
答案 1 :(得分:0)
我对gdb / mi知之甚少;以下hacks使用python来回避MI,同时可以从MI' -interpreter-exec'命令调用。可能不是你想象的那样。
我没有在MI文档中看到任何明显的东西-var-info-type似乎没有做你想要的,这类似于bug 8143(或者我应该说如果bug 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部分的所有输出的限制都是转到stdout流。如果这是不可接受的,你可以从gdb挂起打开第二个输出通道,用于你的接口并用python写入它。使用扭曲矩阵或文件之类的东西。
这是一个使用扭曲矩阵的示例,您只需将其切换为指向所需的“basetype”输出。 https://gitorious.org/misc-gdb-stuff/misc-gdb-stuff/blobs/master/misc_gdb/twisted_gdb.py
否则你可以解析我认为的stdout流,无论是黑客入侵黑客攻击。 希望有所帮助。