如何使用GDB / MI获取变量的基本类型

时间:2011-08-10 21:48:22

标签: c types gdb

使用GDB机器界面,有没有办法获得特定变量的基本类型?例如,如果我有一个类型为uint32_t的变量(来自types.h),有一种方法可以让GDB告诉我该变量的基本类型是unsigned long int,或者uint32_t是typedef'ed到一个unsigned long int?

2 个答案:

答案 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流,无论是黑客入侵黑客攻击。 希望有所帮助。